Changeset 12080 for utils/tools/SIREN/src/extrap.f90
- Timestamp:
- 2019-12-06T10:30:14+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
utils/tools/SIREN/src/extrap.f90
r9598 r12080 2 2 ! NEMO system team, System and Interface for oceanic RElocable Nesting 3 3 !---------------------------------------------------------------------- 4 !5 ! MODULE: extrap6 4 ! 7 5 ! DESCRIPTION: … … 55 53 !> @author 56 54 !> J.Paul 57 ! REVISION HISTORY:55 !> 58 56 !> @date November, 2013 - Initial Version 59 57 !> @date September, 2014 … … 70 68 !> - smooth extrapolated points 71 69 !> 72 !> @note Software governed by the CeCILL licence ( ./LICENSE)70 !> @note Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 73 71 !---------------------------------------------------------------------- 74 72 MODULE extrap 73 75 74 USE netcdf ! nf90 library 76 75 USE kind ! F90 kind parameter … … 120 119 121 120 CONTAINS 121 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 122 FUNCTION extrap__detect(td_var0) & 123 & RESULT (if_detect) 122 124 !------------------------------------------------------------------- 123 125 !> @brief … … 140 142 !> @date June, 2015 141 143 !> - do not use level to select points to be extrapolated 142 ! 144 !> 143 145 !> @param[in] td_var0 coarse grid variable to extrapolate 144 146 !> @return array of point to be extrapolated 145 147 !------------------------------------------------------------------- 146 FUNCTION extrap__detect( td_var0 ) 148 147 149 IMPLICIT NONE 150 148 151 ! Argument 149 TYPE(TVAR) , INTENT(IN ) :: td_var0152 TYPE(TVAR) , INTENT(IN ) :: td_var0 150 153 151 154 ! function 152 155 INTEGER(i4), DIMENSION(td_var0%t_dim(1)%i_len,& 153 156 & td_var0%t_dim(2)%i_len,& 154 & td_var0%t_dim(3)%i_len ) :: extrap__detect157 & td_var0%t_dim(3)%i_len ) :: if_detect 155 158 156 159 ! local variable … … 162 165 163 166 ! force to extrapolated all points 164 extrap__detect(:,:,:)=1167 if_detect(:,:,:)=1 165 168 166 169 ! do not compute grid point already inform … … 169 172 DO ji0=1,td_var0%t_dim(1)%i_len 170 173 IF( td_var0%d_value(ji0,jj0,jk0,1) /= td_var0%d_fill )THEN 171 extrap__detect(ji0,jj0,jk0)=0174 if_detect(ji0,jj0,jk0)=0 172 175 ENDIF 173 176 ENDDO … … 176 179 177 180 END FUNCTION extrap__detect 181 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 182 FUNCTION extrap__detect_wrapper(td_var) & 183 & RESULT (if_detect) 178 184 !------------------------------------------------------------------- 179 185 !> @brief … … 189 195 !> @return 3D array of point to be extrapolated 190 196 !------------------------------------------------------------------- 191 FUNCTION extrap__detect_wrapper( td_var )192 197 193 198 IMPLICIT NONE 199 194 200 ! Argument 195 201 TYPE(TVAR) , INTENT(IN ) :: td_var … … 198 204 INTEGER(i4), DIMENSION(td_var%t_dim(1)%i_len,& 199 205 & td_var%t_dim(2)%i_len,& 200 & td_var%t_dim(3)%i_len ) :: extrap__detect_wrapper206 & td_var%t_dim(3)%i_len ) :: if_detect 201 207 202 208 ! local variable … … 204 210 !---------------------------------------------------------------- 205 211 ! init 206 extrap__detect_wrapper(:,:,:)=0212 if_detect(:,:,:)=0 207 213 208 214 IF( .NOT. ANY(td_var%t_dim(1:3)%l_use) )THEN 209 215 ! no dimension I-J-K used 210 216 CALL logger_debug(" EXTRAP DETECT: nothing done for variable"//& 211 & TRIM(td_var%c_name) )217 & TRIM(td_var%c_name) ) 212 218 ELSE IF( ALL(td_var%t_dim(1:3)%l_use) )THEN 213 219 214 220 ! detect point to be extrapolated on I-J-K 215 221 CALL logger_debug(" EXTRAP DETECT: detect point "//& 216 & " for variable "//TRIM(td_var%c_name) )222 & " for variable "//TRIM(td_var%c_name) ) 217 223 218 extrap__detect_wrapper(:,:,:)=extrap__detect( td_var )224 if_detect(:,:,:)=extrap__detect( td_var ) 219 225 220 226 ELSE IF( ALL(td_var%t_dim(1:2)%l_use) )THEN … … 222 228 ! detect point to be extrapolated on I-J 223 229 CALL logger_debug(" EXTRAP DETECT: detect horizontal point "//& 224 & " for variable "//TRIM(td_var%c_name) )230 & " for variable "//TRIM(td_var%c_name) ) 225 231 226 extrap__detect_wrapper(:,:,1:1)=extrap__detect( td_var )232 if_detect(:,:,1:1)=extrap__detect( td_var ) 227 233 228 234 ELSE IF( td_var%t_dim(3)%l_use )THEN … … 230 236 ! detect point to be extrapolated on K 231 237 CALL logger_debug(" EXTRAP DETECT: detect vertical point "//& 232 & " for variable "//TRIM(td_var%c_name) )238 & " for variable "//TRIM(td_var%c_name) ) 233 239 234 extrap__detect_wrapper(1:1,1:1,:)=extrap__detect( td_var )240 if_detect(1:1,1:1,:)=extrap__detect( td_var ) 235 241 236 242 ENDIF 237 243 238 244 CALL logger_debug(" EXTRAP DETECT: "//& 239 & TRIM(fct_str(SUM(extrap__detect_wrapper(:,:,:))))//&240 & " points to be extrapolated" )245 & TRIM(fct_str(SUM(if_detect(:,:,:))))//& 246 & " points to be extrapolated" ) 241 247 242 248 END FUNCTION extrap__detect_wrapper 249 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 SUBROUTINE extrap__fill_value_wrapper(td_var, id_radius) 243 251 !------------------------------------------------------------------- 244 252 !> @brief … … 260 268 !> @date June, 2015 261 269 !> - select all land points for extrapolation 262 ! 270 !> 263 271 !> @param[inout] td_var variable structure 264 272 !> @param[in] id_radius radius of the halo used to compute extrapolation 265 273 !------------------------------------------------------------------- 266 SUBROUTINE extrap__fill_value_wrapper( td_var, & 267 & id_radius ) 274 268 275 IMPLICIT NONE 276 269 277 ! Argument 270 278 TYPE(TVAR) , INTENT(INOUT) :: td_var … … 311 319 312 320 END SUBROUTINE extrap__fill_value_wrapper 321 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 322 SUBROUTINE extrap__fill_value(td_var, cd_method, id_radius) 313 323 !------------------------------------------------------------------- 314 324 !> @brief … … 325 335 !> @date June, 2015 326 336 !> - select all land points for extrapolation 327 ! 337 !> 328 338 !> @param[inout] td_var variable structure 329 339 !> @param[in] cd_method extrapolation method 330 340 !> @param[in] id_radius radius of the halo used to compute extrapolation 331 341 !------------------------------------------------------------------- 332 SUBROUTINE extrap__fill_value( td_var, cd_method, & 333 & id_radius ) 342 334 343 IMPLICIT NONE 344 335 345 ! Argument 336 346 TYPE(TVAR) , INTENT(INOUT) :: td_var … … 383 393 384 394 END SUBROUTINE extrap__fill_value 395 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 396 SUBROUTINE extrap__3D(dd_value, dd_fill, id_detect,& 397 & cd_method, id_radius) 385 398 !------------------------------------------------------------------- 386 399 !> @brief … … 401 414 !> - compute coef indices to be used 402 415 !> - bug fix: force coef indice to 1, for dimension lenth equal to 1 403 ! 416 !> 404 417 !> @param[inout] dd_value 3D array of variable to be extrapolated 405 418 !> @param[in] dd_fill FillValue of variable … … 408 421 !> @param[in] id_radius radius of the halo used to compute extrapolation 409 422 !------------------------------------------------------------------- 410 SUBROUTINE extrap__3D( dd_value, dd_fill, id_detect,& 411 & cd_method, id_radius ) 423 412 424 IMPLICIT NONE 425 413 426 ! Argument 414 427 REAL(dp) , DIMENSION(:,:,:,:), INTENT(INOUT) :: dd_value … … 461 474 DO jl=1,il_shape(4) 462 475 463 ! in titialise table of poitnto be extrapolated476 ! initialise table of point to be extrapolated 464 477 il_detect(:,:,:)=id_detect(:,:,:) 465 478 … … 840 853 841 854 END SUBROUTINE extrap__3D 855 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 PURE FUNCTION extrap__3D_min_error_coef(dd_value) & 857 & RESULT (df_value) 842 858 !------------------------------------------------------------------- 843 859 !> @brief … … 852 868 !> @date July, 2015 853 869 !> - decrease weight of third dimension 854 ! 870 !> 855 871 !> @param[in] dd_value 3D array of variable to be extrapolated 856 872 !> @return 3D array of coefficient for minimum error extrapolation 857 873 !------------------------------------------------------------------- 858 PURE FUNCTION extrap__3D_min_error_coef( dd_value )859 874 860 875 IMPLICIT NONE 876 861 877 ! Argument 862 878 REAL(dp) , DIMENSION(:,:,:), INTENT(IN) :: dd_value … … 865 881 REAL(dp), DIMENSION(SIZE(dd_value(:,:,:),DIM=1), & 866 882 & SIZE(dd_value(:,:,:),DIM=2), & 867 & SIZE(dd_value(:,:,:),DIM=3) ) :: extrap__3D_min_error_coef883 & SIZE(dd_value(:,:,:),DIM=3) ) :: df_value 868 884 869 885 ! local variable … … 883 899 884 900 ! init 885 extrap__3D_min_error_coef(:,:,:)=0901 df_value(:,:,:)=0 886 902 887 903 il_shape(:)=SHAPE(dd_value(:,:,:)) … … 912 928 913 929 WHERE( dl_dist(:,:,:) /= 0 ) 914 extrap__3D_min_error_coef(:,:,:)=dl_dist(:,:,:)930 df_value(:,:,:)=dl_dist(:,:,:) 915 931 END WHERE 916 932 … … 918 934 919 935 END FUNCTION extrap__3D_min_error_coef 936 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 PURE FUNCTION extrap__3D_min_error_fill(dd_value, dd_fill, id_radius,& 938 & dd_dfdx, dd_dfdy, dd_dfdz, & 939 & dd_coef) & 940 & RESULT (df_value) 920 941 !------------------------------------------------------------------- 921 942 !> @brief … … 935 956 !> @return extrapolatd value 936 957 !------------------------------------------------------------------- 937 PURE FUNCTION extrap__3D_min_error_fill( dd_value, dd_fill, id_radius, & 938 & dd_dfdx, dd_dfdy, dd_dfdz, & 939 & dd_coef ) 958 940 959 IMPLICIT NONE 960 941 961 ! Argument 942 962 REAL(dp) , DIMENSION(:,:,:), INTENT(IN) :: dd_value … … 949 969 950 970 ! function 951 REAL(dp) :: extrap__3d_min_error_fill971 REAL(dp) :: df_value 952 972 953 973 ! local variable … … 964 984 965 985 ! init 966 extrap__3D_min_error_fill=dd_fill986 df_value=dd_fill 967 987 968 988 il_min=MAX(1,(SIZE(dd_value(:,:,:)))/(1+id_radius*2)) … … 995 1015 ! return value 996 1016 IF( ALL(il_ind(:)/=0) )THEN 997 extrap__3D_min_error_fill=dd_value(il_ind(1),il_ind(2),il_ind(3))1017 df_value=dd_value(il_ind(1),il_ind(2),il_ind(3)) 998 1018 ENDIF 999 1019 … … 1004 1024 1005 1025 END FUNCTION extrap__3D_min_error_fill 1026 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1027 PURE FUNCTION extrap__3D_dist_weight_coef(dd_value) & 1028 & RESULT (df_value) 1006 1029 !------------------------------------------------------------------- 1007 1030 !> @brief … … 1016 1039 !> @date July, 2015 1017 1040 !> - decrease weight of third dimension 1018 ! 1041 !> 1019 1042 !> @param[in] dd_value 3D array of variable to be extrapolated 1020 1043 !> @return 3D array of coefficient for inverse distance weighted extrapolation 1021 1044 !------------------------------------------------------------------- 1022 PURE FUNCTION extrap__3D_dist_weight_coef( dd_value )1023 1045 1024 1046 IMPLICIT NONE 1047 1025 1048 ! Argument 1026 REAL(dp) 1049 REAL(dp), DIMENSION(:,:,:), INTENT(IN) :: dd_value 1027 1050 1028 1051 ! function 1029 1052 REAL(dp), DIMENSION(SIZE(dd_value(:,:,:),DIM=1), & 1030 1053 & SIZE(dd_value(:,:,:),DIM=2), & 1031 & SIZE(dd_value(:,:,:),DIM=3) ) :: extrap__3D_dist_weight_coef1054 & SIZE(dd_value(:,:,:),DIM=3) ) :: df_value 1032 1055 1033 1056 ! local variable … … 1047 1070 1048 1071 ! init 1049 extrap__3D_dist_weight_coef(:,:,:)=01072 df_value(:,:,:)=0 1050 1073 1051 1074 il_shape(:)=SHAPE(dd_value(:,:,:)) … … 1076 1099 1077 1100 WHERE( dl_dist(:,:,:) /= 0 ) 1078 extrap__3D_dist_weight_coef(:,:,:)=1./dl_dist(:,:,:)1101 df_value(:,:,:)=1./dl_dist(:,:,:) 1079 1102 END WHERE 1080 1103 … … 1082 1105 1083 1106 END FUNCTION extrap__3D_dist_weight_coef 1107 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 FUNCTION extrap__3D_dist_weight_fill(dd_value, dd_fill, id_radius, & 1109 & dd_coef) & 1110 & RESULT (df_value) 1084 1111 !------------------------------------------------------------------- 1085 1112 !> @brief … … 1091 1118 !> @author J.Paul 1092 1119 !> @date November, 2013 - Initial Version 1093 ! 1120 !> 1094 1121 !> @param[in] dd_value 3D array of variable to be extrapolated 1095 1122 !> @param[in] dd_fill FillValue of variable … … 1098 1125 !> @return extrapolatd value 1099 1126 !------------------------------------------------------------------- 1100 FUNCTION extrap__3D_dist_weight_fill( dd_value, dd_fill, id_radius, & 1101 & dd_coef ) 1127 1102 1128 IMPLICIT NONE 1129 1103 1130 ! Argument 1104 1131 REAL(dp) , DIMENSION(:,:,:), INTENT(IN) :: dd_value … … 1108 1135 1109 1136 ! function 1110 REAL(dp) :: extrap__3D_dist_weight_fill1137 REAL(dp) :: df_value 1111 1138 1112 1139 ! local variable … … 1124 1151 1125 1152 ! init 1126 extrap__3D_dist_weight_fill=dd_fill1153 df_value=dd_fill 1127 1154 1128 1155 il_min=MAX(1,(SIZE(dd_value(:,:,:)))/(1+id_radius*2)) … … 1154 1181 ! return value 1155 1182 IF( SUM( dl_coef(:,:,:) ) /= 0 )THEN 1156 extrap__3D_dist_weight_fill = & 1157 & SUM( dl_value(:,:,:) )/SUM( dl_coef(:,:,:) ) 1183 df_value = SUM( dl_value(:,:,:) )/SUM( dl_coef(:,:,:) ) 1158 1184 ENDIF 1159 1185 … … 1164 1190 1165 1191 END FUNCTION extrap__3D_dist_weight_fill 1192 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 SUBROUTINE extrap_add_extrabands(td_var, id_isize, id_jsize) 1166 1194 !------------------------------------------------------------------- 1167 1195 !> @brief … … 1174 1202 !> @author J.Paul 1175 1203 !> @date November, 2013 - Initial version 1176 ! 1204 !> 1177 1205 !> @param[inout] td_var variable 1178 1206 !> @param[in] id_isize i-direction size of extra bands (default=im_minext) … … 1181 1209 !> - invalid special case for grid with north fold 1182 1210 !------------------------------------------------------------------- 1183 SUBROUTINE extrap_add_extrabands(td_var, id_isize, id_jsize ) 1211 1184 1212 IMPLICIT NONE 1213 1185 1214 ! Argument 1186 1215 TYPE(TVAR) , INTENT(INOUT) :: td_var … … 1266 1295 1267 1296 END SUBROUTINE extrap_add_extrabands 1297 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 SUBROUTINE extrap_del_extrabands(td_var, id_isize, id_jsize) 1268 1299 !------------------------------------------------------------------- 1269 1300 !> @brief … … 1281 1312 !> @param[in] id_jsize j-direction size of extra bands (default=im_minext) 1282 1313 !------------------------------------------------------------------- 1283 SUBROUTINE extrap_del_extrabands(td_var, id_isize, id_jsize ) 1314 1284 1315 IMPLICIT NONE 1316 1285 1317 ! Argument 1286 1318 TYPE(TVAR) , INTENT(INOUT) :: td_var … … 1347 1379 1348 1380 END SUBROUTINE extrap_del_extrabands 1381 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1349 1382 END MODULE extrap
Note: See TracChangeset
for help on using the changeset viewer.