[2299] | 1 | MODULE dynredem_mod |
---|
| 2 | |
---|
[5128] | 3 | USE netcdf, ONLY: nf90_strerror, nf90_noerr, nf90_redef, nf90_put_var, nf90_enddef, nf90_put_att, & |
---|
| 4 | nf90_inq_varid, nf90_get_var, nf90_def_var |
---|
[5090] | 5 | USE lmdz_cppkeys_wrapper, ONLY: nf90_format |
---|
[5159] | 6 | USE lmdz_dimensions, ONLY: iim, jjm, llm, ndm |
---|
| 7 | USE lmdz_paramet |
---|
[5069] | 8 | IMPLICIT NONE; PRIVATE |
---|
[2299] | 9 | PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err |
---|
[5060] | 10 | PUBLIC :: cre_var, put_var1, put_var2, fil, modname, msg |
---|
[5159] | 11 | |
---|
| 12 | |
---|
[5128] | 13 | CHARACTER(LEN = 256), SAVE :: fil, modname |
---|
| 14 | INTEGER, SAVE :: nvarid |
---|
[2299] | 15 | |
---|
| 16 | |
---|
| 17 | CONTAINS |
---|
| 18 | |
---|
| 19 | |
---|
[5128] | 20 | !=============================================================================== |
---|
[5099] | 21 | |
---|
[5128] | 22 | SUBROUTINE dynredem_write_u(ncid, id, var, ll) |
---|
[5099] | 23 | |
---|
[5128] | 24 | !=============================================================================== |
---|
| 25 | ! Arguments: |
---|
| 26 | INTEGER, INTENT(IN) :: ncid |
---|
| 27 | CHARACTER(LEN = *), INTENT(IN) :: id |
---|
| 28 | REAL, INTENT(IN) :: var(iip1, jjp1, ll) |
---|
| 29 | INTEGER, INTENT(IN) :: ll |
---|
| 30 | !=============================================================================== |
---|
| 31 | ! Local variables: |
---|
| 32 | INTEGER :: start(4), count(4) |
---|
| 33 | !=============================================================================== |
---|
| 34 | start(:) = [1, 1, 1, 1]; count(:) = [iip1, jjp1, ll, 1] |
---|
| 35 | CALL err(nf90_inq_varid(ncid, id, nvarid), "inq", id) |
---|
| 36 | CALL err(nf90_put_var(ncid, nvarid, var, start, count), "put", id) |
---|
[5099] | 37 | |
---|
[5128] | 38 | END SUBROUTINE dynredem_write_u |
---|
[2299] | 39 | |
---|
[5128] | 40 | !=============================================================================== |
---|
[2299] | 41 | |
---|
[5099] | 42 | |
---|
[5128] | 43 | !=============================================================================== |
---|
[5099] | 44 | |
---|
[5128] | 45 | SUBROUTINE dynredem_write_v(ncid, id, var, ll) |
---|
[5099] | 46 | |
---|
[5128] | 47 | !=============================================================================== |
---|
| 48 | ! Arguments: |
---|
| 49 | INTEGER, INTENT(IN) :: ncid |
---|
| 50 | CHARACTER(LEN = *), INTENT(IN) :: id |
---|
| 51 | REAL, INTENT(IN) :: var(iip1, jjm, ll) |
---|
| 52 | INTEGER, INTENT(IN) :: ll |
---|
| 53 | !=============================================================================== |
---|
| 54 | ! Local variables: |
---|
| 55 | INTEGER :: start(4), count(4) |
---|
| 56 | !=============================================================================== |
---|
| 57 | start(:) = [1, 1, 1, 1]; count(:) = [iip1, jjm, ll, 1] |
---|
| 58 | CALL err(nf90_inq_varid(ncid, id, nvarid), "inq", id) |
---|
| 59 | CALL err(nf90_put_var(ncid, nvarid, var, start, count), "put", id) |
---|
[2299] | 60 | |
---|
[5128] | 61 | END SUBROUTINE dynredem_write_v |
---|
[2299] | 62 | |
---|
[5128] | 63 | !=============================================================================== |
---|
[5099] | 64 | |
---|
| 65 | |
---|
[5128] | 66 | !=============================================================================== |
---|
[5099] | 67 | |
---|
[5128] | 68 | SUBROUTINE dynredem_read_u(ncid, id, var, ll) |
---|
[2299] | 69 | |
---|
[5128] | 70 | !=============================================================================== |
---|
| 71 | ! Arguments: |
---|
| 72 | INTEGER, INTENT(IN) :: ncid |
---|
| 73 | CHARACTER(LEN = *), INTENT(IN) :: id |
---|
| 74 | REAL, INTENT(OUT) :: var(iip1, jjp1, ll) |
---|
| 75 | INTEGER, INTENT(IN) :: ll |
---|
| 76 | !=============================================================================== |
---|
| 77 | ! Local variables: |
---|
| 78 | INTEGER :: start(4), count(4) |
---|
| 79 | !=============================================================================== |
---|
| 80 | start(:) = [1, 1, 1, 1]; count(:) = [iip1, jjp1, ll, 1] |
---|
| 81 | CALL err(nf90_inq_varid(ncid, id, nvarid), "inq", id) |
---|
| 82 | CALL err(nf90_get_var(ncid, nvarid, var, start, count), "get", id) |
---|
[2299] | 83 | |
---|
[5128] | 84 | END SUBROUTINE dynredem_read_u |
---|
[5099] | 85 | |
---|
[5128] | 86 | !=============================================================================== |
---|
[5099] | 87 | |
---|
[2299] | 88 | |
---|
[5128] | 89 | !=============================================================================== |
---|
[5099] | 90 | |
---|
[5128] | 91 | SUBROUTINE cre_var(ncid, var, title, did, units) |
---|
[2299] | 92 | |
---|
[5128] | 93 | !=============================================================================== |
---|
| 94 | ! Arguments: |
---|
| 95 | INTEGER, INTENT(IN) :: ncid |
---|
| 96 | CHARACTER(LEN = *), INTENT(IN) :: var, title |
---|
| 97 | INTEGER, INTENT(IN) :: did(:) |
---|
| 98 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: units |
---|
| 99 | !=============================================================================== |
---|
| 100 | CALL err(nf90_def_var(ncid, var, nf90_format, did, nvarid), "inq", var) |
---|
| 101 | IF(title/="") CALL err(nf90_put_att(ncid, nvarid, "title", title), var) |
---|
| 102 | IF(PRESENT(units)) CALL err(nf90_put_att(ncid, nvarid, "units", units), var) |
---|
[2299] | 103 | |
---|
[5128] | 104 | END SUBROUTINE cre_var |
---|
[5099] | 105 | |
---|
[5128] | 106 | !=============================================================================== |
---|
[5099] | 107 | |
---|
[2299] | 108 | |
---|
[5128] | 109 | !=============================================================================== |
---|
[5099] | 110 | |
---|
[5128] | 111 | SUBROUTINE put_var1(ncid, var, title, did, v, units) |
---|
[2299] | 112 | |
---|
[5128] | 113 | !=============================================================================== |
---|
| 114 | ! Arguments: |
---|
| 115 | INTEGER, INTENT(IN) :: ncid |
---|
| 116 | CHARACTER(LEN = *), INTENT(IN) :: var, title |
---|
| 117 | INTEGER, INTENT(IN) :: did(1) |
---|
| 118 | REAL, INTENT(IN) :: v(:) |
---|
| 119 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: units |
---|
| 120 | !=============================================================================== |
---|
| 121 | IF(PRESENT(units)) CALL cre_var(ncid, var, title, did, units) |
---|
| 122 | IF(.NOT.PRESENT(units)) CALL cre_var(ncid, var, title, did) |
---|
| 123 | CALL err(nf90_enddef(ncid)) |
---|
| 124 | CALL err(nf90_put_var(ncid, nvarid, v), "put", var) |
---|
| 125 | CALL err(nf90_redef(ncid)) |
---|
[2299] | 126 | |
---|
[5128] | 127 | END SUBROUTINE put_var1 |
---|
[5099] | 128 | |
---|
[5128] | 129 | !=============================================================================== |
---|
[5099] | 130 | |
---|
[2299] | 131 | |
---|
[5128] | 132 | !=============================================================================== |
---|
[5099] | 133 | |
---|
[5128] | 134 | SUBROUTINE put_var2(ncid, var, title, did, v, units) |
---|
[2299] | 135 | |
---|
[5128] | 136 | !=============================================================================== |
---|
| 137 | ! Arguments: |
---|
| 138 | INTEGER, INTENT(IN) :: ncid |
---|
| 139 | CHARACTER(LEN = *), INTENT(IN) :: var, title |
---|
| 140 | INTEGER, INTENT(IN) :: did(2) |
---|
| 141 | REAL, INTENT(IN) :: v(:, :) |
---|
| 142 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: units |
---|
| 143 | !=============================================================================== |
---|
| 144 | IF(PRESENT(units)) CALL cre_var(ncid, var, title, did, units) |
---|
| 145 | IF(.NOT.PRESENT(units)) CALL cre_var(ncid, var, title, did) |
---|
| 146 | CALL err(nf90_enddef(ncid)) |
---|
| 147 | CALL err(nf90_put_var(ncid, nvarid, v), "put", var) |
---|
| 148 | CALL err(nf90_redef(ncid)) |
---|
[2299] | 149 | |
---|
[5128] | 150 | END SUBROUTINE put_var2 |
---|
[5099] | 151 | |
---|
[5128] | 152 | !=============================================================================== |
---|
[5099] | 153 | |
---|
[2299] | 154 | |
---|
[5128] | 155 | !=============================================================================== |
---|
[5099] | 156 | |
---|
[5128] | 157 | FUNCTION msg(typ, nam) |
---|
[2299] | 158 | |
---|
[5128] | 159 | !=============================================================================== |
---|
| 160 | ! Arguments: |
---|
| 161 | CHARACTER(LEN = 256) :: msg !--- STANDARDIZED MESSAGE |
---|
| 162 | CHARACTER(LEN = *), INTENT(IN) :: typ !--- TYPE OF OPERATION |
---|
| 163 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: nam !--- FIELD NAME |
---|
| 164 | !=============================================================================== |
---|
| 165 | SELECT CASE(typ) |
---|
| 166 | CASE('open'); msg = "Opening failed for <" // TRIM(fil) // ">" |
---|
| 167 | CASE('close'); msg = "Closing failed for <" // TRIM(fil) // ">" |
---|
| 168 | CASE('get'); msg = "Reading failed for <" // TRIM(nam) // ">" |
---|
| 169 | CASE('put'); msg = "Writting failed for <" // TRIM(nam) // ">" |
---|
| 170 | CASE('inq'); msg = "Missing field <" // TRIM(nam) // ">" |
---|
| 171 | CASE('fnd'); msg = "Found field <" // TRIM(nam) // ">" |
---|
| 172 | END SELECT |
---|
| 173 | msg = TRIM(msg) // " in file <" // TRIM(fil) // ">" |
---|
[2299] | 174 | |
---|
[5128] | 175 | END FUNCTION msg |
---|
[5099] | 176 | |
---|
[5128] | 177 | !=============================================================================== |
---|
[5099] | 178 | |
---|
[2299] | 179 | |
---|
[5128] | 180 | !=============================================================================== |
---|
[5099] | 181 | |
---|
[5128] | 182 | SUBROUTINE err(ierr, typ, nam) |
---|
[2299] | 183 | |
---|
[5128] | 184 | !=============================================================================== |
---|
| 185 | ! Arguments: |
---|
| 186 | INTEGER, INTENT(IN) :: ierr !--- NetCDF ERROR CODE |
---|
| 187 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: typ !--- TYPE OF OPERATION |
---|
| 188 | CHARACTER(LEN = *), OPTIONAL, INTENT(IN) :: nam !--- FIELD NAME |
---|
| 189 | !=============================================================================== |
---|
| 190 | IF(ierr==nf90_noerr) RETURN |
---|
| 191 | IF(.NOT.PRESENT(typ)) THEN |
---|
| 192 | CALL ABORT_gcm(modname, nf90_strerror(ierr), ierr) |
---|
| 193 | ELSE |
---|
| 194 | CALL ABORT_gcm(modname, msg(typ, nam), ierr) |
---|
| 195 | END IF |
---|
| 196 | |
---|
| 197 | END SUBROUTINE err |
---|
| 198 | |
---|
| 199 | !=============================================================================== |
---|
| 200 | |
---|
[2299] | 201 | END MODULE dynredem_mod |
---|
| 202 | |
---|
| 203 | |
---|