58 private :: parentatmossetup
59 private :: parentatmosfinalize
60 private :: parentatmosopen
61 private :: parentatmosinput
62 private :: boundaryatmossetup
63 private :: boundaryatmosoutput
65 private :: parentsurfacesetup
66 private :: parentsurfacefinalize
67 private :: parentsurfaceopen
68 private :: parentsurfaceinput
69 private :: boundarysurfacesetup
70 private :: boundarysurfaceoutput
71 private :: interp_oceanland_data
78 integer,
public,
parameter ::
igrads = 2
80 integer,
private :: ka_org, ks_org, ke_org
81 integer,
private :: ia_org, is_org, ie_org
82 integer,
private :: ja_org, js_org, je_org
83 integer,
private :: lka_org, lks_org, lke_org
84 integer,
private :: lia_org, lis_org, lie_org
85 integer,
private :: lja_org, ljs_org, lje_org
86 integer,
private :: oia_org, ois_org, oie_org
87 integer,
private :: oja_org, ojs_org, oje_org
89 real(
rp),
private,
allocatable :: lon_org (:,:)
90 real(
rp),
private,
allocatable :: lat_org (:,:)
91 real(
rp),
private,
allocatable :: cz_org (:,:,:)
93 real(
rp),
private,
allocatable :: w_org (:,:,:)
94 real(
rp),
private,
allocatable :: u_org (:,:,:)
95 real(
rp),
private,
allocatable :: v_org (:,:,:)
96 real(
rp),
private,
allocatable :: dens_org(:,:,:)
97 real(
rp),
private,
allocatable :: pt_org (:,:,:)
98 real(
rp),
private,
allocatable :: temp_org(:,:,:)
99 real(
rp),
private,
allocatable :: pres_org(:,:,:)
100 real(
rp),
private,
allocatable :: qtrc_org (:,:,:,:)
101 real(
rp),
private,
allocatable :: qv_org (:,:,:)
102 real(
rp),
private,
allocatable :: rh_org (:,:,:)
103 real(
rp),
private,
allocatable :: qhyd_org (:,:,:,:)
104 real(
rp),
private,
allocatable :: qnum_org (:,:,:,:)
106 real(
rp),
private,
allocatable :: llon_org (:,:)
107 real(
rp),
private,
allocatable :: llat_org (:,:)
109 real(
rp),
private,
allocatable :: olon_org (:,:)
110 real(
rp),
private,
allocatable :: olat_org (:,:)
112 real(
rp),
private,
allocatable :: rotc_org(:,:,:)
114 integer,
private :: itp_nh_a = 4
115 integer,
private :: itp_nh_l = 4
116 integer,
private :: itp_nh_o = 4
117 integer,
private :: itp_nh_ol = 5
119 integer,
private,
parameter :: i_intrp_linear = 0
120 integer,
private,
parameter :: i_intrp_dstwgt = 1
121 integer,
private :: itp_type_a
122 integer,
private :: itp_type_l
123 integer,
private :: itp_type_o
125 integer,
private,
allocatable :: igrd ( :,:,:)
126 integer,
private,
allocatable :: jgrd ( :,:,:)
127 real(
rp),
private,
allocatable :: hfact( :,:,:)
128 integer,
private,
allocatable :: kgrd (:,:,:,:,:)
129 real(
rp),
private,
allocatable :: vfact(:, :,:,:)
131 integer,
private,
allocatable :: oigrd (:,:,:)
132 integer,
private,
allocatable :: ojgrd (:,:,:)
133 real(
rp),
private,
allocatable :: ohfact(:,:,:)
135 logical,
private :: ol_interp
136 real(
rp),
private,
allocatable :: hfact_ol(:,:,:)
137 integer,
private,
allocatable :: igrd_ol (:,:,:)
138 integer,
private,
allocatable :: jgrd_ol (:,:,:)
140 logical,
private :: serial_atmos
141 logical,
private :: serial_land
142 logical,
private :: serial_ocean
143 logical,
private :: do_read_atmos
144 logical,
private :: do_read_land
145 logical,
private :: do_read_ocean
147 logical,
private :: mixing_ratio
148 logical,
private :: temp2pt
149 logical,
private :: update_coord
150 logical,
private :: use_waterratio
152 integer,
private,
parameter :: i_intrp_off = 0
153 integer,
private,
parameter :: i_intrp_mask = 1
154 integer,
private,
parameter :: i_intrp_fill = 2
156 integer,
private :: i_intrp_land_temp
157 integer,
private :: i_intrp_land_water
158 integer,
private :: i_intrp_land_sfc_temp
159 integer,
private :: i_intrp_ocean_temp
160 integer,
private :: i_intrp_ocean_sfc_temp
163 real(
rp),
private,
parameter :: maskval_tg = 298.0_rp
164 real(
rp),
private,
parameter :: maskval_strg = 0.02_rp
169 integer,
private :: number_of_files = 1
170 integer,
private :: number_of_tsteps = -1
171 integer,
private :: number_of_skip_tsteps = 0
173 logical,
private :: serial_proc_read = .true.
175 character(len=H_LONG),
private :: filetype_org =
''
176 character(len=H_LONG),
private :: basename_org =
''
177 logical,
private :: basename_add_num = .false.
179 character(len=H_LONG),
private :: basename_boundary =
''
180 logical,
private :: boundary_postfix_timelabel = .false.
181 character(len=H_LONG),
private :: boundary_title =
'SCALE-RM BOUNDARY CONDITION for REAL CASE'
182 character(len=H_SHORT),
private :: boundary_dtype =
'DEFAULT'
183 real(
dp),
private :: boundary_update_dt = 0.0_dp
185 integer,
private :: filter_order = 8
186 integer,
private :: filter_niter = 0
188 logical,
private :: use_file_density = .false.
189 logical,
private :: pt_dry = .true.
190 logical,
private :: same_mp_type = .false.
191 character(len=4),
private :: upper_qv_type =
"ZERO"
195 character(len=H_SHORT),
private :: intrp_type =
"LINEAR"
199 logical,
private :: first_atmos = .true.
200 logical,
private :: first_surface = .true.
219 atmos_thermodyn_specific_heat
222 logical :: use_sfc_diagnoses = .false.
223 logical :: use_data_under_sfc = .true.
224 logical :: use_nonhydro_dens_boundary = .false.
225 logical :: skip_vertical_range_check = .false.
228 namelist / param_mkinit_real_atmos / &
231 number_of_skip_tsteps, &
237 boundary_postfix_timelabel, &
240 boundary_update_dt, &
245 use_nonhydro_dens_boundary, &
247 use_data_under_sfc, &
251 skip_vertical_range_check
253 character(len=6) :: basename_num
254 character(len=H_LONG) :: basename_out_mod
255 character(len=19) :: timelabel
261 integer :: vid_atmos(5+
qa)
262 logical :: qtrc_flag(
qa)
282 integer :: ifile, istep, t, tall
283 integer ::
k, i, j, iq
288 log_info(
'REALINPUT_atmos',*)
'Setup'
292 read(
io_fid_conf,nml=param_mkinit_real_atmos,iostat=ierr)
294 log_info(
"REALINPUT_atmos",*)
'Not found namelist. Default used.'
295 elseif( ierr > 0 )
then
296 log_error(
"REALINPUT_atmos",*)
'Not appropriate names in namelist PARAM_MKINIT_REAL_ATMOS. Check!'
299 log_nml(param_mkinit_real_atmos)
301 if ( boundary_update_dt <= 0.0_dp )
then
302 log_error(
"REALINPUT_atmos",*)
'BOUNDARY_UPDATE_DT is necessary in real case preprocess'
306 if ( number_of_files > 1 .OR. basename_add_num )
then
307 basename_num =
'_00000'
312 select case( intrp_type )
315 itp_type_a = i_intrp_linear
316 case (
"DIST-WEIGHT" )
318 itp_type_a = i_intrp_dstwgt
320 log_error(
"REALINPUT_atmos",*)
'Unsupported type of INTRP_TYPE : ', trim(intrp_type)
321 log_error_cont(*)
' It must be "LINEAR" or "DIST-WEIGHT"'
325 call parentatmossetup( filetype_org, &
335 if ( timelen < number_of_tsteps )
then
336 log_error(
"REALINPUT_atmos",*)
'time dimension in file is shorter than NUMBER_OF_TSTEPS', timelen, number_of_tsteps
339 if ( number_of_tsteps < 1 )
then
340 number_of_tsteps = timelen
344 log_info(
"REALINPUT_atmos",*)
'Number of temporal data in each file : ', number_of_tsteps
346 do ifile = 1, number_of_files
348 if ( number_of_files > 1 .OR. basename_add_num )
then
349 write(basename_num,
'(A,I5.5)')
'_', ifile-1
355 if ( basename_num ==
"" )
then
356 log_info(
"REALINPUT_atmos",*)
'read external data from : ', trim(basename_org)
358 log_info(
"REALINPUT_atmos",*)
'read external data from : ', trim(basename_org),
' (', trim(basename_num),
')'
361 call parentatmosopen( filetype_org, basename_org, basename_num )
363 do istep = 1, number_of_tsteps
365 tall = number_of_tsteps * (ifile-1) + istep
366 t = tall - number_of_skip_tsteps
369 log_progress(
'(1x,A,I4,A,I5,A,I6,A)') &
370 '[file,step,cons.] = [', ifile,
',', istep,
',', tall,
'] ...skip.'
374 if ( t == 1 .OR. basename_boundary /=
'' )
then
376 log_progress(
'(1x,A,I4,A,I5,A,I6,A)') &
377 '[file,step,cons.] = [', ifile,
',', istep,
',', tall,
']'
380 call parentatmosinput( filetype_org, &
385 use_data_under_sfc, &
387 skip_vertical_range_check, &
401 log_progress(
'(1x,A,I4,A,I5,A,I6,A)') &
402 '[file,step,cons.] = [', ifile,
',', istep,
',', tall,
'] ...skip.'
408 log_info(
"REALINPUT_atmos",*)
'store initial state.'
416 dens(
k,i,j) = dens_in(
k,i,j)
417 momz(
k,i,j) = momz_in(
k,i,j)
418 momx(
k,i,j) = momx_in(
k,i,j)
419 momy(
k,i,j) = momy_in(
k,i,j)
420 rhot(
k,i,j) = rhot_in(
k,i,j)
432 qtrc(
k,i,j,iq) = qtrc_in(
k,i,j,iq)
442 if ( basename_boundary /=
'' )
then
445 if ( boundary_postfix_timelabel )
then
447 basename_out_mod = trim(basename_boundary)//
'_'//trim(timelabel)
449 basename_out_mod = trim(basename_boundary)
452 call boundaryatmossetup( basename_out_mod, &
455 boundary_update_dt, &
461 if ( use_nonhydro_dens_boundary )
then
462 call atmos_thermodyn_specific_heat(
ka,
ks,
ke,
ia, 1,
ia,
ja, 1,
ja,
qa, &
465 qdry(:,:,:), rtot(:,:,:), cvtot(:,:,:), cptot(:,:,:) )
470 dens_in(
k,i,j) = ( pres_in(
k,i,j) / p00 )**( cvtot(
k,i,j) / cptot(
k,i,j) ) * p00 / ( rtot(
k,i,j) * pt_in(
k,i,j) )
476 call boundaryatmosoutput( dens_in(:,:,:), &
485 boundary_update_dt, &
492 call parentatmosfinalize( filetype_org )
566 logical :: use_file_landwater = .true.
567 real(
rp) :: init_landwater_ratio = 0.5_rp
569 real(
rp) :: init_ocean_alb_lw = 0.04_rp
570 real(
rp) :: init_ocean_alb_sw = 0.10_rp
571 real(
rp) :: init_ocean_z0w = 1.0e-3_rp
572 character(len=H_SHORT) :: intrp_land_temp =
'off'
573 character(len=H_SHORT) :: intrp_land_water =
'off'
574 character(len=H_SHORT) :: intrp_land_sfc_temp =
'off'
575 character(len=H_SHORT) :: intrp_ocean_temp =
'off'
576 character(len=H_SHORT) :: intrp_ocean_sfc_temp =
'off'
577 integer :: intrp_iter_max = 5
578 character(len=H_SHORT) :: soilwater_ds2vc =
'limit'
579 logical :: soilwater_ds2vc_flag
580 logical :: elevation_correction = .true.
581 logical :: elevation_correction_land
582 logical :: elevation_correction_ocean
584 namelist / param_mkinit_real_land / &
587 number_of_skip_tsteps, &
592 boundary_postfix_timelabel, &
594 boundary_update_dt, &
595 use_file_landwater, &
596 init_landwater_ratio, &
601 intrp_land_sfc_temp, &
606 elevation_correction, &
609 namelist / param_mkinit_real_ocean / &
612 number_of_skip_tsteps, &
617 boundary_postfix_timelabel, &
619 boundary_update_dt, &
625 intrp_ocean_sfc_temp, &
631 character(len=6) :: filetype_land
632 character(len=6) :: filetype_ocean
633 character(len=6) :: basename_land
634 character(len=6) :: basename_ocean
639 real(
rp) :: land_sfc_temp_in (
ia,
ja)
643 real(
rp) :: urban_tc_in(
ia,
ja)
644 real(
rp) :: urban_qc_in(
ia,
ja)
645 real(
rp) :: urban_uc_in(
ia,
ja)
646 real(
rp) :: urban_sfc_temp_in(
ia,
ja)
651 real(
rp) :: ocean_sfc_temp_in (
ia,
ja)
653 real(
rp) :: ocean_sfc_z0_in (
ia,
ja)
655 integer :: number_of_files_land = 1
656 integer :: number_of_files_ocean = 1
657 integer :: number_of_tsteps_land = 1
658 integer :: number_of_tsteps_ocean = 1
659 integer :: number_of_skip_tsteps_land = 0
660 integer :: number_of_skip_tsteps_ocean = 0
662 character(len=H_LONG) :: basename_org_land =
''
663 character(len=H_LONG) :: basename_org_ocean =
''
664 character(len=H_LONG) :: basename_boundary_land =
''
665 character(len=H_LONG) :: basename_boundary_ocean =
''
666 logical :: boundary_postfix_timelabel_land = .false.
667 logical :: boundary_postfix_timelabel_ocean = .false.
668 character(len=H_LONG) :: boundary_title_land =
'SCALE-RM BOUNDARY CONDITION for REAL CASE'
669 character(len=H_LONG) :: boundary_title_ocean =
'SCALE-RM BOUNDARY CONDITION for REAL CASE'
670 real(
dp) :: boundary_update_dt_land = 0.0_dp
671 real(
dp) :: boundary_update_dt_ocean = 0.0_dp
672 logical :: basename_add_num_land
673 logical :: basename_add_num_ocean
675 real(
rp),
allocatable :: lst_ocean(:,:)
676 real(
rp),
allocatable :: lz_org(:)
677 real(
rp),
allocatable :: topo_org(:,:)
678 real(
rp),
allocatable :: lmask_org(:,:)
679 real(
rp),
allocatable :: omask_org(:,:)
681 integer :: mdlid_land, mdlid_ocean
682 integer :: ldims(3), odims(2)
684 integer :: totaltimesteps = 1
685 integer :: timelen_land, timelen_ocean
688 character(len=H_LONG) :: basename_out_mod
689 character(len=19) :: timelabel
692 integer :: vid_sfc(10)
695 logical :: multi_land
696 logical :: multi_ocean
698 integer :: oistep, listep
700 integer :: idir, irgn
702 integer ::
k, i, j, n
711 if ( .not. land_flag .or. .not.
ocean_do )
then
712 log_error(
"REALINPUT_surface",*)
'OCEAN_ and LAND_DYN_TYPE must be set'
717 log_info(
'REALINPUT_surface',*)
'Setup LAND'
724 read(
io_fid_conf,nml=param_mkinit_real_land,iostat=ierr)
726 log_info(
"REALINPUT_surface",*)
'Not found namelist. Default used.'
727 elseif( ierr > 0 )
then
728 log_error(
"REALINPUT_surface",*)
'Not appropriate names in namelist PARAM_MKINIT_REAL_LAND. Check!'
731 log_nml(param_mkinit_real_land)
733 number_of_files_land = number_of_files
734 number_of_tsteps_land = number_of_tsteps
735 number_of_skip_tsteps_land = number_of_skip_tsteps
736 filetype_land = filetype_org
737 basename_org_land = basename_org
738 basename_add_num_land = basename_add_num
739 basename_boundary_land = basename_boundary
740 boundary_postfix_timelabel_land = boundary_postfix_timelabel
741 boundary_title_land = boundary_title
742 boundary_update_dt_land = boundary_update_dt
743 elevation_correction_land = elevation_correction
745 if ( number_of_files > 1 .OR. basename_add_num_land )
then
746 basename_land =
"_00000"
763 select case( soilwater_ds2vc )
765 soilwater_ds2vc_flag = .true.
767 soilwater_ds2vc_flag = .false.
769 log_error(
"REALINPUT_surface",*)
'Unsupported SOILWATER_DS2CV TYPE:', trim(soilwater_ds2vc)
777 select case( intrp_type )
780 itp_type_l = i_intrp_linear
781 case (
"DIST-WEIGHT" )
783 itp_type_l = i_intrp_dstwgt
785 log_error(
"REALINPUT_surface",*)
'Unsupported type of INTRP_TYPE : ', trim(intrp_type)
786 log_error_cont(*)
' It must be "LINEAR" or "DIST-WEIGHT"'
793 log_info(
'REALINPUT_surface',*)
'Setup OCEAN'
797 read(
io_fid_conf,nml=param_mkinit_real_ocean,iostat=ierr)
799 log_info(
"REALINPUT_surface",*)
'Not found namelist. Default used.'
800 elseif( ierr > 0 )
then
801 log_error(
"REALINPUT_surface",*)
'Not appropriate names in namelist PARAM_MKINIT_REAL_OCEAN. Check!'
804 log_nml(param_mkinit_real_ocean)
806 number_of_files_ocean = number_of_files
807 number_of_tsteps_ocean = number_of_tsteps
808 number_of_skip_tsteps_ocean = number_of_skip_tsteps
809 filetype_ocean = filetype_org
810 basename_org_ocean = basename_org
811 basename_add_num_ocean = basename_add_num
812 basename_boundary_ocean = basename_boundary
813 boundary_postfix_timelabel_ocean = boundary_postfix_timelabel
814 boundary_title_ocean = boundary_title
815 boundary_update_dt_ocean = boundary_update_dt
816 elevation_correction_ocean = elevation_correction
818 if ( number_of_files > 1 .OR. basename_add_num_ocean )
then
819 basename_ocean =
"_00000"
826 serial_ocean = .true.
828 select case( intrp_type )
831 itp_type_o = i_intrp_linear
832 case (
"DIST-WEIGHT" )
834 itp_type_o = i_intrp_dstwgt
836 log_error(
"REALINPUT_surface",*)
'Unsupported type of INTRP_TYPE : ', trim(intrp_type)
837 log_error_cont(*)
' It must be "LINEAR" or "DIST-WEIGHT"'
843 multi_land = ( number_of_files_land * number_of_tsteps_land - number_of_skip_tsteps_land ) > 1
844 multi_ocean = basename_boundary_ocean .ne.
''
846 if ( ( multi_land .and. multi_ocean ) .AND. &
847 ( ( number_of_files_land .NE. number_of_files_ocean ) .OR. &
848 ( number_of_tsteps_land .NE. number_of_tsteps_ocean ) .OR. &
849 ( number_of_skip_tsteps_land .NE. number_of_skip_tsteps_ocean ) .OR. &
850 ( basename_boundary_land .NE. basename_boundary_ocean ) .OR. &
851 ( boundary_postfix_timelabel_land .NEQV. boundary_postfix_timelabel_ocean ) .OR. &
852 ( boundary_title_land .NE. boundary_title_ocean ) .OR. &
853 ( boundary_update_dt_land .NE. boundary_update_dt_ocean ) ) )
then
854 log_error(
"REALINPUT_surface",*)
'The following LAND/OCEAN parameters must be consistent due to technical problem:'
855 log_error_cont(*)
' NUMBER_OF_FILES, NUMBER_OF_TSTEPS, NUMBER_OF_SKIP_TSTEPS,'
856 log_error_cont(*)
' BASENAME_BOUNDARY, BOUNDARY_POSTFIX_TIMELABEL, BOUNDARY_TITLE, BOUNDARY_UPDATE_DT.'
860 if ( multi_land .and. .not. multi_ocean )
then
861 log_error(
"REALINPUT_surface",*)
'To output boundary data for land data, it is necessary to output ocean data'
865 call parentsurfacesetup( ldims, odims, &
871 basename_org_ocean, &
876 use_file_landwater, &
880 intrp_land_sfc_temp, &
882 intrp_ocean_sfc_temp )
884 if ( timelen_land < number_of_tsteps_land )
then
885 log_error(
"REALINPUT_surface",*)
'time dimension in file is shorter than NUMBER_OF_TSTEPS_LAND', timelen_land, number_of_tsteps_land
889 if ( timelen_ocean < number_of_tsteps_ocean )
then
890 log_error(
"REALINPUT_surface",*)
'time dimension in file is shorter than NUMBER_OF_TSTEPS_OCEAN', timelen_ocean, number_of_tsteps_ocean
894 if ( number_of_tsteps_land < 1 )
then
895 number_of_tsteps_land = timelen_land
897 if ( number_of_tsteps_ocean < 1 )
then
898 number_of_tsteps_ocean = timelen_ocean
901 totaltimesteps = number_of_files_ocean * number_of_tsteps_ocean
903 if ( totaltimesteps <= number_of_skip_tsteps_ocean )
then
904 log_error(
"REALSINPUT_surface",*)
"NUMBER_OF_FILES_OCEAN * NUMBER_OF_TSTEPS_OCEAN <= NUMBER_OF_SKIP_TSTEPS_OCEAN"
907 if ( multi_ocean )
then
908 if ( boundary_update_dt_ocean <= 0.0_dp )
then
909 log_error(
"REALINPUT_surface",*)
'BOUNDARY_UPDATE_DT is necessary in real case preprocess'
914 allocate( lz_org(lka_org) )
915 allocate( topo_org(lia_org, lja_org) )
916 allocate( lmask_org(lia_org, lja_org) )
917 allocate( omask_org(oia_org, oja_org) )
918 allocate( lst_ocean(oia_org, oja_org) )
921 do n = 1, number_of_files_ocean
923 if ( number_of_files_land > 1 .OR. basename_add_num_land )
then
924 if ( multi_land )
then
925 write(basename_land,
'(A,I5.5)')
'_', n-1
927 write(basename_land,
'(A,I5.5)')
'_', number_of_skip_tsteps_land / number_of_tsteps_land
932 if ( number_of_files_ocean > 1 .OR. basename_add_num_ocean )
then
933 write(basename_ocean,
'(A,I5.5)')
'_', n-1
939 log_info(
"REALINPUT_surface",*)
'Target Postfix Name (Land) : ', trim(basename_land)
940 log_info(
"REALINPUT_surface",*)
'Target Postfix Name (Ocean): ', trim(basename_ocean)
941 log_info(
"REALINPUT_surface",*)
'Time Steps in One File : ', number_of_tsteps
943 call parentsurfaceopen( filetype_land, filetype_ocean, &
944 basename_org_land, basename_org_ocean, &
945 basename_land, basename_ocean )
947 do oistep = 1, number_of_tsteps_ocean
949 tall = number_of_tsteps_ocean * (n-1) + oistep
950 t = tall - number_of_skip_tsteps_ocean
952 log_progress(
'(1x,A,I4,A,I5,A,I6,A)') &
953 '[file,step,cons.] = [', n,
',', oistep,
',', tall,
'] ...skip.'
956 if ( t > 1 .and. .not. multi_ocean .and. .not. multi_land )
exit
958 if ( multi_land )
then
961 listep = mod(number_of_skip_tsteps_land, number_of_tsteps_land) + 1
966 call parentsurfaceinput( land_temp_in(:,:,:), &
967 land_water_in(:,:,:), &
968 land_sfc_temp_in(:,:), &
969 land_sfc_albedo_in(:,:,:,:), &
973 urban_sfc_temp_in(:,:), &
974 urban_sfc_albedo_in(:,:,:,:), &
976 lz_org(:), topo_org(:,:), &
977 lmask_org(:,:), omask_org(:,:), &
978 ocean_temp_in(
oks,:,:), &
979 ocean_sfc_temp_in( :,:), &
980 ocean_sfc_albedo_in( :,:,:,:), &
981 ocean_sfc_z0_in( :,:), &
982 basename_land, basename_ocean, &
983 mdlid_land, mdlid_ocean, &
985 use_file_landwater, &
986 init_landwater_ratio, &
988 init_ocean_alb_lw, init_ocean_alb_sw, &
991 soilwater_ds2vc_flag, &
992 elevation_correction_land, &
993 elevation_correction_ocean, &
1059 urban_tr(i,j) = urban_sfc_temp_in(i,j)
1060 urban_tb(i,j) = urban_sfc_temp_in(i,j)
1061 urban_tg(i,j) = urban_sfc_temp_in(i,j)
1102 if ( multi_ocean )
then
1105 if ( boundary_postfix_timelabel_ocean )
then
1107 basename_out_mod = trim(basename_boundary_ocean)//
'_'//trim(timelabel)
1109 basename_out_mod = trim(basename_boundary_ocean)
1112 call boundarysurfacesetup( basename_out_mod, &
1113 boundary_title_ocean, &
1114 boundary_update_dt_ocean, &
1115 multi_ocean, multi_land, &
1120 call boundarysurfaceoutput( land_temp_in(:,:,:), &
1121 land_water_in(:,:,:), &
1122 land_sfc_temp_in(:,:), &
1123 ocean_temp_in(:,:,:), &
1124 ocean_sfc_temp_in(:,:), &
1125 ocean_sfc_z0_in(:,:), &
1126 multi_ocean, multi_land, &
1129 boundary_update_dt_ocean, &
1136 if( t > 0 .and. .not. ( multi_land .or. multi_ocean ) )
exit
1140 deallocate( lst_ocean )
1141 deallocate( lz_org )
1142 deallocate( topo_org )
1143 deallocate( lmask_org )
1144 deallocate( omask_org )
1146 call parentsurfacefinalize( filetype_land, &
1155 subroutine parentatmossetup( &
1161 use_file_density_in, &
1173 mapprojection_rotcoef, &
1184 character(len=*),
intent(in) :: inputtype
1185 character(len=*),
intent(in) :: basename
1186 character(len=*),
intent(in) :: basename_num
1187 logical,
intent(in) :: serial_in
1188 logical,
intent(in) :: same_mptype
1189 logical,
intent(in) :: use_file_density_in
1191 integer,
intent(out) :: dims(6)
1192 integer,
intent(out) :: timelen
1193 logical,
intent(out) :: qtrc_flag(
qa)
1195 real(
rp),
allocatable :: lon_all(:,:)
1196 real(
rp),
allocatable :: lat_all(:,:)
1198 real(
rp) :: lon_min, lon_max
1199 real(
rp) :: lat_min, lat_max
1208 serial_atmos = serial_in
1210 do_read_atmos = .false.
1212 do_read_atmos = .true.
1215 select case(inputtype)
1235 if ( do_read_atmos )
then
1244 mapping_info%mapping_name =
""
1245 mixing_ratio = .false.
1246 update_coord = .true.
1250 log_error(
"ParentAtmosSetup",*)
'Unsupported type of input data : ', trim(inputtype)
1260 if ( serial_atmos )
then
1261 call comm_bcast( 6, dims(:) )
1262 call comm_bcast( timelen )
1264 call comm_bcast(
qa, qtrc_flag(:) )
1266 call comm_bcast( mixing_ratio )
1267 call comm_bcast( update_coord )
1269 call comm_bcast( mapping_info%mapping_name )
1270 call comm_bcast( mapping_info%longitude_of_central_meridian )
1271 call comm_bcast( mapping_info%longitude_of_projection_origin )
1272 call comm_bcast( mapping_info%latitude_of_projection_origin )
1273 call comm_bcast( 2, mapping_info%standard_parallel )
1274 call comm_bcast( mapping_info%rotation )
1276 if ( .not. do_read_atmos )
then
1277 allocate( lon_all(dims(2), dims(3)) )
1278 allocate( lat_all(dims(2), dims(3)) )
1280 call comm_bcast( dims(2), dims(3), lon_all )
1281 call comm_bcast( dims(2), dims(3), lat_all )
1289 call get_ijrange( is_org, ie_org, js_org, je_org, &
1291 lon_min, lon_max, lat_min, lat_max, &
1293 ka_org = dims(1) + 2
1296 ia_org = ie_org - is_org + 1
1297 ja_org = je_org - js_org + 1
1299 allocate( lon_org( ia_org, ja_org) )
1300 allocate( lat_org( ia_org, ja_org) )
1301 allocate( cz_org(ka_org, ia_org, ja_org) )
1303 allocate( w_org(ka_org, ia_org, ja_org ) )
1304 allocate( u_org(ka_org, ia_org, ja_org ) )
1305 allocate( v_org(ka_org, ia_org, ja_org ) )
1306 allocate( pt_org(ka_org, ia_org, ja_org ) )
1307 allocate( temp_org(ka_org, ia_org, ja_org ) )
1308 allocate( pres_org(ka_org, ia_org, ja_org ) )
1309 allocate( dens_org(ka_org, ia_org, ja_org ) )
1310 allocate( qtrc_org(ka_org, ia_org, ja_org,
qa) )
1312 allocate( qv_org(ka_org, ia_org, ja_org ) )
1313 allocate( rh_org(ka_org, ia_org, ja_org ) )
1314 allocate( qhyd_org(ka_org, ia_org, ja_org,
n_hyd) )
1315 allocate( qnum_org(ka_org, ia_org, ja_org,
n_hyd) )
1317 allocate( rotc_org(ia_org, ja_org, 2) )
1319 allocate( igrd(
ia,
ja, itp_nh_a) )
1320 allocate( jgrd(
ia,
ja, itp_nh_a) )
1321 allocate( hfact(
ia,
ja, itp_nh_a) )
1322 allocate( kgrd(
ka, 2,
ia,
ja, itp_nh_a) )
1323 allocate( vfact(
ka,
ia,
ja, itp_nh_a) )
1328 lon_org(i,j) = lon_all(i-1+is_org,j-1+js_org)
1329 lat_org(i,j) = lat_all(i-1+is_org,j-1+js_org)
1333 deallocate( lon_all )
1334 deallocate( lat_all )
1336 if ( mapping_info%mapping_name /=
"" )
then
1338 call mapprojection_rotcoef( &
1339 ia_org, 1, ia_org, ja_org, 1, ja_org, &
1340 lon_org(:,:), lat_org(:,:), &
1341 mapping_info%mapping_name, &
1343 rotc_org(:,:,1), rotc_org(:,:,2) )
1345 rotc_org(:,:,1) = 1.0_rp
1346 rotc_org(:,:,2) = 0.0_rp
1349 first_atmos = .true.
1352 end subroutine parentatmossetup
1356 subroutine parentatmosfinalize( &
1362 character(len=*),
intent(in) :: inputtype
1365 select case(inputtype)
1368 if ( do_read_atmos )
then
1382 deallocate( rotc_org )
1384 deallocate( lon_org )
1385 deallocate( lat_org )
1386 deallocate( cz_org )
1391 deallocate( pt_org )
1392 deallocate( temp_org )
1393 deallocate( pres_org )
1394 deallocate( dens_org )
1395 deallocate( qtrc_org )
1397 deallocate( qv_org )
1398 deallocate( rh_org )
1399 deallocate( qhyd_org )
1400 deallocate( qnum_org )
1403 end subroutine parentatmosfinalize
1408 subroutine parentatmosopen( &
1416 character(len=*),
intent(in) :: inputtype
1417 character(len=*),
intent(in) :: basename_org
1418 character(len=*),
intent(in) :: basename_num
1422 select case(inputtype)
1425 if ( do_read_atmos )
then
1435 end subroutine parentatmosopen
1439 subroutine parentatmosinput( &
1483 thermodyn_qdry => atmos_thermodyn_qdry, &
1484 thermodyn_r => atmos_thermodyn_r, &
1485 thermodyn_cp => atmos_thermodyn_cp, &
1486 thermodyn_rhot2pres => atmos_thermodyn_rhot2pres, &
1487 thermodyn_temp_pres2pott => atmos_thermodyn_temp_pres2pott, &
1488 thermodyn_specific_heat => atmos_thermodyn_specific_heat
1490 psat => atmos_saturation_psat_liq
1492 hydrostatic_buildrho_real => atmos_hydrostatic_buildrho_real
1516 mapprojection_lonlat2xy
1521 character(len=*),
intent(in) :: inputtype
1522 character(len=*),
intent(in) :: basename_num
1523 integer,
intent(in) :: dims(6)
1524 integer,
intent(in) :: istep
1525 logical,
intent(in) :: sfc_diagnoses
1526 logical,
intent(in) :: under_sfc
1527 logical,
intent(in) :: same_mptype
1528 logical,
intent(in) :: skip_vcheck
1529 logical,
intent(in) :: qtrc_flag(
qa)
1531 real(
rp),
intent(out) :: dens(
ka,
ia,
ja)
1532 real(
rp),
intent(out) :: momz(
ka,
ia,
ja)
1533 real(
rp),
intent(out) :: momx(
ka,
ia,
ja)
1534 real(
rp),
intent(out) :: momy(
ka,
ia,
ja)
1535 real(
rp),
intent(out) :: rhot(
ka,
ia,
ja)
1537 real(
rp),
intent(out) :: velz(
ka,
ia,
ja)
1538 real(
rp),
intent(out) :: velx(
ka,
ia,
ja)
1539 real(
rp),
intent(out) :: vely(
ka,
ia,
ja)
1540 real(
rp),
intent(out) :: pott(
ka,
ia,
ja)
1541 real(
rp),
intent(out) :: pres(
ka,
ia,
ja)
1551 real(
rp) :: u_on_map, v_on_map
1553 real(
rp) :: qdry(ka_org,ia_org,ja_org)
1554 real(
rp) :: rtot(ka_org,ia_org,ja_org)
1555 real(
rp) :: cptot(ka_org,ia_org,ja_org)
1556 real(
rp) :: cvtot(ka_org,ia_org,ja_org)
1557 real(
rp) :: qtot, p_sat, qm
1558 real(
rp) :: rhot_tmp
1560 integer :: lm_layer(ia_org,ja_org)
1562 real(
rp) :: x_org(ia_org,ja_org)
1563 real(
rp) :: y_org(ia_org,ja_org)
1564 logical :: zonal, pole
1569 logical :: same_mptype_
1574 logical :: qnum_flag
1581 integer ::
k, i, j, iq
1586 if ( do_read_atmos )
then
1587 select case(inputtype)
1590 ia_org, is_org, ie_org, &
1591 ja_org, js_org, je_org, &
1601 qtrc_org(:,:,:,:), &
1604 qhyd_org(:,:,:,:), &
1605 qnum_org(:,:,:,:), &
1615 same_mptype_ = same_mptype
1618 ia_org, is_org, ie_org, &
1619 ja_org, js_org, je_org, &
1630 qhyd_org(:,:,:,:), &
1631 qtrc_org(:,:,:,:), &
1638 same_mptype_ = .false.
1644 if ( .not. temp2pt )
then
1645 log_error(
"ParentAtmosInput",*)
'When RH is read, TEMP is necessary'
1649 if ( sfc_diagnoses )
then
1659 if ( temp_org(
k,i,j) > undef .and. rh_org(
k,i,j) > undef .and. pres_org(
k,i,j) > undef )
then
1660 call psat( temp_org(
k,i,j), p_sat )
1661 qm = epsvap * rh_org(
k,i,j) * 0.01_rp * p_sat &
1662 / ( pres_org(
k,i,j) - rh_org(
k,i,j) * 0.01_rp * p_sat )
1663 qv_org(
k,i,j) = qm / ( 1.0_rp + qm )
1665 qv_org(
k,i,j) = undef
1675 qv_org(
k,i,j) = undef
1683 select case( upper_qv_type )
1689 if ( qv_org(
k,i,j) == undef ) qv_org(
k,i,j) = qv_org(
k-1,i,j)
1698 if ( qv_org(
k,i,j) == undef ) qv_org(
k,i,j) = 0.0_rp
1703 log_error(
"ParentAtmosInput",*)
'upper_qv_type in PARAM_MKINIT_REAL is invalid! ', trim(upper_qv_type)
1707 if ( mixing_ratio )
then
1714 if ( qv_org(
k,i,j) > undef )
then
1715 qtot = qtot + qv_org(
k,i,j)
1718 if ( qhyd_org(
k,i,j,iq) > undef )
then
1719 qtot = qtot + qhyd_org(
k,i,j,iq)
1722 if( qv_org(
k,i,j) > undef )
then
1723 qv_org(
k,i,j) = qv_org(
k,i,j) / ( 1.0_rp + qtot )
1725 qv_org(
k,i,j) = 0.0_rp
1728 if ( qhyd_org(
k,i,j,iq) > undef )
then
1729 qhyd_org(
k,i,j,iq) = qhyd_org(
k,i,j,iq) / ( 1.0_rp + qtot )
1731 qhyd_org(
k,i,j,iq) = 0.0_rp
1740 if ( .not. same_mptype_ )
then
1741 if ( qnum_flag )
then
1743 qv_org(:,:,:), qhyd_org(:,:,:,:), &
1745 qnum=qnum_org(:,:,:,:) )
1748 qv_org(:,:,:), qhyd_org(:,:,:,:), &
1756 if ( qv_org(
k,i,j) == undef ) qtrc_org(
k,i,j,
qs_mp:
qe_mp) = undef
1762 if ( pt_dry .and. .not. temp2pt )
then
1764 log_error(
'ParentAtmosInput',*)
'PRES is required'
1771 temp_org(
k,i,j) = pt_org(
k,i,j) * ( pres_org(
k,i,j) / pre00 )**(rdry/cpdry)
1778 if ( temp2pt .or. nopres .or. nodens )
then
1779 call thermodyn_specific_heat( &
1780 ka_org, 3, ka_org, ia_org, 1, ia_org, ja_org, 1, ja_org,
qa, &
1781 qtrc_org(:,:,:,:), &
1783 qdry(:,:,:), rtot(:,:,:), cvtot(:,:,:), cptot(:,:,:) )
1788 log_error(
'ParentAtmosInput',*)
'If TEMP is read, PRES is required'
1795 if ( temp_org(
k,i,j) == undef )
then
1796 pt_org(
k,i,j) = undef
1798 call thermodyn_temp_pres2pott( &
1799 temp_org(
k,i,j), pres_org(
k,i,j), &
1800 cptot(
k,i,j), rtot(
k,i,j), &
1810 log_error(
'ParentAtmosInput',*)
'If PRES does not exist, DENS is required'
1818 if ( pt_org(
k,i,j) == undef )
then
1819 pres_org(
k,i,j) = undef
1821 rhot_tmp = pt_org(
k,i,j) * dens_org(
k,i,j)
1822 call thermodyn_rhot2pres( &
1823 rhot_tmp, cvtot(
k,i,j), cptot(
k,i,j), rtot(
k,i,j), &
1831 if ( nodens .and. use_file_density )
then
1832 log_error(
'ParentAtmosInput',*)
'DENS is required when USE_FILE_DENSITY is true'
1843 if( pres_org(
k,i,j) == undef )
then
1844 lm_layer(i,j) =
k + 1
1851 if ( sfc_diagnoses )
then
1853 if ( .not. under_sfc )
then
1859 .not. (cz_org(2,i,j) > undef .and. cz_org(
k,i,j) > cz_org(2,i,j) ) .or. &
1860 .not. (pres_org(2,i,j) > undef .and. pres_org(
k,i,j) > pres_org(2,i,j) ) &
1878 if ( cz_org(2,i,j) > undef .and. &
1879 ( .not. under_sfc .or. cz_org(2,i,j) < cz_org(
k,i,j) ) )
then
1880 dz = cz_org(
k,i,j) - cz_org(2,i,j)
1881 if ( qv_org(2,i,j) > undef ) qv_org(2,i,j) = qtrc_org(
k,i,j,
qs_mp)
1882 if ( temp_org(2,i,j) > undef .and. pres_org(2,i,j) > undef )
then
1883 rtot(2,i,j) = rdry * ( 1.0_rp + epstvap * qv_org(2,i,j) )
1884 dens_org(2,i,j) = pres_org(2,i,j) / ( rtot(2,i,j) * temp_org(2,i,j) )
1885 else if ( pres_org(2,i,j) > undef )
then
1886 dens_org(2,i,j) = - ( pres_org(
k,i,j) - pres_org(2,i,j) ) * 2.0_rp / ( grav * dz ) &
1888 rtot(2,i,j) = rdry * ( 1.0_rp + epstvap * qv_org(2,i,j) )
1889 temp_org(2,i,j) = pres_org(2,i,j) / ( rtot(2,i,j) * dens_org(2,i,j) )
1890 else if ( temp_org(2,i,j) > undef )
then
1891 rtot(2,i,j) = rdry * ( 1.0_rp + epstvap * qv_org(2,i,j) )
1892 dens_org(2,i,j) = ( pres_org(
k,i,j) + grav * dens_org(
k,i,j) * dz * 0.5_rp ) &
1893 / ( rtot(2,i,j) * temp_org(2,i,j) - grav * dz * 0.5_rp )
1894 pres_org(2,i,j) = dens_org(2,i,j) * rtot(2,i,j) * temp_org(2,i,j)
1896 temp_org(2,i,j) = temp_org(
k,i,j) + laps * dz
1897 rtot(2,i,j) = rdry * ( 1.0_rp + epstvap * qv_org(2,i,j) )
1898 dens_org(2,i,j) = ( pres_org(
k,i,j) + grav * dens_org(
k,i,j) * dz * 0.5_rp ) &
1899 / ( rtot(2,i,j) * temp_org(2,i,j) - grav * dz * 0.5_rp )
1900 pres_org(2,i,j) = dens_org(2,i,j) * rtot(2,i,j) * temp_org(2,i,j)
1902 cptot(2,i,j) = cpdry + ( cpvap - cpdry ) * qv_org(2,i,j)
1903 pt_org(2,i,j) = temp_org(2,i,j) * ( pre00 / pres_org(2,i,j) )**(rtot(2,i,j)/cptot(2,i,j))
1908 cz_org(2,i,j) = cz_org(
k,i,j)
1909 w_org(2,i,j) = w_org(
k,i,j)
1910 u_org(2,i,j) = u_org(
k,i,j)
1911 v_org(2,i,j) = v_org(
k,i,j)
1912 pres_org(2,i,j) = pres_org(
k,i,j)
1913 pt_org(2,i,j) = pt_org(
k,i,j)
1914 dens_org(2,i,j) = dens_org(
k,i,j)
1915 qtrc_org(2,i,j,:) = qtrc_org(
k,i,j,:)
1928 if ( pres_org(1,i,j) > undef )
then
1929 temp_org(1,i,j) = temp_org(2,i,j) + laps * cz_org(2,i,j)
1930 rtot(1,i,j) = rdry * ( 1.0_rp + epstvap * qv_org(2,i,j) )
1931 cptot(1,i,j) = cpdry + ( cpvap - cpdry ) * qv_org(2,i,j)
1932 dens_org(1,i,j) = pres_org(1,i,j) / ( rtot(1,i,j) * temp_org(1,i,j) )
1933 pt_org(1,i,j) = temp_org(1,i,j) * ( pre00 / pres_org(1,i,j) )**(rtot(1,i,j)/cptot(1,i,j))
1934 cz_org(1,i,j) = 0.0_rp
1935 w_org(1,i,j) = w_org(2,i,j)
1936 u_org(1,i,j) = u_org(2,i,j)
1937 v_org(1,i,j) = v_org(2,i,j)
1938 qtrc_org(1,i,j,:) = qtrc_org(2,i,j,:)
1940 cz_org(1,i,j) = undef
1941 w_org(1,i,j) = undef
1942 u_org(1,i,j) = undef
1943 v_org(1,i,j) = undef
1944 pres_org(1,i,j) = undef
1945 pt_org(1,i,j) = undef
1946 dens_org(1,i,j) = undef
1947 qtrc_org(1,i,j,:) = undef
1957 cz_org(1:2,i,j) = undef
1958 w_org(1:2,i,j) = undef
1959 u_org(1:2,i,j) = undef
1960 v_org(1:2,i,j) = undef
1961 pres_org(1:2,i,j) = undef
1962 temp_org(1:2,i,j) = undef
1963 dens_org(1:2,i,j) = undef
1964 qtrc_org(1:2,i,j,:) = undef
1976 if ( serial_atmos )
then
1977 if ( first_atmos .or. update_coord )
then
1978 call comm_bcast( ka_org, ia_org, ja_org, cz_org )
1980 call comm_bcast( ka_org, ia_org, ja_org, pres_org )
1981 call comm_bcast( ka_org, ia_org, ja_org, w_org )
1982 call comm_bcast( ka_org, ia_org, ja_org, u_org )
1983 call comm_bcast( ka_org, ia_org, ja_org, v_org )
1984 call comm_bcast( ka_org, ia_org, ja_org, pt_org )
1985 call comm_bcast( ka_org, ia_org, ja_org, dens_org )
1986 call comm_bcast( ka_org, ia_org, ja_org,
qa, qtrc_org )
1987 call comm_bcast( uvmet )
1997 if ( qtrc_org(
k,i,j,iq) .ne. undef )
then
1998 qtrc_org(
k,i,j,iq) = max( qtrc_org(
k,i,j,iq), 0.0_rp )
2008 if ( first_atmos .or. update_coord )
then
2018 skip_z = skip_vcheck )
2020 select case( itp_type_a )
2021 case ( i_intrp_linear )
2023 if ( ia_org == 1 .or. ja_org == 1 )
then
2024 log_error(
"ParentAtmosInput",*)
'LINER interpolation requires nx, ny > 1'
2025 log_error_cont(*)
'Use "DIST-WEIGHT" as INTRP_TYPE of PARAM_MKINIT_REAL_ATMOS'
2032 lat_org(i,j) = sign( min( abs(lat_org(i,j)), pi * 0.499999_rp ), lat_org(i,j) )
2036 call mapprojection_lonlat2xy( ia_org, 1, ia_org, &
2037 ja_org, 1, ja_org, &
2043 zonal = ( maxval(lon_org) - minval(lon_org) ) > 2.0_rp * pi * 0.9_rp
2044 pole = ( maxval(lat_org) > pi * 0.5_rp * 0.9_rp ) .or. ( minval(lat_org) < - pi * 0.5_rp * 0.9_rp )
2045 call interp_factor3d( ka_org, 1, ka_org, &
2049 x_org(:,:), y_org(:,:), &
2058 flag_extrap = .false., &
2062 case ( i_intrp_dstwgt )
2064 call interp_factor3d( itp_nh_a, &
2065 ka_org, 1, ka_org, &
2080 flag_extrap = .false. )
2087 ka_org, 1, ka_org, &
2091 igrd(:,:,:), jgrd(:,:,:), &
2095 cz_org(:,:,:), cz(:,:,:), &
2099 threshold_undef = 1.0_rp, &
2100 wsum = wsum(:,:,:), &
2101 val2 = work(:,:,:) )
2108 if ( w(
k,i,j) .ne. undef )
then
2113 do k = kref-1,
ks, -1
2114 w(
k,i,j) = w(
k+1,i,j) * log( ( cz(
k,i,j) - topo(i,j) ) / z0m(i,j) ) / log( ( cz(
k+1,i,j) - topo(i,j) ) / z0m(i,j) ) * ( 1.0_rp - wsum(
k,i,j) ) &
2115 + work(
k,i,j) * wsum(
k,i,j)
2118 if ( w(
k,i,j) == undef ) w(
k,i,j) = w(
k-1,i,j)
2122 if ( filter_niter > 0 )
then
2124 w(:,:,:), filter_order, filter_niter )
2125 call comm_vars8( w(:,:,:), 1 )
2126 call comm_wait ( w(:,:,:), 1, .false. )
2129 if ( .not. uvmet )
then
2136 if ( u_org(
k,i,j) > undef .and. v_org(
k,i,j) > undef )
then
2137 u_on_map = u_org(
k,i,j) * rotc_org(i,j,1) - v_org(
k,i,j) * rotc_org(i,j,2)
2138 v_on_map = u_org(
k,i,j) * rotc_org(i,j,2) + v_org(
k,i,j) * rotc_org(i,j,1)
2140 u_org(
k,i,j) = u_on_map
2141 v_org(
k,i,j) = v_on_map
2150 ka_org, 1, ka_org, &
2154 igrd(:,:,:), jgrd(:,:,:), &
2158 cz_org(:,:,:), cz(:,:,:), &
2162 threshold_undef = 1.0_rp, &
2163 wsum = wsum(:,:,:), &
2164 val2 = work(:,:,:) )
2170 if ( u(
k,i,j) .ne. undef )
then
2175 do k = kref-1,
ks, -1
2176 u(
k,i,j) = u(
k+1,i,j) * log( ( cz(
k,i,j) - topo(i,j) ) / z0m(i,j) ) / log( ( cz(
k+1,i,j) - topo(i,j) ) / z0m(i,j) ) * ( 1.0_rp - wsum(
k,i,j) ) &
2177 + work(
k,i,j) * wsum(
k,i,j)
2180 if ( u(
k,i,j) == undef ) u(
k,i,j) = u(
k-1,i,j)
2184 if ( filter_niter > 0 )
then
2186 u(:,:,:), filter_order, filter_niter )
2187 call comm_vars8( u(:,:,:), 1 )
2188 call comm_wait ( u(:,:,:), 1, .false. )
2192 ka_org, 1, ka_org, &
2196 igrd(:,:,:), jgrd(:,:,:), &
2200 cz_org(:,:,:), cz(:,:,:), &
2204 threshold_undef = 1.0_rp, &
2205 wsum = wsum(:,:,:), &
2206 val2 = work(:,:,:) )
2212 if ( v(
k,i,j) .ne. undef )
then
2217 do k = kref-1,
ks, -1
2218 v(
k,i,j) = v(
k+1,i,j) * log( ( cz(
k,i,j) - topo(i,j) ) / z0m(i,j) ) / log( ( cz(
k+1,i,j) - topo(i,j) ) / z0m(i,j) ) * ( 1.0_rp - wsum(
k,i,j) ) &
2219 + work(
k,i,j) * wsum(
k,i,j)
2222 if ( v(
k,i,j) == undef ) v(
k,i,j) = v(
k-1,i,j)
2226 if ( filter_niter > 0 )
then
2228 v(:,:,:), filter_order, filter_niter )
2229 call comm_vars8( v(:,:,:), 1 )
2230 call comm_wait ( v(:,:,:), 1, .false. )
2239 u_on_map = u(
k,i,j) * rotc(i,j,1) + v(
k,i,j) * rotc(i,j,2)
2240 v_on_map = -u(
k,i,j) * rotc(i,j,2) + v(
k,i,j) * rotc(i,j,1)
2253 velz(
k,i,j) = 0.5_rp * ( w(
k+1,i,j) + w(
k,i,j) )
2262 velx(
k,i,j) = 0.5_rp * ( u(
k,i+1,j) + u(
k,i,j) )
2271 velx(
k,i,j) = u(
k,i,j)
2279 vely(
k,i,j) = 0.5_rp * ( v(
k,i,j+1) + v(
k,i,j) )
2288 vely(
k,i,j) = v(
k,i,j)
2295 velz( 1:
ks-1,i,j) = 0.0_rp
2296 velz(
ke :
ka ,i,j) = 0.0_rp
2297 velx( 1:
ks-1,i,j) = 0.0_rp
2298 velx(
ke+1:
ka ,i,j) = 0.0_rp
2299 vely( 1:
ks-1,i,j) = 0.0_rp
2300 vely(
ke+1:
ka ,i,j) = 0.0_rp
2304 call comm_vars8( velz(:,:,:), 1 )
2305 call comm_vars8( velx(:,:,:), 2 )
2306 call comm_vars8( vely(:,:,:), 3 )
2307 call comm_wait ( velz(:,:,:), 1, .false. )
2308 call comm_wait ( velx(:,:,:), 2, .false. )
2309 call comm_wait ( vely(:,:,:), 3, .false. )
2312 ka_org, 1, ka_org, &
2316 igrd(:,:,:), jgrd(:,:,:), &
2320 cz_org(:,:,:), cz(:,:,:), &
2324 threshold_undef = 1.0_rp, &
2325 wsum = wsum(:,:,:), &
2326 val2 = work(:,:,:) )
2331 if ( pott(
k,i,j) == undef .and. pott(
k-1,i,j) .ne. undef ) pott(
k,i,j) = pott(
k-1,i,j)
2334 if ( pott(
k,i,j) == undef )
then
2335 pott(
k,i,j) = pott(
k+1,i,j) * ( 1.0_rp - wsum(
k,i,j) ) &
2336 + work(
k,i,j) * wsum(
k,i,j)
2339 pott( 1:
ks-1,i,j) = undef
2340 pott(
ke+1:
ka ,i,j) = undef
2343 if ( filter_niter > 0 )
then
2345 pott(:,:,:), filter_order, filter_niter )
2346 call comm_vars8( pott(:,:,:), 1 )
2347 call comm_wait ( pott(:,:,:), 1, .false. )
2352 if ( ( iq <
qs_mp .or. iq >
qe_mp ) .and. ( .not. qtrc_flag(iq) ) )
then
2357 qtrc(
k,i,j,iq) = undef
2365 ka_org, 1, ka_org, &
2369 igrd(:,:,:), jgrd(:,:,:), &
2373 cz_org(:,:,:), cz(:,:,:), &
2374 qtrc_org(:,:,:,iq), &
2377 threshold_undef = 1.0_rp, &
2378 wsum = wsum(:,:,:), &
2379 val2 = work(:,:,:) )
2384 if ( qtrc(
k,i,j,iq) == undef .and. qtrc(
k-1,i,j,iq) > undef ) qtrc(
k,i,j,iq) = qtrc(
k-1,i,j,iq)
2387 if ( qtrc(
k,i,j,iq) == undef .and. qtrc(
k+1,i,j,iq) > undef )
then
2388 qtrc(
k,i,j,iq) = qtrc(
k+1,i,j,iq) * ( 1.0_rp - wsum(
k,i,j) ) &
2389 + work(
k,i,j) * wsum(
k,i,j)
2393 qtrc(
k,i,j,iq) = max( qtrc(
k,i,j,iq), 0.0_rp )
2395 qtrc( 1:
ks-1,i,j,iq) = 0.0_rp
2396 qtrc(
ke+1:
ka ,i,j,iq) = 0.0_rp
2399 if ( filter_niter > 0 )
then
2409 qtrc(:,:,:,iq), filter_order, filter_niter, &
2410 limiter_sign = one(:,:,:) )
2411 call comm_vars8( qtrc(:,:,:,iq), 1 )
2412 call comm_wait ( qtrc(:,:,:,iq), 1, .false. )
2417 ka_org, 1, ka_org, &
2454 qv(
k,i,j) = qtrc(
k,i,j,
i_qv)
2456 qc(
k,i,j) = qc(
k,i,j) + qtrc(
k,i,j,iq)
2468 pres2(
k,i,j) = pres(
k,i,j)
2473 if ( use_file_density )
then
2475 ka_org, 1, ka_org, &
2479 igrd(:,:,:), jgrd(:,:,:), &
2483 cz_org(:,:,:), cz(:,:,:), &
2486 threshold_undef = 1.0_rp, &
2487 wsum = wsum(:,:,:), &
2488 val2 = work(:,:,:) )
2489 call hydrostatic_buildrho_real(
ka,
ks,
ke,
ia, 1,
ia,
ja, 1,
ja, &
2490 pott(:,:,:), qv(:,:,:), qc(:,:,:), &
2493 dens2(:,:,:), temp(:,:,:) )
2498 if ( dens(
k,i,j) == undef )
then
2499 dens(
k,i,j) = dens2(
k,i,j) * ( 1.0_rp - wsum(
k,i,j) ) &
2500 + work(
k,i,j) * wsum(
k,i,j)
2507 call hydrostatic_buildrho_real(
ka,
ks,
ke,
ia, 1,
ia,
ja, 1,
ja, &
2508 pott(:,:,:), qv(:,:,:), qc(:,:,:), &
2511 dens(:,:,:), temp(:,:,:) )
2514 if ( filter_niter > 0 )
then
2516 dens(:,:,:), filter_order, filter_niter, &
2517 limiter_sign = one(:,:,:) )
2518 call comm_vars8( dens(:,:,:), 1 )
2519 call comm_wait ( dens(:,:,:), 1, .false. )
2526 if ( pres(
k,i,j) == undef ) pres(
k,i,j) = pres2(
k,i,j)
2535 dens( 1:
ks-1,i,j) = 0.0_rp
2536 dens(
ke+1:
ka ,i,j) = 0.0_rp
2544 momz(
k,i,j) = velz(
k,i,j) * 0.5_rp * ( dens(
k+1,i,j) + dens(
k,i,j) )
2553 momx(
k,i,j) = velx(
k,i,j) * 0.5_rp * ( dens(
k,i+1,j) + dens(
k,i,j) )
2562 momx(
k,i,j) = velx(
k,i,j) * dens(
k,i,j)
2570 momy(
k,i,j) = vely(
k,i,j) * 0.5_rp * ( dens(
k,i,j+1) + dens(
k,i,j) )
2579 momy(
k,i,j) = vely(
k,i,j) * dens(
k,i,j)
2587 rhot(
k,i,j) = pott(
k,i,j) * dens(
k,i,j)
2595 momz( 1:
ks-1,i,j) = 0.0_rp
2596 momz(
ke :
ka ,i,j) = 0.0_rp
2597 momx( 1:
ks-1,i,j) = 0.0_rp
2598 momx(
ke+1:
ka ,i,j) = 0.0_rp
2599 momy( 1:
ks-1,i,j) = 0.0_rp
2600 momy(
ke+1:
ka ,i,j) = 0.0_rp
2604 call comm_vars8( momz(:,:,:), 1 )
2605 call comm_vars8( momx(:,:,:), 2 )
2606 call comm_vars8( momy(:,:,:), 3 )
2607 call comm_wait ( momz(:,:,:), 1, .false. )
2608 call comm_wait ( momx(:,:,:), 2, .false. )
2609 call comm_wait ( momy(:,:,:), 3, .false. )
2611 first_atmos = .false.
2616 end subroutine parentatmosinput
2620 subroutine boundaryatmossetup( &
2639 character(len=*),
intent(in) :: basename
2640 character(len=*),
intent(in) :: title
2641 character(len=*),
intent(in) :: datatype
2642 real(
dp),
intent(in) :: timeintv
2643 logical,
intent(in) :: qtrc_flag(
qa)
2644 integer,
intent(out) :: fid
2645 integer,
intent(out) :: vid(5+
qa)
2653 'DENS',
'Reference Density',
'kg/m3',
'ZXYT', datatype, &
2657 'VELZ',
'Reference VELZ',
'm/s',
'ZHXYT', datatype, &
2661 'VELX',
'Reference VELX',
'm/s',
'ZXHYT', datatype, &
2665 'VELY',
'Reference VELY',
'm/s',
'ZXYHT', datatype, &
2669 'PT',
'Reference PT',
'K',
'ZXYT', datatype, &
2678 timeintv = timeintv )
2683 if ( .not. qtrc_flag(iq) ) cycle
2688 timeintv = timeintv )
2694 end subroutine boundaryatmossetup
2698 subroutine boundaryatmosoutput( &
2710 file_cartesc_write_var
2716 real(
rp),
intent(in) :: dens(
ka,
ia,
ja)
2717 real(
rp),
intent(in) :: velz(
ka,
ia,
ja)
2718 real(
rp),
intent(in) :: velx(
ka,
ia,
ja)
2719 real(
rp),
intent(in) :: vely(
ka,
ia,
ja)
2720 real(
rp),
intent(in) :: pott(
ka,
ia,
ja)
2722 logical,
intent(in) :: qtrc_flag(
qa)
2723 integer,
intent(in) :: fid
2724 integer,
intent(in) :: vid(5+
qa)
2725 real(
dp),
intent(in) :: timeintv
2726 integer,
intent(in) :: istep
2736 timeofs = real(istep-1,kind=
dp) * timeintv
2739 work(:,:,:,1) = dens(:,:,:)
2740 call file_cartesc_write_var( fid, vid(1), work(:,:,:,:),
'DENS',
'ZXYT', timeintv, timeofs=timeofs )
2742 work(:,:,:,1) = velz(:,:,:)
2743 call file_cartesc_write_var( fid, vid(2), work(:,:,:,:),
'VELZ',
'ZHXYT', timeintv, timeofs=timeofs )
2745 work(:,:,:,1) = velx(:,:,:)
2746 call file_cartesc_write_var( fid, vid(3), work(:,:,:,:),
'VELX',
'ZXHYT', timeintv, timeofs=timeofs )
2748 work(:,:,:,1) = vely(:,:,:)
2749 call file_cartesc_write_var( fid, vid(4), work(:,:,:,:),
'VELY',
'ZXYHT', timeintv, timeofs=timeofs )
2751 work(:,:,:,1) = pott(:,:,:)
2752 call file_cartesc_write_var( fid, vid(5), work(:,:,:,:),
'PT',
'ZXYT', timeintv, timeofs=timeofs )
2755 call file_cartesc_write_var( fid, vid(5+iq),qtrc(:,:,:,iq:iq),
tracer_name(iq), &
2756 'ZXYT', timeintv, timeofs=timeofs )
2761 if ( .not. qtrc_flag(iq) ) cycle
2762 call file_cartesc_write_var( fid, vid(5+iq),qtrc(:,:,:,iq:iq),
tracer_name(iq), &
2763 'ZXYT', timeintv, timeofs=timeofs )
2769 end subroutine boundaryatmosoutput
2773 subroutine parentsurfacesetup( &
2778 basename_org_land, &
2779 basename_org_ocean, &
2784 use_file_landwater, &
2788 intrp_land_sfc_temp, &
2790 intrp_ocean_sfc_temp )
2805 integer,
intent(out) :: ldims(3)
2806 integer,
intent(out) :: odims(2)
2807 integer,
intent(out) :: lmdlid
2808 integer,
intent(out) :: omdlid
2809 integer,
intent(out) :: timelen_land
2810 integer,
intent(out) :: timelen_ocean
2812 character(len=*),
intent(in) :: basename_org_land
2813 character(len=*),
intent(in) :: basename_org_ocean
2814 character(len=*),
intent(in) :: basename_land
2815 character(len=*),
intent(in) :: basename_ocean
2816 character(len=*),
intent(in) :: filetype_land
2817 character(len=*),
intent(in) :: filetype_ocean
2818 logical,
intent(in) :: use_file_landwater
2819 integer,
intent(in) :: intrp_iter_max
2820 character(len=*),
intent(in) :: intrp_land_temp
2821 character(len=*),
intent(in) :: intrp_land_water
2822 character(len=*),
intent(in) :: intrp_land_sfc_temp
2823 character(len=*),
intent(in) :: intrp_ocean_temp
2824 character(len=*),
intent(in) :: intrp_ocean_sfc_temp
2826 real(
rp),
allocatable :: lon_all(:,:)
2827 real(
rp),
allocatable :: lat_all(:,:)
2829 real(
rp) :: lon_min, lon_max
2830 real(
rp) :: lat_min, lat_max
2837 log_info(
"ParentSurfaceSetup",*)
'Setup'
2842 log_error(
"ParentSurfaceSetup",*)
'LKMAX less than 4: ',
lkmax
2843 log_error_cont(*)
'in Real Case, LKMAX should be set more than 4'
2851 do_read_land = .false.
2853 do_read_land = .true.
2856 select case(filetype_land)
2863 basename_org_land, &
2865 use_file_landwater, &
2875 basename_org_land, &
2880 log_error(
"ParentSurfaceSetup",*)
'Unsupported FILE TYPE:', trim(filetype_land)
2890 if ( serial_land )
then
2891 call comm_bcast( 3, ldims(:) )
2892 call comm_bcast( timelen_land )
2894 if ( .not. do_read_land )
then
2895 allocate( lon_all(ldims(2), ldims(3)) )
2896 allocate( lat_all(ldims(2), ldims(3)) )
2898 call comm_bcast( ldims(2), ldims(3), lon_all )
2899 call comm_bcast( ldims(2), ldims(3), lat_all )
2907 call get_ijrange( lis_org, lie_org, ljs_org, lje_org, &
2908 ldims(2), ldims(3), &
2909 lon_min, lon_max, lat_min, lat_max, &
2911 lis_org = max( lis_org - intrp_iter_max, 1 )
2912 lie_org = min( lie_org + intrp_iter_max, ldims(2) )
2913 ljs_org = max( ljs_org - intrp_iter_max, 1 )
2914 lje_org = min( lje_org + intrp_iter_max, ldims(3) )
2918 lka_org = lke_org - lks_org + 1
2919 lia_org = lie_org - lis_org + 1
2920 lja_org = lje_org - ljs_org + 1
2922 allocate( llon_org(lia_org, lja_org) )
2923 allocate( llat_org(lia_org, lja_org) )
2928 llon_org(i,j) = lon_all(i-1+lis_org,j-1+ljs_org)
2929 llat_org(i,j) = lat_all(i-1+lis_org,j-1+ljs_org)
2933 deallocate( lon_all )
2934 deallocate( lat_all )
2937 select case( intrp_land_temp )
2939 i_intrp_land_temp = i_intrp_off
2941 i_intrp_land_temp = i_intrp_mask
2943 i_intrp_land_temp = i_intrp_fill
2945 log_error(
"ParentSurfaceSetup",*)
'INTRP_LAND_TEMP is invalid. ', intrp_land_temp
2948 select case( intrp_land_sfc_temp )
2950 i_intrp_land_sfc_temp = i_intrp_off
2952 i_intrp_land_sfc_temp = i_intrp_mask
2954 i_intrp_land_sfc_temp = i_intrp_fill
2956 log_error(
"ParentSurfaceSetup",*)
'INTRP_LAND_SFC_TEMP is invalid. ', intrp_land_sfc_temp
2959 select case( intrp_land_water )
2961 i_intrp_land_water = i_intrp_off
2963 i_intrp_land_water = i_intrp_mask
2965 i_intrp_land_water = i_intrp_fill
2967 log_error(
"ParentSurfaceSetup",*)
'INTRP_LAND_WATER is invalid. ', intrp_land_water
2971 select case( lmdlid )
2973 i_intrp_land_temp = i_intrp_mask
2974 i_intrp_land_sfc_temp = i_intrp_mask
2975 i_intrp_land_water = i_intrp_mask
2982 do_read_ocean = .false.
2984 do_read_ocean = .true.
2987 select case(filetype_ocean)
2993 basename_org_ocean, &
3003 basename_org_ocean, &
3007 log_error(
"ParentSurfaceSetup",*)
'Unsupported FILE TYPE:', trim(filetype_ocean)
3017 if ( serial_ocean )
then
3018 call comm_bcast( 2, odims(:) )
3019 call comm_bcast( timelen_ocean )
3021 if ( .not. do_read_ocean )
then
3022 allocate( lon_all(odims(1), odims(2)) )
3023 allocate( lat_all(odims(1), odims(2)) )
3025 call comm_bcast( odims(1), odims(2), lon_all )
3026 call comm_bcast( odims(1), odims(2), lat_all )
3034 call get_ijrange( ois_org, oie_org, ojs_org, oje_org, &
3035 odims(1), odims(2), &
3036 lon_min, lon_max, lat_min, lat_max, &
3038 ois_org = max( ois_org - intrp_iter_max, 1 )
3039 oie_org = min( oie_org + intrp_iter_max, odims(1) )
3040 ojs_org = max( ojs_org - intrp_iter_max, 1 )
3041 oje_org = min( oje_org + intrp_iter_max, odims(2) )
3043 oia_org = oie_org - ois_org + 1
3044 oja_org = oje_org - ojs_org + 1
3046 allocate( olon_org(oia_org, oja_org) )
3047 allocate( olat_org(oia_org, oja_org) )
3052 olon_org(i,j) = lon_all(i-1+ois_org,j-1+ojs_org)
3053 olat_org(i,j) = lat_all(i-1+ois_org,j-1+ojs_org)
3057 deallocate( lon_all )
3058 deallocate( lat_all )
3060 select case( intrp_ocean_temp )
3062 i_intrp_ocean_temp = i_intrp_off
3064 i_intrp_ocean_temp = i_intrp_mask
3066 i_intrp_ocean_temp = i_intrp_fill
3068 log_error(
"ParentSurfaceSetup",*)
'INTRP_OCEAN_TEMP is invalid. ', intrp_ocean_temp
3071 select case( intrp_ocean_sfc_temp )
3073 i_intrp_ocean_sfc_temp = i_intrp_off
3075 i_intrp_ocean_sfc_temp = i_intrp_mask
3077 i_intrp_ocean_sfc_temp = i_intrp_fill
3079 log_error(
"ParentSurfaceSetup",*)
'INTRP_OCEAN_SFC_TEMP is invalid. ', intrp_ocean_sfc_temp
3083 select case( omdlid )
3085 i_intrp_ocean_temp = i_intrp_mask
3086 i_intrp_ocean_sfc_temp = i_intrp_mask
3090 allocate( oigrd(
ia,
ja, itp_nh_a) )
3091 allocate( ojgrd(
ia,
ja, itp_nh_a) )
3092 allocate( ohfact(
ia,
ja, itp_nh_a) )
3094 allocate( hfact_ol(oia_org, oja_org, itp_nh_ol) )
3095 allocate( igrd_ol(oia_org, oja_org, itp_nh_ol) )
3096 allocate( jgrd_ol(oia_org, oja_org, itp_nh_ol) )
3099 end subroutine parentsurfacesetup
3103 subroutine parentsurfaceopen( &
3104 filetype_land, filetype_ocean, &
3105 basename_org_land, basename_org_ocean, &
3106 basename_land, basename_ocean )
3111 character(len=*),
intent(in) :: filetype_land
3112 character(len=*),
intent(in) :: filetype_ocean
3113 character(len=*),
intent(in) :: basename_org_land
3114 character(len=*),
intent(in) :: basename_org_ocean
3115 character(len=*),
intent(in) :: basename_land
3116 character(len=*),
intent(in) :: basename_ocean
3118 select case ( filetype_land )
3125 select case ( filetype_ocean )
3133 end subroutine parentsurfaceopen
3136 subroutine parentsurfacefinalize( &
3144 character(len=*),
intent(in) :: filetype_land
3145 character(len=*),
intent(in) :: filetype_ocean
3149 log_info(
"ParentSurfaceFinalize",*)
'Finalize'
3153 if( serial_land )
then
3155 do_read_land = .true.
3157 do_read_land = .false.
3160 do_read_land = .true.
3163 select case(trim(filetype_land))
3166 if ( do_read_ocean )
then
3176 log_error(
"ParentSurfaceFinalize",*)
'Unsupported FILE TYPE:', trim(filetype_land)
3184 if( serial_ocean )
then
3186 do_read_ocean = .true.
3188 do_read_ocean = .false.
3191 do_read_ocean = .true.
3194 select case(trim(filetype_ocean))
3197 if ( do_read_ocean )
then
3207 log_error(
"ParentSurfaceFinalize",*)
'Unsupported FILE TYPE:', trim(filetype_ocean)
3213 deallocate( llon_org )
3214 deallocate( llat_org )
3216 deallocate( olon_org )
3217 deallocate( olat_org )
3221 deallocate( ohfact )
3223 deallocate( hfact_ol )
3224 deallocate( igrd_ol )
3225 deallocate( jgrd_ol )
3227 first_surface = .true.
3230 end subroutine parentsurfacefinalize
3234 subroutine boundarysurfacesetup( &
3249 character(len=*),
intent(in) :: basename
3250 character(len=*),
intent(in) :: title
3251 real(
dp),
intent(in) :: timeintv
3252 logical,
intent(in) :: multi_ocean
3253 logical,
intent(in) :: multi_land
3254 integer,
intent(out) :: fid
3255 integer,
intent(out) :: vid(10)
3257 character(len=H_SHORT) :: boundary_out_dtype =
'DEFAULT'
3262 if ( multi_land )
then
3264 'LAND_TEMP',
'Reference Land Temperature',
'K', &
3265 'LXYT', boundary_out_dtype, &
3269 'LAND_WATER',
'Reference Land Moisture',
'm3/m3', &
3270 'LXYT', boundary_out_dtype, &
3274 'LAND_SFC_TEMP',
'Reference Land Surface Temperature',
'K', &
3275 'XYT', boundary_out_dtype, &
3280 if ( multi_ocean )
then
3282 'OCEAN_TEMP',
'Reference Ocean Temperature',
'K', &
3283 'OXYT', boundary_out_dtype, &
3287 'OCEAN_SFC_TEMP',
'Reference Ocean Surface Temperature',
'K', &
3288 'XYT', boundary_out_dtype, &
3292 'OCEAN_SFC_Z0',
'Reference Ocean Surface Z0',
'm', &
3293 'XYT', boundary_out_dtype, &
3301 end subroutine boundarysurfacesetup
3305 subroutine parentsurfaceinput( &
3306 tg, strg, lst, albg, &
3307 tc_urb, qc_urb, uc_urb, ust, albu, &
3310 lmask_org, omask_org, &
3311 tw, sst, albw, z0w, &
3312 basename_land, basename_ocean, &
3313 mdlid_land, mdlid_ocean, &
3315 use_file_landwater, &
3316 init_landwater_ratio, &
3317 ! init_landwater_ratio_each, &
3318 init_ocean_alb_lw, &
3319 init_ocean_alb_sw, &
3322 soilwater_ds2vc_flag, &
3323 elevation_correction_land, &
3324 elevation_correction_ocean, &
3328 DENS, MOMX, MOMY, RHOT, QTRC )
3358 real(
rp),
intent(inout) :: tg (
lka,
ia,
ja)
3359 real(
rp),
intent(inout) :: strg(
lka,
ia,
ja)
3360 real(
rp),
intent(inout) :: lst (
ia,
ja)
3362 real(
rp),
intent(inout) :: tc_urb(
ia,
ja)
3363 real(
rp),
intent(inout) :: qc_urb(
ia,
ja)
3364 real(
rp),
intent(inout) :: uc_urb(
ia,
ja)
3365 real(
rp),
intent(inout) :: ust (
ia,
ja)
3367 real(
rp),
intent(inout) :: lst_ocean(oia_org,oja_org)
3368 real(
rp),
intent(inout) :: tw (
ia,
ja)
3369 real(
rp),
intent(inout) :: lz_org(lka_org)
3370 real(
rp),
intent(inout) :: topo_org(lia_org,lja_org)
3371 real(
rp),
intent(inout) :: lmask_org(lia_org,lja_org)
3372 real(
rp),
intent(inout) :: omask_org(oia_org,oja_org)
3373 real(
rp),
intent(out) :: sst (
ia,
ja)
3375 real(
rp),
intent(out) :: z0w (
ia,
ja)
3376 character(len=*),
intent(in) :: basename_land
3377 character(len=*),
intent(in) :: basename_ocean
3378 integer,
intent(in) :: mdlid_land
3379 integer,
intent(in) :: mdlid_ocean
3380 integer,
intent(in) :: ldims(3)
3381 integer,
intent(in) :: odims(2)
3382 logical,
intent(in) :: use_file_landwater
3383 real(
rp),
intent(in) :: init_landwater_ratio
3386 real(
rp),
intent(in) :: init_ocean_alb_lw
3387 real(
rp),
intent(in) :: init_ocean_alb_sw
3388 real(
rp),
intent(in) :: init_ocean_z0w
3389 integer,
intent(in) :: intrp_iter_max
3390 logical,
intent(in) :: soilwater_ds2vc_flag
3391 logical,
intent(in) :: elevation_correction_land
3392 logical,
intent(in) :: elevation_correction_ocean
3393 integer,
intent(in) :: oistep
3394 integer,
intent(in) :: listep
3395 logical,
intent(in) :: multi_land
3396 logical,
intent(in) :: urban_do
3398 real(
rp),
intent(in) :: dens(
ka,
ia,
ja)
3399 real(
rp),
intent(in) :: momx(
ka,
ia,
ja)
3400 real(
rp),
intent(in) :: momy(
ka,
ia,
ja)
3401 real(
rp),
intent(in) :: rhot(
ka,
ia,
ja)
3405 real(
rp) :: tg_org (lka_org,lia_org,lja_org)
3406 real(
rp) :: strg_org (lka_org,lia_org,lja_org)
3407 real(
rp) :: smds_org (lka_org,lia_org,lja_org)
3408 real(
rp) :: lst_org ( lia_org,lja_org)
3409 real(
rp) :: ust_org ( lia_org,lja_org)
3413 real(
rp) :: tw_org (oia_org,oja_org)
3414 real(
rp) :: sst_org (oia_org,oja_org)
3415 real(
rp) :: z0w_org (oia_org,oja_org)
3417 real(
rp) :: omask (oia_org,oja_org)
3420 real(
rp) :: work(lia_org,lja_org)
3427 if ( do_read_land .and. ( first_surface .or. multi_land ) )
then
3429 select case( mdlid_land )
3433 lka_org, lks_org, lke_org, &
3434 lia_org, lis_org, lie_org, &
3435 lja_org, ljs_org, lje_org, &
3437 lst_org, ust_org, albg_org, &
3438 topo_org, lmask_org, &
3440 use_file_landwater, &
3447 lka_org, lks_org, lke_org, &
3448 lia_org, lis_org, lie_org, &
3449 lja_org, ljs_org, lje_org, &
3450 tg_org, strg_org, smds_org, &
3453 topo_org, lmask_org, &
3457 use_file_landwater, &
3470 if ( serial_land .and. ( first_surface .or. multi_land ) )
then
3471 call comm_bcast( lka_org, lia_org, lja_org, tg_org )
3472 if ( use_waterratio )
then
3473 call comm_bcast( lka_org, lia_org, lja_org, smds_org )
3475 call comm_bcast( lka_org, lia_org, lja_org, strg_org )
3477 call comm_bcast( lia_org, lja_org, lst_org )
3478 if ( urban_do )
call comm_bcast( lia_org, lja_org, ust_org )
3480 call comm_bcast( lia_org, lja_org, topo_org )
3481 call comm_bcast( lia_org, lja_org, lmask_org )
3482 call comm_bcast( lka_org, lz_org )
3489 if ( do_read_ocean )
then
3491 select case( mdlid_ocean )
3495 oia_org, ois_org, oie_org, &
3496 oja_org, ojs_org, oje_org, &
3498 albw_org, z0w_org, &
3506 oia_org, ois_org, oie_org, &
3507 oja_org, ojs_org, oje_org, &
3510 basename_ocean, odims, &
3523 if ( serial_ocean )
then
3524 call comm_bcast( oia_org, oja_org, tw_org )
3525 call comm_bcast( oia_org, oja_org, sst_org )
3528 call comm_bcast( oia_org, oja_org, z0w_org )
3529 call comm_bcast( oia_org, oja_org, omask_org )
3536 if ( first_surface )
then
3538 if ( lia_org .ne. oia_org &
3539 .or. lja_org .ne. oja_org )
then
3543 outer:
do j = 1, lja_org
3545 if ( llon_org(i,j) .ne. olon_org(i,j) &
3546 .or. llat_org(i,j) .ne. olat_org(i,j) )
then
3554 if ( ol_interp )
then
3556 call interp_factor2d( itp_nh_ol, &
3571 if ( i_intrp_ocean_temp .ne. i_intrp_off )
then
3572 select case( i_intrp_ocean_temp )
3573 case( i_intrp_mask )
3574 call make_mask( omask, tw_org, oia_org, oja_org, landdata=.false.)
3578 if ( omask_org(i,j) .ne. undef ) omask(i,j) = omask_org(i,j)
3581 case( i_intrp_fill )
3582 call make_mask( omask, tw_org, oia_org, oja_org, landdata=.false.)
3584 call interp_oceanland_data(tw_org, omask, oia_org, oja_org, .false., intrp_iter_max)
3588 if ( i_intrp_ocean_sfc_temp .ne. i_intrp_off )
then
3589 select case( i_intrp_ocean_sfc_temp )
3590 case( i_intrp_mask )
3591 call make_mask( omask, sst_org, oia_org, oja_org, landdata=.false.)
3595 if ( omask_org(i,j) .ne. undef ) omask(i,j) = omask_org(i,j)
3598 case( i_intrp_fill )
3599 call make_mask( omask, sst_org, oia_org, oja_org, landdata=.false.)
3601 call interp_oceanland_data(sst_org, omask, oia_org, oja_org, .false., intrp_iter_max)
3604 if ( first_surface .or. multi_land )
then
3607 lka_org, lia_org, lja_org, &
3609 tg(:,:,:), strg(:,:,:), &
3610 lst(:,:), albg(:,:,:,:), &
3611 tg_org, strg_org, smds_org, &
3612 lst_org, albg_org, &
3617 lz_org, llon_org, llat_org, &
3618 lcz, cx, cy, lon, lat, &
3619 maskval_tg, maskval_strg, &
3620 init_landwater_ratio, &
3622 use_file_landwater, &
3624 soilwater_ds2vc_flag, &
3625 elevation_correction_land, &
3632 if ( topo_org(i,j) > undef )
then
3633 work(i,j) = lst_org(i,j) + topo_org(i,j) * laps
3635 work(i,j) = lst_org(i,j)
3640 if ( ol_interp )
then
3654 lst_ocean(i,j) = work(i,j)
3665 sst_org(:,:), tw_org(:,:), &
3666 albw_org(:,:,:,:), z0w_org(:,:), &
3668 elevation_correction_ocean, &
3669 init_ocean_alb_lw, init_ocean_alb_sw, &
3672 sst(:,:), tw(:,:), &
3673 albw(:,:,:,:), z0w(:,:) )
3676 if ( first_surface .or. multi_land )
then
3681 if( abs(lsmask_nest(i,j)-0.0_rp) < eps )
then
3689 if ( urban_do .and. first_surface )
then
3691 dens, momx, momy, rhot, qtrc, &
3692 tc_urb(:,:), qc_urb(:,:), uc_urb(:,:), &
3693 ust(:,:), albu(:,:,:,:) )
3697 first_surface = .false.
3703 end subroutine parentsurfaceinput
3707 subroutine boundarysurfaceoutput( &
3727 file_cartesc_write_var
3733 real(
rp),
intent(in) :: strg(
lka,
ia,
ja,1)
3734 real(
rp),
intent(in) :: lst(
ia,
ja,1)
3735 real(
rp),
intent(in) :: tw(1,
ia,
ja,1)
3736 real(
rp),
intent(in) :: sst(
ia,
ja,1)
3737 real(
rp),
intent(in) :: z0(
ia,
ja,1)
3738 logical,
intent(in) :: multi_ocean
3739 logical,
intent(in) :: multi_land
3740 integer,
intent(in) :: fid
3741 integer,
intent(in) :: vid(10)
3742 real(
dp),
intent(in) :: timeintv
3743 integer,
intent(in) :: istep
3750 timeofs = (istep - 1) * timeintv
3752 if ( multi_land )
then
3753 call file_cartesc_write_var( fid, vid(1), tg(:,:,:,:),
'LAND_TEMP',
'LXYT', timeintv, timeofs=timeofs )
3754 call file_cartesc_write_var( fid, vid(2), strg(:,:,:,:),
'LAND_WATER',
'LXYT', timeintv, timeofs=timeofs )
3755 call file_cartesc_write_var( fid, vid(3), lst(:,:,:),
'LAND_SFC_TEMP',
'XYT', timeintv, timeofs=timeofs )
3758 if ( multi_ocean )
then
3759 call file_cartesc_write_var( fid, vid(6), tw(:,:,:,:),
'OCEAN_TEMP',
'OXYT', timeintv, timeofs=timeofs )
3760 call file_cartesc_write_var( fid, vid(7), sst(:,:,:),
'OCEAN_SFC_TEMP',
'XYT', timeintv, timeofs=timeofs )
3761 call file_cartesc_write_var( fid, vid(10), z0(:,:,:),
' OCEAN_SFC_Z0',
'XYT', timeintv, timeofs=timeofs )
3767 end subroutine boundarysurfaceoutput
3772 kmax, imax, jmax, oimax,ojmax, &
3773 tg, strg, lst, albg, &
3774 tg_org, strg_org, smds_org, &
3775 lst_org, albg_org, &
3777 lmask_org, lsmask_nest, &
3779 lz_org, llon_org, llat_org, &
3782 maskval_tg, maskval_strg, &
3783 init_landwater_ratio, &
3784 ! init_landwater_ratio_each, &
3785 use_file_landwater, &
3787 soilwater_ds2vc_flag, &
3788 elevation_correction, &
3806 mapprojection_lonlat2xy
3820 integer,
intent(in) :: kmax, imax, jmax
3821 integer,
intent(in) :: oimax, ojmax
3822 real(RP),
intent(out) :: tg(LKMAX,IA,JA)
3823 real(RP),
intent(out) :: strg(LKMAX,IA,JA)
3824 real(RP),
intent(out) :: lst(IA,JA)
3825 real(RP),
intent(out) :: albg(IA,JA,N_RAD_DIR,N_RAD_RGN)
3826 real(RP),
intent(inout) :: tg_org(kmax,imax,jmax)
3827 real(RP),
intent(inout) :: strg_org(kmax,imax,jmax)
3828 real(RP),
intent(inout) :: smds_org(kmax,imax,jmax)
3829 real(RP),
intent(inout) :: lst_org(imax,jmax)
3830 real(RP),
intent(inout) :: albg_org(imax,jmax,N_RAD_DIR,N_RAD_RGN)
3831 real(RP),
intent(inout) :: sst_org(oimax,ojmax)
3832 real(RP),
intent(in) :: lmask_org(imax,jmax)
3833 real(RP),
intent(in) :: lsmask_nest(IA,JA)
3834 real(RP),
intent(in) :: topo_org(imax,jmax)
3835 real(RP),
intent(in) :: lz_org(kmax)
3836 real(RP),
intent(in) :: llon_org(imax,jmax)
3837 real(RP),
intent(in) :: llat_org(imax,jmax)
3838 real(RP),
intent(in) :: LCZ(LKMAX)
3839 real(RP),
intent(in) :: CX(IA)
3840 real(RP),
intent(in) :: CY(JA)
3841 real(RP),
intent(in) :: LON(IA,JA)
3842 real(RP),
intent(in) :: LAT(IA,JA)
3843 real(RP),
intent(in) :: maskval_tg
3844 real(RP),
intent(in) :: maskval_strg
3845 real(RP),
intent(in) :: init_landwater_ratio
3847 logical,
intent(in) :: use_file_landwater
3848 logical,
intent(in) :: use_waterratio
3849 logical,
intent(in) :: soilwater_ds2vc_flag
3850 logical,
intent(in) :: elevation_correction
3851 integer,
intent(in) :: intrp_iter_max
3852 logical,
intent(in) :: ol_interp
3854 real(RP) :: lmask(imax,jmax)
3855 real(RP) :: smds(LKMAX,IA,JA)
3858 real(RP) :: hfact_l(imax,jmax,itp_nh_ol)
3859 integer :: igrd_l (imax,jmax,itp_nh_ol)
3860 integer :: jgrd_l (imax,jmax,itp_nh_ol)
3861 real(RP) :: lX_org (imax,jmax)
3862 real(RP) :: lY_org (imax,jmax)
3863 logical :: zonal, pole
3864 integer :: igrd ( IA,JA,itp_nh_l)
3865 integer :: jgrd ( IA,JA,itp_nh_l)
3866 real(RP) :: hfact( IA,JA,itp_nh_l)
3867 integer :: kgrdl (LKMAX,2,IA,JA,itp_nh_l)
3868 real(RP) :: vfactl(LKMAX, IA,JA,itp_nh_l)
3871 real(RP) :: sst_land(imax,jmax)
3872 real(RP) :: work (imax,jmax)
3873 real(RP) :: work2(imax,jmax)
3875 real(RP) :: lz3d_org(kmax,imax,jmax)
3876 real(RP) :: lcz_3D(LKMAX,IA,JA)
3879 real(RP) :: topo(IA,JA)
3882 real(RP) :: one2d(IA,JA)
3883 real(RP) :: one3d(LKMAX,IA,JA)
3885 integer :: k, i, j, m, n
3889 if ( i_intrp_land_sfc_temp .ne. i_intrp_off )
then
3890 select case( i_intrp_land_sfc_temp )
3891 case( i_intrp_mask )
3892 call make_mask( lmask, lst_org, imax, jmax, landdata=.true.)
3896 if ( lmask_org(i,j) .ne. undef ) lmask(i,j) = lmask_org(i,j)
3899 case( i_intrp_fill )
3900 call make_mask( lmask, lst_org, imax, jmax, landdata=.true.)
3902 log_error(
"land_interporation",*)
'INTRP_LAND_SFC_TEMP is invalid.'
3905 call interp_oceanland_data(lst_org, lmask, imax, jmax, .true., intrp_iter_max)
3908 if ( ol_interp )
then
3910 call interp_factor2d( itp_nh_ol, &
3934 sst_land(i,j) = sst_org(i,j)
3942 if ( topo_org(i,j) > undef + eps )
then
3943 sst_land(i,j) = sst_land(i,j) - topo_org(i,j) * laps
3958 if( albg_org(i,j,m,
i_r_ir ) == undef ) albg_org(i,j,m,
i_r_ir ) = 0.03_rp
3959 if( albg_org(i,j,m,
i_r_nir) == undef ) albg_org(i,j,m,
i_r_nir) = 0.22_rp
3960 if( albg_org(i,j,m,
i_r_vis) == undef ) albg_org(i,j,m,
i_r_vis) = 0.22_rp
3966 if ( i_intrp_land_temp .ne. i_intrp_off )
then
3971 work(i,j) = tg_org(k,i,j)
3974 select case( i_intrp_land_temp )
3975 case( i_intrp_mask )
3976 call make_mask( lmask, work, imax, jmax, landdata=.true.)
3980 if ( lmask_org(i,j) .ne. undef ) lmask(i,j) = lmask_org(i,j)
3983 case( i_intrp_fill )
3984 call make_mask( lmask, work, imax, jmax, landdata=.true.)
3986 call interp_oceanland_data( work, lmask, imax, jmax, .true., intrp_iter_max )
3992 tg_org(k,i,j) = work(i,j)
4003 lz3d_org(:,i,j) = lz_org(:)
4010 lcz_3d(:,i,j) = lcz(:)
4014 select case( itp_type_l )
4015 case ( i_intrp_linear )
4017 if ( imax == 1 .or. jmax == 1 )
then
4018 log_error(
"land_interporation",*)
'LINER interpolation requires nx, ny > 1'
4019 log_error_cont(*)
'Use "DIST-WEIGHT" as INTRP_TYPE of PARAM_MKINIT_REAL_LAND'
4026 work(i,j) = sign( min( abs(llat_org(i,j)), pi * 0.499999_rp ), llat_org(i,j) )
4030 call mapprojection_lonlat2xy( imax, 1, imax, jmax, 1, jmax, &
4031 llon_org(:,:), work(:,:), &
4032 lx_org(:,:), ly_org(:,:) )
4034 zonal = ( maxval(llon_org) - minval(llon_org) ) > 2.0_rp * pi * 0.9_rp
4035 pole = ( maxval(llat_org) > pi * 0.5_rp * 0.9_rp ) .or. ( minval(llat_org) < - pi * 0.5_rp * 0.9_rp )
4036 call interp_factor3d( kmax, 1, kmax, &
4050 flag_extrap = .true., &
4054 case ( i_intrp_dstwgt )
4056 call interp_factor3d( itp_nh_l, &
4064 lon(:,:), lat(:,:), &
4071 flag_extrap = .true. )
4083 if ( filter_niter > 0 )
then
4085 lst(:,:), filter_order, filter_niter )
4086 call comm_vars8( lst(:,:), 1 )
4087 call comm_wait ( lst(:,:), 1, .false. )
4091 if ( filter_niter > 0 )
then
4109 albg_org(:,:,m,n), &
4111 if ( filter_niter > 0 )
then
4113 albg(:,:,m,n), filter_order, filter_niter, &
4114 limiter_sign = one2d(:,:) )
4115 call comm_vars8( albg(:,:,m,n), 1 )
4116 call comm_wait ( albg(:,:,m,n), 1, .false. )
4139 tg(lkmax,i,j) = tg(lkmax-1,i,j)
4147 if ( filter_niter > 0 )
then
4148 call filter_hyperdiff( lkmax, 1, lkmax, ia,
isb,
ieb, ja,
jsb,
jeb, &
4149 tg(:,:,:), filter_order, filter_niter )
4150 call comm_vars8( tg(:,:,:), 1 )
4151 call comm_wait ( tg(:,:,:), 1, .false. )
4156 if ( elevation_correction )
then
4165 if ( filter_niter > 0 )
then
4167 topo(:,:), filter_order, filter_niter )
4168 call comm_vars8( topo(:,:), 1 )
4169 call comm_wait ( topo(:,:), 1, .false. )
4176 if ( topo(i,j) > undef + eps )
then
4178 lst(i,j) = lst(i,j) - tdiff
4180 tg(k,i,j) = tg(k,i,j) - tdiff
4191 if( use_file_landwater )
then
4193 if ( use_waterratio )
then
4195 if ( i_intrp_land_water .ne. i_intrp_off )
then
4200 work(i,j) = smds_org(k,i,j)
4203 select case( i_intrp_land_water )
4204 case( i_intrp_mask )
4205 call make_mask( lmask, work, imax, jmax, landdata=.true.)
4209 if ( lmask_org(i,j) .ne. undef ) lmask(i,j) = lmask_org(i,j)
4212 case( i_intrp_fill )
4213 call make_mask( lmask, work, imax, jmax, landdata=.true.)
4215 call interp_oceanland_data(work, lmask, imax, jmax, .true., intrp_iter_max)
4220 work2(i,j) = init_landwater_ratio
4228 smds_org(k,i,j) = work(i,j)
4250 strg(k,:,:) =
convert_ws2vwc( smds(k,:,:), critical=soilwater_ds2vc_flag )
4255 if ( i_intrp_land_water .ne. i_intrp_off )
then
4260 work(i,j) = strg_org(k,i,j)
4263 select case( i_intrp_land_water )
4264 case( i_intrp_mask )
4265 call make_mask( lmask, work, imax, jmax, landdata=.true.)
4269 if ( lmask_org(i,j) .ne. undef ) lmask(i,j) = lmask_org(i,j)
4272 case( i_intrp_fill )
4273 call make_mask( lmask, work, imax, jmax, landdata=.true.)
4275 call interp_oceanland_data(work, lmask, imax, jmax, .true., intrp_iter_max)
4279 lmask(i,j) = maskval_strg
4287 strg_org(k,i,j) = work(i,j)
4318 strg(k,i,j) = max( min( strg(k,i,j), 1.0_rp ), 0.0_rp )
4323 if ( filter_niter > 0 )
then
4328 one3d(k,i,j) = 1.0_rp
4332 call filter_hyperdiff( lkmax, 1, lkmax-1, ia,
isb,
ieb, ja,
jsb,
jeb, &
4333 strg(:,:,:), filter_order, filter_niter, &
4334 limiter_sign = one3d(:,:,:) )
4335 call comm_vars8( strg(:,:,:), 1 )
4336 call comm_wait ( strg(:,:,:), 1, .false. )
4342 strg(lkmax,i,j) = strg(lkmax-1,i,j)
4353 work(i,j) = init_landwater_ratio
4357 strg(k,:,:) =
convert_ws2vwc( work(:,:), critical=soilwater_ds2vc_flag )
4368 sst_org, tw_org, albw_org, z0w_org, &
4370 elevation_correction_ocean, &
4371 init_ocean_alb_lw, init_ocean_alb_sw, &
4374 sst, tw, albw, z0w )
4387 mapprojection_lonlat2xy
4392 integer,
intent(in) :: imax, jmax
4393 real(RP),
intent(in) :: sst_org (imax,jmax)
4394 real(RP),
intent(in) :: tw_org (imax,jmax)
4395 real(RP),
intent(inout) :: albw_org(imax,jmax,N_RAD_DIR,N_RAD_RGN)
4396 real(RP),
intent(inout) :: z0w_org (imax,jmax)
4397 real(RP),
intent(in) :: CX(IA)
4398 real(RP),
intent(in) :: CY(JA)
4399 logical,
intent(in) :: elevation_correction_ocean
4400 real(RP),
intent(in) :: init_ocean_alb_lw
4401 real(RP),
intent(in) :: init_ocean_alb_sw
4402 real(RP),
intent(in) :: init_ocean_z0w
4403 logical,
intent(in) :: first_surface
4405 real(RP),
intent(out) :: sst (IA,JA)
4406 real(RP),
intent(out) :: tw (IA,JA)
4407 real(RP),
intent(out) :: albw(IA,JA,N_RAD_DIR,N_RAD_RGN)
4408 real(RP),
intent(out) :: z0w (IA,JA)
4411 real(RP) :: oX_org(imax,jmax)
4412 real(RP) :: oY_org(imax,jmax)
4413 logical :: zonal, pole
4415 real(RP) :: one(IA,JA)
4418 integer :: i, j, m, n
4424 if ( albw_org(i,j,m,
i_r_ir ) == undef ) albw_org(i,j,m,
i_r_ir ) = init_ocean_alb_lw
4425 if ( albw_org(i,j,m,
i_r_nir) == undef ) albw_org(i,j,m,
i_r_nir) = init_ocean_alb_sw
4426 if ( albw_org(i,j,m,
i_r_vis) == undef ) albw_org(i,j,m,
i_r_vis) = init_ocean_alb_sw
4427 if ( albw_org(i,j,m,
i_r_vis) == undef ) albw_org(i,j,m,
i_r_vis) = init_ocean_alb_sw
4429 if ( z0w_org(i,j) == undef ) z0w_org(i,j) = init_ocean_z0w
4433 if ( first_surface )
then
4437 select case( itp_type_a )
4438 case ( i_intrp_linear )
4440 if ( imax == 1 .or. jmax == 1 )
then
4441 log_error(
"ocean_interporation",*)
'LINER interpolation requires nx, ny > 1'
4442 log_error_cont(*)
'Use "DIST-WEIGHT" as INTRP_TYPE of PARAM_MKINIT_REAL_OCEAN'
4449 olat_org(i,j) = sign( min( abs(olat_org(i,j)), pi * 0.499999_rp ), olat_org(i,j) )
4453 call mapprojection_lonlat2xy( imax, 1, imax, jmax, 1, jmax, &
4454 olon_org(:,:), olat_org(:,:), &
4455 ox_org(:,:), oy_org(:,:) )
4457 zonal = ( maxval(olon_org) - minval(olon_org) ) > 2.0_rp * pi * 0.9_rp
4458 pole = ( maxval(olat_org) > pi * 0.5_rp * 0.9_rp ) .or. ( minval(olat_org) < - pi * 0.5_rp * 0.9_rp )
4459 call interp_factor2d( imax, jmax, &
4470 case ( i_intrp_dstwgt )
4472 call interp_factor2d( itp_nh_o, &
4477 lon(:,:), lat(:,:), &
4495 if ( filter_niter > 0 )
then
4497 tw(:,:), filter_order, filter_niter )
4498 call comm_vars8( tw(:,:), 1 )
4499 call comm_wait ( tw(:,:), 1, .false. )
4510 if ( filter_niter > 0 )
then
4512 sst(:,:), filter_order, filter_niter )
4513 call comm_vars8( sst(:,:), 1 )
4514 call comm_wait ( sst(:,:), 1, .false. )
4518 if ( elevation_correction_ocean )
then
4525 sst(i,j) = sst(i,j) - tdiff
4526 tw(i,j) = tw(i,j) - tdiff
4533 if ( filter_niter > 0 )
then
4551 albw_org(:,:,m,n), &
4553 if ( filter_niter > 0 )
then
4555 albw(:,:,m,n), filter_order, filter_niter, &
4556 limiter_sign = one(:,:) )
4557 call comm_vars8( albw(:,:,m,n), 1 )
4558 call comm_wait ( albw(:,:,m,n), 1, .false. )
4572 if ( filter_niter > 0 )
then
4574 z0w(:,:), filter_order, filter_niter, &
4575 limiter_sign = one(:,:) )
4576 call comm_vars8( z0w(:,:), 1 )
4577 call comm_wait ( z0w(:,:), 1, .false. )
4587 DENS, MOMX, MOMY, RHOT, &
4589 tc_urb, qc_urb, uc_urb, &
4594 thermodyn_specific_heat => atmos_thermodyn_specific_heat, &
4595 thermodyn_rhot2temp_pres => atmos_thermodyn_rhot2temp_pres
4600 real(RP),
intent(in) :: lst (IA,JA)
4601 real(RP),
intent(in) :: albg (IA,JA,N_RAD_DIR,N_RAD_RGN)
4602 real(RP),
intent(in) :: DENS(KA,IA,JA)
4603 real(RP),
intent(in) :: MOMX(KA,IA,JA)
4604 real(RP),
intent(in) :: MOMY(KA,IA,JA)
4605 real(RP),
intent(in) :: RHOT(KA,IA,JA)
4606 real(RP),
intent(in) :: QTRC(KA,IA,JA,QA)
4607 real(RP),
intent(out) :: tc_urb(IA,JA)
4608 real(RP),
intent(out) :: qc_urb(IA,JA)
4609 real(RP),
intent(out) :: uc_urb(IA,JA)
4610 real(RP),
intent(out) :: ust (IA,JA)
4611 real(RP),
intent(out) :: albu (IA,JA,N_RAD_DIR,N_RAD_RGN)
4613 real(RP) :: temp, pres
4627 call thermodyn_specific_heat( qa, &
4630 qdry, rtot, cvtot, cptot )
4631 call thermodyn_rhot2temp_pres( dens(
ks,i,j), rhot(
ks,i,j), rtot, cvtot, cptot, &
4635 if (
i_qv > 0 )
then
4636 qc_urb(i,j) = qtrc(
ks,i,j,
i_qv)
4638 qc_urb(i,j) = 0.0_rp
4646 uc_urb(i,j) = max(sqrt( ( momx(
ks,i,j) / (dens(
ks,i+1, j)+dens(
ks,i,j)) * 2.0_rp )**2.0_rp &
4647 + ( momy(
ks,i,j) / (dens(
ks, i,j+1)+dens(
ks,i,j)) * 2.0_rp )**2.0_rp ), &
4653 uc_urb(ia,j) = max(sqrt( ( momx(
ks,ia,j) / dens(
ks,ia,j ) )**2.0_rp &
4654 + ( momy(
ks,ia,j) / (dens(
ks,ia,j+1)+dens(
ks,ia,j)) * 2.0_rp )**2.0_rp ), &
4659 uc_urb(i,ja) = max(sqrt( ( momx(
ks,i,ja) / (dens(
ks,i+1,ja)+dens(
ks,i,ja)) * 2.0_rp )**2.0_rp &
4660 + ( momy(
ks,i,ja) / dens(
ks,i ,ja) )**2.0_rp ), 0.01_rp)
4662 uc_urb(ia,ja) = max(sqrt( ( momx(
ks,ia,ja) / dens(
ks,ia,ja) )**2.0_rp &
4663 + ( momy(
ks,ia,ja) / dens(
ks,ia,ja) )**2.0_rp ), 0.01_rp)
4665 call comm_vars8( uc_urb, 1 )
4666 call comm_wait ( uc_urb, 1, .false. )
4744 albu(i,j,:,:) = albg(i,j,:,:)
4762 real(RP),
intent(out) :: gmask(:,:)
4763 real(RP),
intent(in) :: data(:,:)
4764 integer,
intent(in) :: nx
4765 integer,
intent(in) :: ny
4766 logical,
intent(in) :: landdata
4792 if( abs(
data(i,j) - undef) < sqrt(eps) )
then
4801 subroutine interp_oceanland_data( &
4813 integer,
intent(in) :: nx
4814 integer,
intent(in) :: ny
4815 real(RP),
intent(inout) :: data (nx,ny)
4816 real(RP),
intent(in) :: lsmask(nx,ny)
4817 logical,
intent(in) :: landdata
4818 integer,
intent(in) :: iter_max
4820 integer :: mask (nx,ny)
4821 integer :: mask_prev(nx,ny)
4822 real(RP) :: data_prev(nx,ny)
4823 real(RP) :: tmp, cnt, sw
4824 integer :: mask_target
4826 integer :: num_land, num_ocean, num_replaced
4827 integer :: istr, iend, jstr, jend
4828 integer :: i, j, ii, jj, ite
4832 log_info(
"interp_OceanLand_data",*)
'Interpolation'
4834 if ( landdata )
then
4835 log_info(
"interp_OceanLand_data",*)
'target mask : LAND'
4838 log_info(
"interp_OceanLand_data",*)
'target mask : OCEAN'
4849 mask(i,j) = int( 0.5_rp - sign(0.5_rp,abs(lsmask(i,j)-1.0_rp)-eps) )
4850 num_land = num_land + ( mask(i,j) )
4851 num_ocean = num_ocean + ( 1-mask(i,j) )
4855 log_progress(
'(1x,A,I3.3,A,2I8)')
'ite=', 0,
', (land,ocean) = ', num_land, num_ocean
4858 do ite = 1, iter_max
4863 mask_prev(i,j) = mask(i,j)
4864 data_prev(i,j) =
data(i,j)
4875 if( mask(i,j) == mask_target ) cycle
4887 sw = 0.5_rp - sign(0.5_rp,real(abs(mask_prev(ii,jj)-mask_target),kind=rp)-eps)
4889 tmp = tmp + sw * data_prev(ii,jj)
4894 if ( cnt >= 3.0_rp )
then
4895 data(i,j) = tmp / cnt
4896 mask(i,j) = mask_target
4898 num_replaced = num_replaced + 1
4904 if ( landdata )
then
4905 num_land = num_land + num_replaced
4906 num_ocean = num_ocean - num_replaced
4908 num_land = num_land - num_replaced
4909 num_ocean = num_ocean + num_replaced
4914 if( num_replaced == 0 )
exit
4918 log_progress(
'(1x,A,I3.3,A,2I8)')
'ite=', ite,
', (land,ocean) = ', num_land, num_ocean
4923 if ( abs(mask(i,j)-mask_target) > eps )
data(i,j) = undef
4929 end subroutine interp_oceanland_data
4936 real(RP),
intent(inout) :: data(:,:)
4937 real(RP),
intent(in) :: maskval
4938 real(RP),
intent(in) :: frac_land(:,:)
4944 if( abs(frac_land(i,j)-0.0_rp) < eps )
then
4959 real(RP),
intent(inout) :: data(:,:)
4960 real(RP),
intent(in) :: maskval(:,:)
4961 integer,
intent(in) :: nx, ny
4962 character(len=*),
intent(in) :: elem
4972 if( abs(
data(i,j) - undef) < sqrt(eps) )
then
4973 if( abs(maskval(i,j) - undef) < sqrt(eps) )
then
4974 log_error(
"replace_misval_map",*)
"data for mask of "//trim(elem)//
"(",i,
",",j,
") includes missing value."
4978 data(i,j) = maskval(i,j)
4985 log_error_cont(*)
"Please check input data of SKINTEMP or SST. "
4993 IS_org, IE_org, JS_org, JE_org, &
4995 LON_min, LON_max, LAT_min, LAT_max, &
5002 integer,
intent(out) :: IS_org
5003 integer,
intent(out) :: IE_org
5004 integer,
intent(out) :: JS_org
5005 integer,
intent(out) :: JE_org
5007 integer,
intent(in) :: IA_org
5008 integer,
intent(in) :: JA_org
5009 real(RP),
intent(in) :: LON_min, LON_max
5010 real(RP),
intent(in) :: LAT_min, LAT_max
5011 real(RP),
intent(in) :: LON_all(IA_org,JA_org)
5012 real(RP),
intent(in) :: LAT_all(IA_org,JA_org)
5014 real(RP) :: min, max
5016 logical :: LON_mask(IA_org)
5017 logical :: LAT_mask(JA_org)
5021 if ( lon_min < minval( lon_all ) .or. lon_max > maxval( lon_all ) )
then
5026 min = maxval( minval( lon_all(:,:), dim=2 ), mask=all( lon_all(:,:) < lon_min, dim=2 ) )
5027 max = minval( maxval( lon_all(:,:), dim=2 ), mask=all( lon_all(:,:) > lon_max, dim=2 ) )
5028 lon_mask(:) = any( lon_all(:,:) - min > -eps, dim=2 ) .AND. any( lon_all(:,:) - max < eps, dim=2 )
5030 if( lon_mask(i) )
then
5035 do i = ia_org, 1, -1
5036 if( lon_mask(i) )
then
5043 if ( lat_min < minval( lat_all ) .or. lat_max > maxval( lat_all ) )
then
5046 log_error(
"get_IJrange",*)
"unexpected error", lat_min, lat_max, minval( lat_all ), maxval( lat_all )
5049 min = maxval( minval( lat_all(:,:), dim=1 ), mask=all( lat_all(:,:) < lat_min, dim=1 ) )
5050 max = minval( maxval( lat_all(:,:), dim=1 ), mask=all( lat_all(:,:) > lat_max, dim=1 ) )
5051 lat_mask(:) = any( lat_all(:,:) - min > -eps, dim=1 ) .AND. any( lat_all(:,:) - max < eps, dim=1 )
5053 if( lat_mask(j) )
then
5058 do j = ja_org, 1, -1
5059 if( lat_mask(j) )
then