| 1 | MODULE dynredem_mod | 
|---|
| 2 |  | 
|---|
| 3 |   USE netcdf, ONLY: NF90_NOERR, NF90_DOUBLE, NF90_STRERROR, & | 
|---|
| 4 |                     NF90_REDEF, NF90_ENDDEF, NF90_PUT_VAR, & | 
|---|
| 5 |                     NF90_PUT_ATT, NF90_GET_VAR, NF90_INQ_VARID, & | 
|---|
| 6 |                     NF90_DEF_VAR | 
|---|
| 7 |   PRIVATE | 
|---|
| 8 |   PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err | 
|---|
| 9 |   PUBLIC :: cre_var, get_var1, put_var1, put_var2, fil, modname, msg | 
|---|
| 10 |   include "dimensions.h" | 
|---|
| 11 |   include "paramet.h" | 
|---|
| 12 |   CHARACTER(LEN=256), SAVE :: fil, modname | 
|---|
| 13 |   INTEGER,            SAVE :: nvarid | 
|---|
| 14 |  | 
|---|
| 15 |  | 
|---|
| 16 | CONTAINS | 
|---|
| 17 |  | 
|---|
| 18 |  | 
|---|
| 19 | !=============================================================================== | 
|---|
| 20 | ! | 
|---|
| 21 | SUBROUTINE dynredem_write_u(ncid,id,var,ll,nb) | 
|---|
| 22 | ! | 
|---|
| 23 | !=============================================================================== | 
|---|
| 24 |   IMPLICIT NONE | 
|---|
| 25 | !=============================================================================== | 
|---|
| 26 | ! Arguments: | 
|---|
| 27 |   INTEGER,          INTENT(IN) :: ncid | 
|---|
| 28 |   CHARACTER(LEN=*), INTENT(IN) :: id | 
|---|
| 29 |   REAL,             INTENT(IN) :: var(iip1,jjp1,ll) | 
|---|
| 30 |   INTEGER,          INTENT(IN) :: ll | 
|---|
| 31 |   INTEGER,          INTENT(IN) :: nb | 
|---|
| 32 | !=============================================================================== | 
|---|
| 33 | ! Local variables: | 
|---|
| 34 |   INTEGER :: start(4), count(4) | 
|---|
| 35 | !=============================================================================== | 
|---|
| 36 |   IF (ll.eq.1) THEN | 
|---|
| 37 |     start(:)=[1,1,nb,1] | 
|---|
| 38 |     count(:)=[iip1,jjp1,1,1] | 
|---|
| 39 |   ELSE | 
|---|
| 40 |     start(:)=[1,1,1,nb] | 
|---|
| 41 |     count(:)=[iip1,jjp1,ll,1] | 
|---|
| 42 |   ENDIF | 
|---|
| 43 |   CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id) | 
|---|
| 44 |   CALL err(NF90_PUT_VAR(ncid,nvarid,var,start,count),"put",id) | 
|---|
| 45 |    | 
|---|
| 46 | END SUBROUTINE dynredem_write_u | 
|---|
| 47 | ! | 
|---|
| 48 | !=============================================================================== | 
|---|
| 49 |  | 
|---|
| 50 |  | 
|---|
| 51 | !=============================================================================== | 
|---|
| 52 | ! | 
|---|
| 53 | SUBROUTINE dynredem_write_v(ncid,id,var,ll,nb) | 
|---|
| 54 | ! | 
|---|
| 55 | !=============================================================================== | 
|---|
| 56 |   IMPLICIT NONE | 
|---|
| 57 | !=============================================================================== | 
|---|
| 58 | ! Arguments: | 
|---|
| 59 |   INTEGER,          INTENT(IN) :: ncid | 
|---|
| 60 |   CHARACTER(LEN=*), INTENT(IN) :: id | 
|---|
| 61 |   REAL,             INTENT(IN) :: var(iip1,jjm,ll) | 
|---|
| 62 |   INTEGER,          INTENT(IN) :: ll | 
|---|
| 63 |   INTEGER,          INTENT(IN) :: nb | 
|---|
| 64 | !=============================================================================== | 
|---|
| 65 | ! Local variables: | 
|---|
| 66 |   INTEGER :: start(4), count(4) | 
|---|
| 67 | !=============================================================================== | 
|---|
| 68 |   IF (ll.eq.1) THEN | 
|---|
| 69 |     start(:)=[1,1,nb,1] | 
|---|
| 70 |     count(:)=[iip1,jjm,1,1] | 
|---|
| 71 |   ELSE | 
|---|
| 72 |     start(:)=[1,1,1,nb] | 
|---|
| 73 |     count(:)=[iip1,jjm,ll,1] | 
|---|
| 74 |   ENDIF | 
|---|
| 75 |   CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id) | 
|---|
| 76 |   CALL err(NF90_PUT_VAR(ncid,nvarid,var,start,count),"put",id) | 
|---|
| 77 |    | 
|---|
| 78 | END SUBROUTINE dynredem_write_v | 
|---|
| 79 | ! | 
|---|
| 80 | !=============================================================================== | 
|---|
| 81 |  | 
|---|
| 82 |  | 
|---|
| 83 | !=============================================================================== | 
|---|
| 84 | ! | 
|---|
| 85 | SUBROUTINE dynredem_read_u(ncid,id,var,ll) | 
|---|
| 86 | ! | 
|---|
| 87 | !=============================================================================== | 
|---|
| 88 |   IMPLICIT NONE | 
|---|
| 89 | !=============================================================================== | 
|---|
| 90 | ! Arguments: | 
|---|
| 91 |   INTEGER,          INTENT(IN)  :: ncid | 
|---|
| 92 |   CHARACTER(LEN=*), INTENT(IN)  :: id | 
|---|
| 93 |   REAL,             INTENT(OUT) :: var(iip1,jjp1,ll) | 
|---|
| 94 |   INTEGER,          INTENT(IN)  :: ll | 
|---|
| 95 | !=============================================================================== | 
|---|
| 96 | ! Local variables: | 
|---|
| 97 |   INTEGER :: start(4), count(4) | 
|---|
| 98 | !=============================================================================== | 
|---|
| 99 |   start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,ll,1] | 
|---|
| 100 |   CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id) | 
|---|
| 101 |   CALL err(NF90_GET_VAR(ncid,nvarid,var,start,count),"get",id) | 
|---|
| 102 |    | 
|---|
| 103 | END SUBROUTINE dynredem_read_u     | 
|---|
| 104 | ! | 
|---|
| 105 | !=============================================================================== | 
|---|
| 106 |  | 
|---|
| 107 |  | 
|---|
| 108 | !=============================================================================== | 
|---|
| 109 | ! | 
|---|
| 110 | SUBROUTINE cre_var(ncid,var,title,did,units) | 
|---|
| 111 | ! | 
|---|
| 112 | !=============================================================================== | 
|---|
| 113 |   IMPLICIT NONE | 
|---|
| 114 | !=============================================================================== | 
|---|
| 115 | ! Arguments: | 
|---|
| 116 |   INTEGER,                    INTENT(IN) :: ncid | 
|---|
| 117 |   CHARACTER(LEN=*),           INTENT(IN) :: var, title | 
|---|
| 118 |   INTEGER,                    INTENT(IN) :: did(:) | 
|---|
| 119 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units | 
|---|
| 120 | !=============================================================================== | 
|---|
| 121 | #ifdef NC_DOUBLE | 
|---|
| 122 |   CALL err(NF90_DEF_VAR(ncid,var,NF90_DOUBLE,did,nvarid),"inq",var) | 
|---|
| 123 | #else | 
|---|
| 124 |   CALL err(NF90_DEF_VAR(ncid,var,NF90_FLOAT ,did,nvarid),"inq",var) | 
|---|
| 125 | #endif | 
|---|
| 126 |   IF(title/="")      CALL err(NF90_PUT_ATT(ncid,nvarid,"title",title),var) | 
|---|
| 127 |   IF(PRESENT(units)) CALL err(NF90_PUT_ATT(ncid,nvarid,"units",units),var) | 
|---|
| 128 |  | 
|---|
| 129 | END SUBROUTINE cre_var | 
|---|
| 130 | ! | 
|---|
| 131 | !=============================================================================== | 
|---|
| 132 |  | 
|---|
| 133 |  | 
|---|
| 134 | !=============================================================================== | 
|---|
| 135 | ! | 
|---|
| 136 | SUBROUTINE put_var1(ncid,var,title,did,v,units) | 
|---|
| 137 | ! | 
|---|
| 138 | !=============================================================================== | 
|---|
| 139 |   IMPLICIT NONE | 
|---|
| 140 | !=============================================================================== | 
|---|
| 141 | ! Arguments: | 
|---|
| 142 |   INTEGER,                    INTENT(IN) :: ncid | 
|---|
| 143 |   CHARACTER(LEN=*),           INTENT(IN) :: var, title | 
|---|
| 144 |   INTEGER,                    INTENT(IN) :: did(1) | 
|---|
| 145 |   REAL,                       INTENT(IN) :: v(:) | 
|---|
| 146 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units | 
|---|
| 147 | !=============================================================================== | 
|---|
| 148 |   IF(     PRESENT(units)) CALL cre_var(ncid,var,title,did,units) | 
|---|
| 149 |   IF(.NOT.PRESENT(units)) CALL cre_var(ncid,var,title,did) | 
|---|
| 150 |   CALL err(NF90_ENDDEF(ncid)) | 
|---|
| 151 |   CALL err(NF90_PUT_VAR(ncid,nvarid,v),"put",var) | 
|---|
| 152 |   CALL err(NF90_REDEF(ncid)) | 
|---|
| 153 |  | 
|---|
| 154 | END SUBROUTINE put_var1 | 
|---|
| 155 | ! | 
|---|
| 156 | !=============================================================================== | 
|---|
| 157 |  | 
|---|
| 158 |  | 
|---|
| 159 | !=============================================================================== | 
|---|
| 160 | ! | 
|---|
| 161 | SUBROUTINE put_var2(ncid,var,title,did,v,units) | 
|---|
| 162 | ! | 
|---|
| 163 | !=============================================================================== | 
|---|
| 164 |   IMPLICIT NONE | 
|---|
| 165 | !=============================================================================== | 
|---|
| 166 | ! Arguments: | 
|---|
| 167 |   INTEGER,                    INTENT(IN) :: ncid | 
|---|
| 168 |   CHARACTER(LEN=*),           INTENT(IN) :: var, title | 
|---|
| 169 |   INTEGER,                    INTENT(IN) :: did(2) | 
|---|
| 170 |   REAL,                       INTENT(IN) :: v(:,:) | 
|---|
| 171 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units | 
|---|
| 172 | !=============================================================================== | 
|---|
| 173 |   IF(     PRESENT(units)) CALL cre_var(ncid,var,title,did,units) | 
|---|
| 174 |   IF(.NOT.PRESENT(units)) CALL cre_var(ncid,var,title,did) | 
|---|
| 175 |   CALL err(NF90_ENDDEF(ncid)) | 
|---|
| 176 |   CALL err(NF90_PUT_VAR(ncid,nvarid,v),"put",var) | 
|---|
| 177 |   CALL err(NF90_REDEF(ncid)) | 
|---|
| 178 |  | 
|---|
| 179 | END SUBROUTINE put_var2 | 
|---|
| 180 | ! | 
|---|
| 181 | !=============================================================================== | 
|---|
| 182 |  | 
|---|
| 183 |  | 
|---|
| 184 | !=============================================================================== | 
|---|
| 185 | ! | 
|---|
| 186 | FUNCTION msg(typ,nam) | 
|---|
| 187 | ! | 
|---|
| 188 | !=============================================================================== | 
|---|
| 189 |   IMPLICIT NONE | 
|---|
| 190 | !=============================================================================== | 
|---|
| 191 | ! Arguments: | 
|---|
| 192 |   CHARACTER(LEN=256)                     :: msg    !--- STANDARDIZED MESSAGE | 
|---|
| 193 |   CHARACTER(LEN=*),           INTENT(IN) :: typ    !--- TYPE OF OPERATION | 
|---|
| 194 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME | 
|---|
| 195 | !=============================================================================== | 
|---|
| 196 |   SELECT CASE(typ) | 
|---|
| 197 |     CASE('open');  msg="Opening failed for <"//TRIM(fil)//">" | 
|---|
| 198 |     CASE('close'); msg="Closing failed for <"//TRIM(fil)//">" | 
|---|
| 199 |     CASE('get');   msg="Reading failed for <"//TRIM(nam)//">" | 
|---|
| 200 |     CASE('put');   msg="Writting failed for <"//TRIM(nam)//">" | 
|---|
| 201 |     CASE('inq');   msg="Missing field <"//TRIM(nam)//">" | 
|---|
| 202 |     CASE('fnd');   msg="Found field <"//TRIM(nam)//">" | 
|---|
| 203 |   END SELECT | 
|---|
| 204 |   msg=TRIM(msg)//" in file <"//TRIM(fil)//">" | 
|---|
| 205 |  | 
|---|
| 206 | END FUNCTION msg | 
|---|
| 207 | ! | 
|---|
| 208 | !=============================================================================== | 
|---|
| 209 |  | 
|---|
| 210 |  | 
|---|
| 211 | !=============================================================================== | 
|---|
| 212 | ! | 
|---|
| 213 | SUBROUTINE err(ierr,typ,nam) | 
|---|
| 214 | ! | 
|---|
| 215 | !=============================================================================== | 
|---|
| 216 |   IMPLICIT NONE | 
|---|
| 217 | !=============================================================================== | 
|---|
| 218 | ! Arguments: | 
|---|
| 219 |   INTEGER,                    INTENT(IN) :: ierr   !--- NetCDF ERROR CODE | 
|---|
| 220 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: typ    !--- TYPE OF OPERATION | 
|---|
| 221 |   CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME | 
|---|
| 222 | !=============================================================================== | 
|---|
| 223 |   IF(ierr==NF90_NoERR) RETURN | 
|---|
| 224 |   IF(.NOT.PRESENT(typ)) THEN | 
|---|
| 225 |     CALL ABORT_gcm(modname,NF90_STRERROR(ierr),ierr) | 
|---|
| 226 |   ELSE | 
|---|
| 227 |     CALL ABORT_gcm(modname,msg(typ,nam),ierr) | 
|---|
| 228 |   END IF | 
|---|
| 229 |  | 
|---|
| 230 | END SUBROUTINE err | 
|---|
| 231 | ! | 
|---|
| 232 | !=============================================================================== | 
|---|
| 233 |  | 
|---|
| 234 | END MODULE dynredem_mod    | 
|---|