Changeset 12603 for NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/IOM
- Timestamp:
- 2020-03-25T16:20:25+01:00 (10 months ago)
- Location:
- NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/IOM
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/IOM/iom.F90
r12546 r12603 59 59 PUBLIC iom_use, iom_context_finalize, iom_update_file_name, iom_miss_val 60 60 61 PRIVATE iom_rp0d, iom_rp1d, iom_rp2d, iom_rp3d 62 PRIVATE iom_g0d, iom_g1d, iom_g2d, iom_g3d, iom_get_123d 63 PRIVATE iom_p1d, iom_p2d, iom_p3d, iom_p4d 61 PRIVATE iom_rp0d_sp, iom_rp1d_sp, iom_rp2d_sp, iom_rp3d_sp 62 PRIVATE iom_rp0d_dp, iom_rp1d_dp, iom_rp2d_dp, iom_rp3d_dp 63 PRIVATE iom_get_123d 64 PRIVATE iom_g0d_sp, iom_g1d_sp, iom_g2d_sp, iom_g3d_sp 65 PRIVATE iom_g0d_dp, iom_g1d_dp, iom_g2d_dp, iom_g3d_dp 66 PRIVATE iom_p1d_sp, iom_p2d_sp, iom_p3d_sp, iom_p4d_sp 67 PRIVATE iom_p1d_dp, iom_p2d_dp, iom_p3d_dp, iom_p4d_dp 64 68 #if defined key_iomput 65 69 PRIVATE iom_set_domain_attr, iom_set_axis_attr, iom_set_field_attr, iom_set_file_attr, iom_get_file_attr, iom_set_grid_attr … … 70 74 71 75 INTERFACE iom_get 72 MODULE PROCEDURE iom_g0d, iom_g1d, iom_g2d, iom_g3d 76 MODULE PROCEDURE iom_g0d_sp, iom_g1d_sp, iom_g2d_sp, iom_g3d_sp 77 MODULE PROCEDURE iom_g0d_dp, iom_g1d_dp, iom_g2d_dp, iom_g3d_dp 73 78 END INTERFACE 74 79 INTERFACE iom_getatt … … 79 84 END INTERFACE 80 85 INTERFACE iom_rstput 81 MODULE PROCEDURE iom_rp0d, iom_rp1d, iom_rp2d, iom_rp3d 86 MODULE PROCEDURE iom_rp0d_sp, iom_rp1d_sp, iom_rp2d_sp, iom_rp3d_sp 87 MODULE PROCEDURE iom_rp0d_dp, iom_rp1d_dp, iom_rp2d_dp, iom_rp3d_dp 82 88 END INTERFACE 83 89 INTERFACE iom_put 84 MODULE PROCEDURE iom_p0d, iom_p1d, iom_p2d, iom_p3d, iom_p4d 90 MODULE PROCEDURE iom_p0d_sp, iom_p1d_sp, iom_p2d_sp, iom_p3d_sp, iom_p4d_sp 91 MODULE PROCEDURE iom_p0d_dp, iom_p1d_dp, iom_p2d_dp, iom_p3d_dp, iom_p4d_dp 85 92 END INTERFACE iom_put 86 93 … … 169 176 ! 170 177 IF( ln_cfmeta ) THEN ! Add additional grid metadata 171 CALL iom_set_domain_attr("grid_T", area = e1e2t(nldi:nlei, nldj:nlej))172 CALL iom_set_domain_attr("grid_U", area = e1e2u(nldi:nlei, nldj:nlej))173 CALL iom_set_domain_attr("grid_V", area = e1e2v(nldi:nlei, nldj:nlej))174 CALL iom_set_domain_attr("grid_W", area = e1e2t(nldi:nlei, nldj:nlej))178 CALL iom_set_domain_attr("grid_T", area = real( e1e2t(nldi:nlei, nldj:nlej), dp)) 179 CALL iom_set_domain_attr("grid_U", area = real( e1e2u(nldi:nlei, nldj:nlej), dp)) 180 CALL iom_set_domain_attr("grid_V", area = real( e1e2v(nldi:nlei, nldj:nlej), dp)) 181 CALL iom_set_domain_attr("grid_W", area = real( e1e2t(nldi:nlei, nldj:nlej), dp)) 175 182 CALL set_grid_bounds( "T", glamf, gphif, glamt, gphit ) 176 183 CALL set_grid_bounds( "U", glamv, gphiv, glamu, gphiu ) … … 192 199 ! 193 200 IF( ln_cfmeta .AND. .NOT. llrst_context) THEN ! Add additional grid metadata 194 CALL iom_set_domain_attr("grid_T", area = e1e2t_crs(nldi:nlei, nldj:nlej))195 CALL iom_set_domain_attr("grid_U", area = e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej))196 CALL iom_set_domain_attr("grid_V", area = e1v_crs(nldi:nlei, nldj:nlej) * e2v_crs(nldi:nlei, nldj:nlej))197 CALL iom_set_domain_attr("grid_W", area = e1e2t_crs(nldi:nlei, nldj:nlej))201 CALL iom_set_domain_attr("grid_T", area = real(e1e2t_crs(nldi:nlei, nldj:nlej), dp)) 202 CALL iom_set_domain_attr("grid_U", area = real(e1u_crs(nldi:nlei, nldj:nlej) * e2u_crs(nldi:nlei, nldj:nlej), dp) ) 203 CALL iom_set_domain_attr("grid_V", area = real(e1v_crs(nldi:nlei, nldj:nlej) * e2v_crs(nldi:nlei, nldj:nlej), dp) ) 204 CALL iom_set_domain_attr("grid_W", area = real(e1e2t_crs(nldi:nlei, nldj:nlej), dp ) ) 198 205 CALL set_grid_bounds( "T", glamf_crs, gphif_crs, glamt_crs, gphit_crs ) 199 206 CALL set_grid_bounds( "U", glamv_crs, gphiv_crs, glamu_crs, gphiu_crs ) … … 941 948 !! INTERFACE iom_get 942 949 !!---------------------------------------------------------------------- 943 SUBROUTINE iom_g0d ( kiomid, cdvar, pvar, ktime, ldxios )950 SUBROUTINE iom_g0d_sp( kiomid, cdvar, pvar, ktime, ldxios ) 944 951 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 945 952 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 946 REAL(wp) , INTENT( out) :: pvar ! read field 953 REAL(sp) , INTENT( out) :: pvar ! read field 954 REAL(dp) :: ztmp_pvar ! tmp var to read field 955 INTEGER , INTENT(in ), OPTIONAL :: ktime ! record number 956 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! use xios to read restart 957 ! 958 INTEGER :: idvar ! variable id 959 INTEGER :: idmspc ! number of spatial dimensions 960 INTEGER , DIMENSION(1) :: itime ! record number 961 CHARACTER(LEN=100) :: clinfo ! info character 962 CHARACTER(LEN=100) :: clname ! file name 963 CHARACTER(LEN=1) :: cldmspc ! 964 LOGICAL :: llxios 965 ! 966 llxios = .FALSE. 967 IF( PRESENT(ldxios) ) llxios = ldxios 968 969 IF(.NOT.llxios) THEN ! read data using default library 970 itime = 1 971 IF( PRESENT(ktime) ) itime = ktime 972 ! 973 clname = iom_file(kiomid)%name 974 clinfo = ' iom_g0d, file: '//trim(clname)//', var: '//trim(cdvar) 975 ! 976 IF( kiomid > 0 ) THEN 977 idvar = iom_varid( kiomid, cdvar ) 978 IF( iom_file(kiomid)%nfid > 0 .AND. idvar > 0 ) THEN 979 idmspc = iom_file ( kiomid )%ndims( idvar ) 980 IF( iom_file(kiomid)%luld(idvar) ) idmspc = idmspc - 1 981 WRITE(cldmspc , fmt='(i1)') idmspc 982 IF( idmspc > 0 ) CALL ctl_stop( TRIM(clinfo), 'When reading to a 0D array, we do not accept data', & 983 & 'with 1 or more spatial dimensions: '//cldmspc//' were found.' , & 984 & 'Use ncwa -a to suppress the unnecessary dimensions' ) 985 CALL iom_nf90_get( kiomid, idvar, ztmp_pvar, itime ) 986 pvar = ztmp_pvar 987 ENDIF 988 ENDIF 989 ELSE 990 #if defined key_iomput 991 IF(lwp) WRITE(numout,*) 'XIOS RST READ (0D): ', trim(cdvar) 992 CALL iom_swap( TRIM(crxios_context) ) 993 CALL xios_recv_field( trim(cdvar), pvar) 994 CALL iom_swap( TRIM(cxios_context) ) 995 #else 996 WRITE(ctmp1,*) 'Can not use XIOS in iom_g0d, file: '//trim(clname)//', var:'//trim(cdvar) 997 CALL ctl_stop( 'iom_g0d', ctmp1 ) 998 #endif 999 ENDIF 1000 END SUBROUTINE iom_g0d_sp 1001 1002 SUBROUTINE iom_g0d_dp( kiomid, cdvar, pvar, ktime, ldxios ) 1003 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1004 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1005 REAL(dp) , INTENT( out) :: pvar ! read field 947 1006 INTEGER , INTENT(in ), OPTIONAL :: ktime ! record number 948 1007 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! use xios to read restart … … 989 1048 #endif 990 1049 ENDIF 991 END SUBROUTINE iom_g0d 992 993 SUBROUTINE iom_g1d ( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios )1050 END SUBROUTINE iom_g0d_dp 1051 1052 SUBROUTINE iom_g1d_sp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 994 1053 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 995 1054 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 996 1055 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 997 REAL(wp) , INTENT( out), DIMENSION(:) :: pvar ! read field 1056 REAL(sp) , INTENT( out), DIMENSION(:) :: pvar ! read field 1057 REAL(dp) , ALLOCATABLE , DIMENSION(:) :: ztmp_pvar ! tmp var to read field 998 1058 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 999 1059 INTEGER , INTENT(in ), DIMENSION(1), OPTIONAL :: kstart ! start axis position of the reading … … 1002 1062 ! 1003 1063 IF( kiomid > 0 ) THEN 1064 IF( iom_file(kiomid)%nfid > 0 ) THEN 1065 ALLOCATE(ztmp_pvar(size(pvar,1))) 1066 CALL iom_get_123d( kiomid, kdom , cdvar , pv_r1d=ztmp_pvar, & 1067 & ktime=ktime, kstart=kstart, kcount=kcount, & 1068 & ldxios=ldxios ) 1069 pvar = ztmp_pvar 1070 DEALLOCATE(ztmp_pvar) 1071 END IF 1072 ENDIF 1073 END SUBROUTINE iom_g1d_sp 1074 1075 1076 SUBROUTINE iom_g1d_dp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, ldxios ) 1077 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1078 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1079 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1080 REAL(dp) , INTENT( out), DIMENSION(:) :: pvar ! read field 1081 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 1082 INTEGER , INTENT(in ), DIMENSION(1), OPTIONAL :: kstart ! start axis position of the reading 1083 INTEGER , INTENT(in ), DIMENSION(1), OPTIONAL :: kcount ! number of points in each axis 1084 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! read data using XIOS 1085 ! 1086 IF( kiomid > 0 ) THEN 1004 1087 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r1d=pvar, & 1005 1088 & ktime=ktime, kstart=kstart, kcount=kcount, & 1006 1089 & ldxios=ldxios ) 1007 1090 ENDIF 1008 END SUBROUTINE iom_g1d 1009 1010 SUBROUTINE iom_g2d ( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios)1091 END SUBROUTINE iom_g1d_dp 1092 1093 SUBROUTINE iom_g2d_sp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios) 1011 1094 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1012 1095 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1013 1096 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1014 REAL(wp) , INTENT( out), DIMENSION(:,:) :: pvar ! read field 1097 REAL(sp) , INTENT( out), DIMENSION(:,:) :: pvar ! read field 1098 REAL(dp) , ALLOCATABLE , DIMENSION(:,:) :: ztmp_pvar ! tmp var to read field 1015 1099 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 1016 1100 INTEGER , INTENT(in ), DIMENSION(2) , OPTIONAL :: kstart ! start axis position of the reading … … 1023 1107 ! 1024 1108 IF( kiomid > 0 ) THEN 1109 IF( iom_file(kiomid)%nfid > 0 ) THEN 1110 ALLOCATE(ztmp_pvar(size(pvar,1), size(pvar,2))) 1111 CALL iom_get_123d( kiomid, kdom , cdvar , pv_r2d=ztmp_pvar, & 1112 & ktime=ktime, kstart=kstart, kcount=kcount, & 1113 & lrowattr=lrowattr, ldxios=ldxios) 1114 pvar = ztmp_pvar 1115 DEALLOCATE(ztmp_pvar) 1116 END IF 1117 ENDIF 1118 END SUBROUTINE iom_g2d_sp 1119 1120 1121 SUBROUTINE iom_g2d_dp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios) 1122 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1123 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1124 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1125 REAL(dp) , INTENT( out), DIMENSION(:,:) :: pvar ! read field 1126 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 1127 INTEGER , INTENT(in ), DIMENSION(2) , OPTIONAL :: kstart ! start axis position of the reading 1128 INTEGER , INTENT(in ), DIMENSION(2) , OPTIONAL :: kcount ! number of points in each axis 1129 LOGICAL , INTENT(in ) , OPTIONAL :: lrowattr ! logical flag telling iom_get to 1130 ! look for and use a file attribute 1131 ! called open_ocean_jstart to set the start 1132 ! value for the 2nd dimension (netcdf only) 1133 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! read data using XIOS 1134 ! 1135 IF( kiomid > 0 ) THEN 1025 1136 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r2d=pvar, & 1026 1137 & ktime=ktime, kstart=kstart, kcount=kcount, & 1027 1138 & lrowattr=lrowattr, ldxios=ldxios) 1028 1139 ENDIF 1029 END SUBROUTINE iom_g2d 1030 1031 SUBROUTINE iom_g3d ( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios )1140 END SUBROUTINE iom_g2d_dp 1141 1142 SUBROUTINE iom_g3d_sp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios ) 1032 1143 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1033 1144 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1034 1145 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1035 REAL(wp) , INTENT( out), DIMENSION(:,:,:) :: pvar ! read field 1146 REAL(sp) , INTENT( out), DIMENSION(:,:,:) :: pvar ! read field 1147 REAL(dp) , ALLOCATABLE , DIMENSION(:,:,:) :: ztmp_pvar ! tmp var to read field 1036 1148 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 1037 1149 INTEGER , INTENT(in ), DIMENSION(3) , OPTIONAL :: kstart ! start axis position of the reading … … 1044 1156 ! 1045 1157 IF( kiomid > 0 ) THEN 1158 IF( iom_file(kiomid)%nfid > 0 ) THEN 1159 ALLOCATE(ztmp_pvar(size(pvar,1), size(pvar,2), size(pvar,3))) 1160 CALL iom_get_123d( kiomid, kdom , cdvar , pv_r3d=ztmp_pvar, & 1161 & ktime=ktime, kstart=kstart, kcount=kcount, & 1162 & lrowattr=lrowattr, ldxios=ldxios ) 1163 pvar = ztmp_pvar 1164 DEALLOCATE(ztmp_pvar) 1165 END IF 1166 ENDIF 1167 END SUBROUTINE iom_g3d_sp 1168 1169 SUBROUTINE iom_g3d_dp( kiomid, kdom, cdvar, pvar, ktime, kstart, kcount, lrowattr, ldxios ) 1170 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 1171 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1172 CHARACTER(len=*), INTENT(in ) :: cdvar ! Name of the variable 1173 REAL(dp) , INTENT( out), DIMENSION(:,:,:) :: pvar ! read field 1174 INTEGER , INTENT(in ) , OPTIONAL :: ktime ! record number 1175 INTEGER , INTENT(in ), DIMENSION(3) , OPTIONAL :: kstart ! start axis position of the reading 1176 INTEGER , INTENT(in ), DIMENSION(3) , OPTIONAL :: kcount ! number of points in each axis 1177 LOGICAL , INTENT(in ) , OPTIONAL :: lrowattr ! logical flag telling iom_get to 1178 ! look for and use a file attribute 1179 ! called open_ocean_jstart to set the start 1180 ! value for the 2nd dimension (netcdf only) 1181 LOGICAL , INTENT(in ), OPTIONAL :: ldxios ! read data using XIOS 1182 ! 1183 IF( kiomid > 0 ) THEN 1046 1184 IF( iom_file(kiomid)%nfid > 0 ) CALL iom_get_123d( kiomid, kdom , cdvar , pv_r3d=pvar, & 1047 1185 & ktime=ktime, kstart=kstart, kcount=kcount, & 1048 1186 & lrowattr=lrowattr, ldxios=ldxios ) 1049 1187 ENDIF 1050 END SUBROUTINE iom_g3d 1188 END SUBROUTINE iom_g3d_dp 1189 1190 1191 1051 1192 !!---------------------------------------------------------------------- 1052 1193 … … 1065 1206 INTEGER , INTENT(in ) :: kdom ! Type of domain to be read 1066 1207 CHARACTER(len=*) , INTENT(in ) :: cdvar ! Name of the variable 1067 REAL( wp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case)1068 REAL( wp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case)1069 REAL( wp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case)1208 REAL(dp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case) 1209 REAL(dp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case) 1210 REAL(dp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case) 1070 1211 INTEGER , INTENT(in ), OPTIONAL :: ktime ! record number 1071 1212 INTEGER , DIMENSION(:) , INTENT(in ), OPTIONAL :: kstart ! start position of the reading in each axis … … 1096 1237 INTEGER, DIMENSION(jpmax_dims) :: idimsz ! size of the dimensions of the variable 1097 1238 INTEGER, DIMENSION(jpmax_dims) :: ishape ! size of the dimensions of the variable 1098 REAL( wp) :: zscf, zofs ! sacle_factor and add_offset1239 REAL(dp) :: zscf, zofs ! sacle_factor and add_offset 1099 1240 INTEGER :: itmp ! temporary integer 1100 1241 CHARACTER(LEN=256) :: clinfo ! info character … … 1103 1244 LOGICAL :: ll_depth_spec ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension. 1104 1245 INTEGER :: inlev ! number of levels for 3D data 1105 REAL( wp) :: gma, gmi1246 REAL(dp) :: gma, gmi 1106 1247 !--------------------------------------------------------------------- 1107 1248 ! … … 1550 1691 !! INTERFACE iom_rstput 1551 1692 !!---------------------------------------------------------------------- 1552 SUBROUTINE iom_rp0d ( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios )1693 SUBROUTINE iom_rp0d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1553 1694 INTEGER , INTENT(in) :: kt ! ocean time-step 1554 1695 INTEGER , INTENT(in) :: kwrite ! writing time-step 1555 1696 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1556 1697 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1557 REAL( wp) , INTENT(in) :: pvar ! written field1698 REAL(sp) , INTENT(in) :: pvar ! written field 1558 1699 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1559 1700 LOGICAL, OPTIONAL :: ldxios ! xios write flag … … 1574 1715 IF( iom_file(kiomid)%nfid > 0 ) THEN 1575 1716 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1576 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar)1717 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = real(pvar, dp) ) 1577 1718 ENDIF 1578 1719 ENDIF 1579 1720 ENDIF 1580 END SUBROUTINE iom_rp0d 1581 1582 SUBROUTINE iom_rp 1d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios )1721 END SUBROUTINE iom_rp0d_sp 1722 1723 SUBROUTINE iom_rp0d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1583 1724 INTEGER , INTENT(in) :: kt ! ocean time-step 1584 1725 INTEGER , INTENT(in) :: kwrite ! writing time-step 1585 1726 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1586 1727 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1587 REAL(wp) , INTENT(in), DIMENSION( :) :: pvar ! written field 1728 REAL(dp) , INTENT(in) :: pvar ! written field 1729 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1730 LOGICAL, OPTIONAL :: ldxios ! xios write flag 1731 LOGICAL :: llx ! local xios write flag 1732 INTEGER :: ivid ! variable id 1733 1734 llx = .FALSE. 1735 IF(PRESENT(ldxios)) llx = ldxios 1736 IF( llx ) THEN 1737 #ifdef key_iomput 1738 IF( kt == kwrite ) THEN 1739 IF(lwp) write(numout,*) 'RESTART: write (XIOS 0D) ',trim(cdvar) 1740 CALL xios_send_field(trim(cdvar), pvar) 1741 ENDIF 1742 #endif 1743 ELSE 1744 IF( kiomid > 0 ) THEN 1745 IF( iom_file(kiomid)%nfid > 0 ) THEN 1746 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1747 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r0d = pvar ) 1748 ENDIF 1749 ENDIF 1750 ENDIF 1751 END SUBROUTINE iom_rp0d_dp 1752 1753 1754 SUBROUTINE iom_rp1d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1755 INTEGER , INTENT(in) :: kt ! ocean time-step 1756 INTEGER , INTENT(in) :: kwrite ! writing time-step 1757 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1758 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1759 REAL(sp) , INTENT(in), DIMENSION( :) :: pvar ! written field 1588 1760 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1589 1761 LOGICAL, OPTIONAL :: ldxios ! xios write flag … … 1604 1776 IF( iom_file(kiomid)%nfid > 0 ) THEN 1605 1777 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1606 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar)1778 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = real(pvar, dp) ) 1607 1779 ENDIF 1608 1780 ENDIF 1609 1781 ENDIF 1610 END SUBROUTINE iom_rp1d 1611 1612 SUBROUTINE iom_rp 2d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios )1782 END SUBROUTINE iom_rp1d_sp 1783 1784 SUBROUTINE iom_rp1d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1613 1785 INTEGER , INTENT(in) :: kt ! ocean time-step 1614 1786 INTEGER , INTENT(in) :: kwrite ! writing time-step 1615 1787 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1616 1788 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1617 REAL(wp) , INTENT(in), DIMENSION(:, : ) :: pvar ! written field 1789 REAL(dp) , INTENT(in), DIMENSION( :) :: pvar ! written field 1790 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1791 LOGICAL, OPTIONAL :: ldxios ! xios write flag 1792 LOGICAL :: llx ! local xios write flag 1793 INTEGER :: ivid ! variable id 1794 1795 llx = .FALSE. 1796 IF(PRESENT(ldxios)) llx = ldxios 1797 IF( llx ) THEN 1798 #ifdef key_iomput 1799 IF( kt == kwrite ) THEN 1800 IF(lwp) write(numout,*) 'RESTART: write (XIOS 1D) ',trim(cdvar) 1801 CALL xios_send_field(trim(cdvar), pvar) 1802 ENDIF 1803 #endif 1804 ELSE 1805 IF( kiomid > 0 ) THEN 1806 IF( iom_file(kiomid)%nfid > 0 ) THEN 1807 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1808 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r1d = pvar ) 1809 ENDIF 1810 ENDIF 1811 ENDIF 1812 END SUBROUTINE iom_rp1d_dp 1813 1814 1815 SUBROUTINE iom_rp2d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1816 INTEGER , INTENT(in) :: kt ! ocean time-step 1817 INTEGER , INTENT(in) :: kwrite ! writing time-step 1818 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1819 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1820 REAL(sp) , INTENT(in), DIMENSION(:, : ) :: pvar ! written field 1618 1821 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1619 1822 LOGICAL, OPTIONAL :: ldxios ! xios write flag … … 1634 1837 IF( iom_file(kiomid)%nfid > 0 ) THEN 1635 1838 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1636 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar)1839 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = real(pvar, dp) ) 1637 1840 ENDIF 1638 1841 ENDIF 1639 1842 ENDIF 1640 END SUBROUTINE iom_rp2d 1641 1642 SUBROUTINE iom_rp 3d( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios )1843 END SUBROUTINE iom_rp2d_sp 1844 1845 SUBROUTINE iom_rp2d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1643 1846 INTEGER , INTENT(in) :: kt ! ocean time-step 1644 1847 INTEGER , INTENT(in) :: kwrite ! writing time-step 1645 1848 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1646 1849 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1647 REAL(wp) , INTENT(in), DIMENSION(:,:,:) :: pvar ! written field 1850 REAL(dp) , INTENT(in), DIMENSION(:, : ) :: pvar ! written field 1851 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1852 LOGICAL, OPTIONAL :: ldxios ! xios write flag 1853 LOGICAL :: llx 1854 INTEGER :: ivid ! variable id 1855 1856 llx = .FALSE. 1857 IF(PRESENT(ldxios)) llx = ldxios 1858 IF( llx ) THEN 1859 #ifdef key_iomput 1860 IF( kt == kwrite ) THEN 1861 IF(lwp) write(numout,*) 'RESTART: write (XIOS 2D) ',trim(cdvar) 1862 CALL xios_send_field(trim(cdvar), pvar) 1863 ENDIF 1864 #endif 1865 ELSE 1866 IF( kiomid > 0 ) THEN 1867 IF( iom_file(kiomid)%nfid > 0 ) THEN 1868 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1869 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r2d = pvar ) 1870 ENDIF 1871 ENDIF 1872 ENDIF 1873 END SUBROUTINE iom_rp2d_dp 1874 1875 1876 SUBROUTINE iom_rp3d_sp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1877 INTEGER , INTENT(in) :: kt ! ocean time-step 1878 INTEGER , INTENT(in) :: kwrite ! writing time-step 1879 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1880 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1881 REAL(sp) , INTENT(in), DIMENSION(:,:,:) :: pvar ! written field 1648 1882 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1649 1883 LOGICAL, OPTIONAL :: ldxios ! xios write flag … … 1664 1898 IF( iom_file(kiomid)%nfid > 0 ) THEN 1665 1899 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1900 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = real(pvar, dp) ) 1901 ENDIF 1902 ENDIF 1903 ENDIF 1904 END SUBROUTINE iom_rp3d_sp 1905 1906 SUBROUTINE iom_rp3d_dp( kt, kwrite, kiomid, cdvar, pvar, ktype, ldxios ) 1907 INTEGER , INTENT(in) :: kt ! ocean time-step 1908 INTEGER , INTENT(in) :: kwrite ! writing time-step 1909 INTEGER , INTENT(in) :: kiomid ! Identifier of the file 1910 CHARACTER(len=*), INTENT(in) :: cdvar ! time axis name 1911 REAL(dp) , INTENT(in), DIMENSION(:,:,:) :: pvar ! written field 1912 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable external type 1913 LOGICAL, OPTIONAL :: ldxios ! xios write flag 1914 LOGICAL :: llx ! local xios write flag 1915 INTEGER :: ivid ! variable id 1916 1917 llx = .FALSE. 1918 IF(PRESENT(ldxios)) llx = ldxios 1919 IF( llx ) THEN 1920 #ifdef key_iomput 1921 IF( kt == kwrite ) THEN 1922 IF(lwp) write(numout,*) 'RESTART: write (XIOS 3D) ',trim(cdvar) 1923 CALL xios_send_field(trim(cdvar), pvar) 1924 ENDIF 1925 #endif 1926 ELSE 1927 IF( kiomid > 0 ) THEN 1928 IF( iom_file(kiomid)%nfid > 0 ) THEN 1929 ivid = iom_varid( kiomid, cdvar, ldstop = .FALSE. ) 1666 1930 CALL iom_nf90_rstput( kt, kwrite, kiomid, cdvar, ivid, ktype, pv_r3d = pvar ) 1667 1931 ENDIF 1668 1932 ENDIF 1669 1933 ENDIF 1670 END SUBROUTINE iom_rp3d 1934 END SUBROUTINE iom_rp3d_dp 1935 1671 1936 1672 1937 … … 1720 1985 !! INTERFACE iom_put 1721 1986 !!---------------------------------------------------------------------- 1722 SUBROUTINE iom_p0d ( cdname, pfield0d )1987 SUBROUTINE iom_p0d_sp( cdname, pfield0d ) 1723 1988 CHARACTER(LEN=*), INTENT(in) :: cdname 1724 REAL( wp) , INTENT(in) :: pfield0d1989 REAL(sp) , INTENT(in) :: pfield0d 1725 1990 !! REAL(wp) , DIMENSION(jpi,jpj) :: zz ! masson 1726 1991 #if defined key_iomput … … 1731 1996 IF( .FALSE. ) WRITE(numout,*) cdname, pfield0d ! useless test to avoid compilation warnings 1732 1997 #endif 1733 END SUBROUTINE iom_p0d 1734 1735 SUBROUTINE iom_p1d( cdname, pfield1d ) 1998 END SUBROUTINE iom_p0d_sp 1999 2000 SUBROUTINE iom_p0d_dp( cdname, pfield0d ) 2001 CHARACTER(LEN=*), INTENT(in) :: cdname 2002 REAL(dp) , INTENT(in) :: pfield0d 2003 !! REAL(wp) , DIMENSION(jpi,jpj) :: zz ! masson 2004 #if defined key_iomput 2005 !!clem zz(:,:)=pfield0d 2006 !!clem CALL xios_send_field(cdname, zz) 2007 CALL xios_send_field(cdname, (/pfield0d/)) 2008 #else 2009 IF( .FALSE. ) WRITE(numout,*) cdname, pfield0d ! useless test to avoid compilation warnings 2010 #endif 2011 END SUBROUTINE iom_p0d_dp 2012 2013 2014 SUBROUTINE iom_p1d_sp( cdname, pfield1d ) 1736 2015 CHARACTER(LEN=*) , INTENT(in) :: cdname 1737 REAL( wp), DIMENSION(:), INTENT(in) :: pfield1d2016 REAL(sp), DIMENSION(:), INTENT(in) :: pfield1d 1738 2017 #if defined key_iomput 1739 2018 CALL xios_send_field( cdname, RESHAPE( (/pfield1d/), (/1,1,SIZE(pfield1d)/) ) ) … … 1741 2020 IF( .FALSE. ) WRITE(numout,*) cdname, pfield1d ! useless test to avoid compilation warnings 1742 2021 #endif 1743 END SUBROUTINE iom_p1d 1744 1745 SUBROUTINE iom_p2d( cdname, pfield2d ) 2022 END SUBROUTINE iom_p1d_sp 2023 2024 SUBROUTINE iom_p1d_dp( cdname, pfield1d ) 2025 CHARACTER(LEN=*) , INTENT(in) :: cdname 2026 REAL(dp), DIMENSION(:), INTENT(in) :: pfield1d 2027 #if defined key_iomput 2028 CALL xios_send_field( cdname, RESHAPE( (/pfield1d/), (/1,1,SIZE(pfield1d)/) ) ) 2029 #else 2030 IF( .FALSE. ) WRITE(numout,*) cdname, pfield1d ! useless test to avoid compilation warnings 2031 #endif 2032 END SUBROUTINE iom_p1d_dp 2033 2034 SUBROUTINE iom_p2d_sp( cdname, pfield2d ) 1746 2035 CHARACTER(LEN=*) , INTENT(in) :: cdname 1747 REAL( wp), DIMENSION(:,:), INTENT(in) :: pfield2d2036 REAL(sp), DIMENSION(:,:), INTENT(in) :: pfield2d 1748 2037 #if defined key_iomput 1749 2038 CALL xios_send_field(cdname, pfield2d) … … 1751 2040 IF( .FALSE. ) WRITE(numout,*) cdname, pfield2d ! useless test to avoid compilation warnings 1752 2041 #endif 1753 END SUBROUTINE iom_p2d 1754 1755 SUBROUTINE iom_p3d( cdname, pfield3d ) 2042 END SUBROUTINE iom_p2d_sp 2043 2044 SUBROUTINE iom_p2d_dp( cdname, pfield2d ) 2045 CHARACTER(LEN=*) , INTENT(in) :: cdname 2046 REAL(dp), DIMENSION(:,:), INTENT(in) :: pfield2d 2047 #if defined key_iomput 2048 CALL xios_send_field(cdname, pfield2d) 2049 #else 2050 IF( .FALSE. ) WRITE(numout,*) cdname, pfield2d ! useless test to avoid compilation warnings 2051 #endif 2052 END SUBROUTINE iom_p2d_dp 2053 2054 SUBROUTINE iom_p3d_sp( cdname, pfield3d ) 1756 2055 CHARACTER(LEN=*) , INTENT(in) :: cdname 1757 REAL( wp), DIMENSION(:,:,:), INTENT(in) :: pfield3d2056 REAL(sp), DIMENSION(:,:,:), INTENT(in) :: pfield3d 1758 2057 #if defined key_iomput 1759 2058 CALL xios_send_field( cdname, pfield3d ) … … 1761 2060 IF( .FALSE. ) WRITE(numout,*) cdname, pfield3d ! useless test to avoid compilation warnings 1762 2061 #endif 1763 END SUBROUTINE iom_p3d 1764 1765 SUBROUTINE iom_p 4d( cdname, pfield4d )2062 END SUBROUTINE iom_p3d_sp 2063 2064 SUBROUTINE iom_p3d_dp( cdname, pfield3d ) 1766 2065 CHARACTER(LEN=*) , INTENT(in) :: cdname 1767 REAL(wp), DIMENSION(:,:,:,:), INTENT(in) :: pfield4d 2066 REAL(dp), DIMENSION(:,:,:), INTENT(in) :: pfield3d 2067 #if defined key_iomput 2068 CALL xios_send_field( cdname, pfield3d ) 2069 #else 2070 IF( .FALSE. ) WRITE(numout,*) cdname, pfield3d ! useless test to avoid compilation warnings 2071 #endif 2072 END SUBROUTINE iom_p3d_dp 2073 2074 SUBROUTINE iom_p4d_sp( cdname, pfield4d ) 2075 CHARACTER(LEN=*) , INTENT(in) :: cdname 2076 REAL(sp), DIMENSION(:,:,:,:), INTENT(in) :: pfield4d 1768 2077 #if defined key_iomput 1769 2078 CALL xios_send_field(cdname, pfield4d) … … 1771 2080 IF( .FALSE. ) WRITE(numout,*) cdname, pfield4d ! useless test to avoid compilation warnings 1772 2081 #endif 1773 END SUBROUTINE iom_p4d 1774 2082 END SUBROUTINE iom_p4d_sp 2083 2084 SUBROUTINE iom_p4d_dp( cdname, pfield4d ) 2085 CHARACTER(LEN=*) , INTENT(in) :: cdname 2086 REAL(dp), DIMENSION(:,:,:,:), INTENT(in) :: pfield4d 2087 #if defined key_iomput 2088 CALL xios_send_field(cdname, pfield4d) 2089 #else 2090 IF( .FALSE. ) WRITE(numout,*) cdname, pfield4d ! useless test to avoid compilation warnings 2091 #endif 2092 END SUBROUTINE iom_p4d_dp 1775 2093 1776 2094 #if defined key_iomput … … 1788 2106 INTEGER , OPTIONAL, INTENT(in) :: data_dim, data_ibegin, data_ni, data_jbegin, data_nj 1789 2107 INTEGER , OPTIONAL, INTENT(in) :: nvertex 1790 REAL( wp), DIMENSION(:) , OPTIONAL, INTENT(in) :: lonvalue, latvalue1791 REAL( wp), DIMENSION(:,:), OPTIONAL, INTENT(in) :: bounds_lon, bounds_lat, area2108 REAL(dp), DIMENSION(:) , OPTIONAL, INTENT(in) :: lonvalue, latvalue 2109 REAL(dp), DIMENSION(:,:), OPTIONAL, INTENT(in) :: bounds_lon, bounds_lat, area 1792 2110 LOGICAL , DIMENSION(:) , OPTIONAL, INTENT(in) :: mask 1793 2111 !!---------------------------------------------------------------------- … … 1852 2170 !!---------------------------------------------------------------------- 1853 2171 IF( PRESENT(paxis) ) THEN 1854 IF( xios_is_valid_axis (cdid) ) CALL xios_set_axis_attr ( cdid, n_glo=SIZE(paxis), value=paxis ) 1855 IF( xios_is_valid_axisgroup(cdid) ) CALL xios_set_axisgroup_attr( cdid, n_glo=SIZE(paxis), value=paxis ) 1856 ENDIF 1857 IF( xios_is_valid_axis (cdid) ) CALL xios_set_axis_attr ( cdid, bounds=bounds ) 1858 IF( xios_is_valid_axisgroup(cdid) ) CALL xios_set_axisgroup_attr( cdid, bounds=bounds ) 2172 IF( xios_is_valid_axis (cdid) ) CALL xios_set_axis_attr ( cdid, n_glo=SIZE(paxis), value=real(paxis, dp) ) 2173 IF( xios_is_valid_axisgroup(cdid) ) CALL xios_set_axisgroup_attr( cdid, n_glo=SIZE(paxis), value=real(paxis, dp) ) 2174 ENDIF 2175 IF( PRESENT(bounds) ) THEN 2176 IF( xios_is_valid_axis (cdid) ) CALL xios_set_axis_attr ( cdid, bounds=real(bounds, dp) ) 2177 IF( xios_is_valid_axisgroup(cdid) ) CALL xios_set_axisgroup_attr( cdid, bounds=real(bounds, dp) ) 2178 ELSE 2179 IF( xios_is_valid_axis (cdid) ) CALL xios_set_axis_attr ( cdid) 2180 IF( xios_is_valid_axisgroup(cdid) ) CALL xios_set_axisgroup_attr( cdid) 2181 END IF 1859 2182 CALL xios_solve_inheritance() 1860 2183 END SUBROUTINE iom_set_axis_attr … … 1975 2298 !don't define lon and lat for restart reading context. 1976 2299 IF ( .NOT.ldrxios ) & 1977 CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)), &1978 & latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))2300 CALL iom_set_domain_attr("grid_"//cdgrd, lonvalue = real(RESHAPE(plon(nldi:nlei, nldj:nlej),(/ ni*nj /)), dp), & 2301 & latvalue = real(RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)),dp ) ) 1979 2302 ! 1980 2303 IF ( ln_mskland .AND. (.NOT.ldxios) ) THEN … … 2091 2414 ENDIF 2092 2415 ! 2093 CALL iom_set_domain_attr("grid_"//cdgrd, bounds_lat = RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,1),(/ 4,ni*nj /)), &2094 & bounds_lon = RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,2),(/ 4,ni*nj /)), nvertex=4 )2416 CALL iom_set_domain_attr("grid_"//cdgrd, bounds_lat =real( RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,1),(/ 4,ni*nj /)), dp), & 2417 & bounds_lon =real( RESHAPE(z_bnds(:,nldi:nlei,nldj:nlej,2),(/ 4,ni*nj /)), dp), nvertex=4 ) 2095 2418 ! 2096 2419 DEALLOCATE( z_bnds, z_fld, z_rot ) … … 2120 2443 CALL iom_set_domain_attr("gznl", ni_glo=jpiglo, nj_glo=jpjglo, ibegin=nimpp+nldi-2, jbegin=njmpp+nldj-2, ni=ni, nj=nj) 2121 2444 CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin = 1-nldi, data_ni = jpi, data_jbegin = 1-nldj, data_nj = jpj) 2122 CALL iom_set_domain_attr("gznl", lonvalue = zlon, &2123 & latvalue = RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)))2445 CALL iom_set_domain_attr("gznl", lonvalue = real(zlon, dp), & 2446 & latvalue = real(RESHAPE(plat(nldi:nlei, nldj:nlej),(/ ni*nj /)),dp)) 2124 2447 CALL iom_set_zoom_domain_attr("ptr", ibegin=ix-1, jbegin=0, ni=1, nj=jpjglo) 2125 2448 ! … … 2136 2459 !! 2137 2460 !!---------------------------------------------------------------------- 2138 REAL( wp), DIMENSION(1) :: zz = 1.2461 REAL(dp), DIMENSION(1) :: zz = 1. 2139 2462 !!---------------------------------------------------------------------- 2140 2463 ! … … 2482 2805 CHARACTER(LEN=*), INTENT(in ) :: cdname 2483 2806 REAL(wp) , INTENT(out) :: pmiss_val 2807 REAL(dp) :: ztmp_pmiss_val 2484 2808 #if defined key_iomput 2485 2809 ! get missing value 2486 CALL xios_get_field_attr( cdname, default_value = pmiss_val ) 2810 CALL xios_get_field_attr( cdname, default_value = ztmp_pmiss_val ) 2811 pmiss_val = ztmp_pmiss_val 2487 2812 #else 2488 2813 IF( .FALSE. ) WRITE(numout,*) cdname, pmiss_val ! useless test to avoid compilation warnings -
NEMO/branches/2020/dev_r12512_HPC-04_mcastril_Mixed_Precision_implementation/src/OCE/IOM/iom_nf90.F90
r12377 r12603 33 33 34 34 INTERFACE iom_nf90_get 35 MODULE PROCEDURE iom_nf90_g0d, iom_nf90_g123d 35 MODULE PROCEDURE iom_nf90_g0d_sp 36 MODULE PROCEDURE iom_nf90_g0d_dp, iom_nf90_g123d_dp 36 37 END INTERFACE 37 38 INTERFACE iom_nf90_rstput 38 MODULE PROCEDURE iom_nf90_rp0123d 39 MODULE PROCEDURE iom_nf90_rp0123d_dp 39 40 END INTERFACE 40 41 … … 273 274 !!---------------------------------------------------------------------- 274 275 275 SUBROUTINE iom_nf90_g0d ( kiomid, kvid, pvar, kstart )276 SUBROUTINE iom_nf90_g0d_sp( kiomid, kvid, pvar, kstart ) 276 277 !!----------------------------------------------------------------------- 277 278 !! *** ROUTINE iom_nf90_g0d *** … … 281 282 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 282 283 INTEGER , INTENT(in ) :: kvid ! variable id 283 REAL( wp), INTENT( out) :: pvar ! read field284 REAL(sp), INTENT( out) :: pvar ! read field 284 285 INTEGER , DIMENSION(1), INTENT(in ), OPTIONAL :: kstart ! start position of the reading in each axis 285 286 ! … … 288 289 clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 289 290 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 290 END SUBROUTINE iom_nf90_g0d 291 292 293 SUBROUTINE iom_nf90_g123d( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2, & 291 END SUBROUTINE iom_nf90_g0d_sp 292 293 SUBROUTINE iom_nf90_g0d_dp( kiomid, kvid, pvar, kstart ) 294 !!----------------------------------------------------------------------- 295 !! *** ROUTINE iom_nf90_g0d *** 296 !! 297 !! ** Purpose : read a scalar with NF90 298 !!----------------------------------------------------------------------- 299 INTEGER , INTENT(in ) :: kiomid ! Identifier of the file 300 INTEGER , INTENT(in ) :: kvid ! variable id 301 REAL(dp), INTENT( out) :: pvar ! read field 302 INTEGER , DIMENSION(1), INTENT(in ), OPTIONAL :: kstart ! start position of the reading in each axis 303 ! 304 CHARACTER(LEN=100) :: clinfo ! info character 305 !--------------------------------------------------------------------- 306 clinfo = 'iom_nf90_g0d , file: '//TRIM(iom_file(kiomid)%name)//', var: '//TRIM(iom_file(kiomid)%cn_var(kvid)) 307 CALL iom_nf90_check(NF90_GET_VAR(iom_file(kiomid)%nfid, iom_file(kiomid)%nvid(kvid), pvar, start = kstart), clinfo ) 308 END SUBROUTINE iom_nf90_g0d_dp 309 310 SUBROUTINE iom_nf90_g123d_dp( kiomid, kvid, knbdim, kstart, kcount, kx1, kx2, ky1, ky2, & 294 311 & pv_r1d, pv_r2d, pv_r3d ) 295 312 !!----------------------------------------------------------------------- … … 306 323 INTEGER , DIMENSION(:) , INTENT(in ) :: kcount ! number of points to be read in each axis 307 324 INTEGER , INTENT(in ) :: kx1, kx2, ky1, ky2 ! subdomain indexes 308 REAL( wp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case)309 REAL( wp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case)310 REAL( wp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case)325 REAL(dp), DIMENSION(:) , INTENT( out), OPTIONAL :: pv_r1d ! read field (1D case) 326 REAL(dp), DIMENSION(:,:) , INTENT( out), OPTIONAL :: pv_r2d ! read field (2D case) 327 REAL(dp), DIMENSION(:,:,:) , INTENT( out), OPTIONAL :: pv_r3d ! read field (3D case) 311 328 ! 312 329 CHARACTER(LEN=100) :: clinfo ! info character … … 329 346 ENDIF 330 347 ! 331 END SUBROUTINE iom_nf90_g123d 348 END SUBROUTINE iom_nf90_g123d_dp 349 332 350 333 351 … … 503 521 END SUBROUTINE iom_nf90_putatt 504 522 505 506 SUBROUTINE iom_nf90_rp0123d( kt, kwrite, kiomid, cdvar , kvid , ktype, & 523 SUBROUTINE iom_nf90_rp0123d_dp( kt, kwrite, kiomid, cdvar , kvid , ktype, & 507 524 & pv_r0d, pv_r1d, pv_r2d, pv_r3d ) 508 525 !!-------------------------------------------------------------------- … … 517 534 INTEGER , INTENT(in) :: kvid ! variable id 518 535 INTEGER , INTENT(in), OPTIONAL :: ktype ! variable type (default R8) 519 REAL( wp) , INTENT(in), OPTIONAL :: pv_r0d ! written Od field520 REAL( wp), DIMENSION( :), INTENT(in), OPTIONAL :: pv_r1d ! written 1d field521 REAL( wp), DIMENSION(:, : ), INTENT(in), OPTIONAL :: pv_r2d ! written 2d field522 REAL( wp), DIMENSION(:, :, :), INTENT(in), OPTIONAL :: pv_r3d ! written 3d field536 REAL(dp) , INTENT(in), OPTIONAL :: pv_r0d ! written Od field 537 REAL(dp), DIMENSION( :), INTENT(in), OPTIONAL :: pv_r1d ! written 1d field 538 REAL(dp), DIMENSION(:, : ), INTENT(in), OPTIONAL :: pv_r2d ! written 2d field 539 REAL(dp), DIMENSION(:, :, :), INTENT(in), OPTIONAL :: pv_r3d ! written 3d field 523 540 ! 524 541 INTEGER :: idims ! number of dimension … … 720 737 ENDIF 721 738 ! 722 END SUBROUTINE iom_nf90_rp0123d 739 END SUBROUTINE iom_nf90_rp0123d_dp 723 740 724 741
Note: See TracChangeset
for help on using the changeset viewer.