source: trunk/LMDZ.COMMON/libf/evolution/xios_data.F90 @ 4091

Last change on this file since 4091 was 4090, checked in by jbclement, 5 days ago

PEM:
Update README and change "startpem.nc" into "startevol.nc".
JBC

File size: 8.4 KB
RevLine 
[3989]1MODULE xios_data
[3991]2!-----------------------------------------------------------------------
3! NAME
4!     xios_data
5!
6! DESCRIPTION
7!     Read XIOS output data and process it for PEM initialization.
8!
9! AUTHORS & DATE
10!     JB Clement, 2025
11!
12! NOTES
13!
14!-----------------------------------------------------------------------
[3977]15
[3991]16! DEPENDENCIES
17! ------------
[4065]18use numerics, only: dp, di, k4
[3977]19
[3991]20! DECLARATION
21! -----------
[3977]22implicit none
23
24contains
[3991]25!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
[3989]26
27!=======================================================================
[4065]28SUBROUTINE load_xios_data(ps_avg,ps_ts,tsurf_avg,tsurf_avg_yr1,tsoil_avg,tsoil_ts,h2o_surfdensity_avg,h2o_soildensity_avg, &
[4071]29                          q_h2o_ts,q_co2_ts,minPCM_h2operice,minPCM_co2perice,minPCM_h2ofrost,minPCM_co2frost)
[3991]30!-----------------------------------------------------------------------
31! NAME
32!     load_xios_data
33!
34! DESCRIPTION
35!     Reads yearly and daily XIOS data, computes frost and ice tendencies.
36!
37! AUTHORS & DATE
38!     JB Clement, 2025
39!
40! NOTES
41!
42!-----------------------------------------------------------------------
[3977]43
[3991]44! DEPENDENCIES
45! ------------
[4065]46use geometry,   only: ngrid, nslope, nsoil, nsoil_PCM, nday, lonlat2vect, nlon, nlat
47use io_netcdf,  only: xios_day_name2, xios_yr_name1, xios_yr_name2, open_nc, close_nc, get_var_nc, get_dim_nc
48use soil,       only: do_soil
49use frost,      only: compute_frost4PCM
50use stoppage,   only: stop_clean
51use display,    only: print_msg
52use utility,    only: real2str
[3977]53
[3991]54! DECLARATION
55! -----------
[3977]56implicit none
57
[3991]58! ARGUMENTS
59! ---------
[4065]60real(dp), dimension(:),       intent(out) :: ps_avg
[4071]61real(dp), dimension(:,:),     intent(out) :: tsurf_avg, tsurf_avg_yr1, h2o_surfdensity_avg, ps_ts, q_h2o_ts, q_co2_ts
[4065]62real(dp), dimension(:,:,:),   intent(out) :: tsoil_avg, h2o_soildensity_avg
63real(dp), dimension(:,:,:,:), intent(out) :: tsoil_ts
[4071]64real(dp), dimension(:,:,:),   intent(out) :: minPCM_h2operice, minPCM_co2perice, minPCM_h2ofrost, minPCM_co2frost
[3977]65
[3991]66! LOCAL VARIABLES
67! ---------------
[4065]68logical(k4)                                  :: here
69integer(di)                                  :: islope, isoil, iday
70real(dp), dimension(:,:),     allocatable    :: var_read_2d
71real(dp), dimension(:,:,:),   allocatable    :: var_read_3d
72real(dp), dimension(:,:,:,:), allocatable    :: var_read_4d
73character(:),                 allocatable    :: num ! To read slope variables
74real(dp), dimension(ngrid,nsoil,nslope,nday) :: h2o_soildensity_ts
[4090]75
[3991]76! CODE
77! ----
[3977]78! Initialization
[4071]79minPCM_h2operice(:,:,:) = 0._dp
80minPCM_co2perice(:,:,:) = 0._dp
81minPCM_h2ofrost(:,:,:) = 0._dp
82minPCM_co2frost(:,:,:) = 0._dp
[3977]83if (nslope == 1) then ! No slope
84    allocate(character(0) :: num)
85else ! Using slopes
86    allocate(character(8) :: num)
[4065]87end if
[3977]88
89!~~~~~~~~~~~~~~~~~~~~~~~~ Year 1 - Yearly data ~~~~~~~~~~~~~~~~~~~~~~~~~
[4065]90inquire(file = xios_yr_name1,exist = here)
91if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//xios_yr_name1//'"!',1)
92
[3977]93! Open the NetCDF file of XIOS outputs
[4065]94call print_msg('> Reading "'//xios_yr_name1//'"')
95call open_nc(xios_yr_name1,'read')
[3977]96
97! Allocate and read the variables
98allocate(var_read_2d(nlon,nlat),var_read_3d(nlon,nlat,nsoil_PCM))
99do islope = 1,nslope
100    if (nslope /= 1) then
[4065]101        num = '  '
[3977]102        write(num,'(i2.2)') islope
103        num = '_slope'//num
[4065]104    end if
[4071]105    call get_var_nc('co2ice'//num,var_read_2d)          ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_co2frost(:,islope,1))
106    call get_var_nc('h2o_ice_s'//num,var_read_2d)       ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_h2ofrost(:,islope,1))
107    call get_var_nc('watercap'//num,var_read_2d)        ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_h2operice(:,islope,1))
108    call get_var_nc('perennial_co2ice'//num,var_read_2d); call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_co2perice(:,islope,1))
[4065]109    call get_var_nc('tsurf'//num,var_read_2d)           ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,tsurf_avg_yr1(:,islope))
110end do
[3977]111
112! Close the NetCDF file of XIOS outputs
[4065]113call close_nc(xios_yr_name1)
[3977]114
115!~~~~~~~~~~~~~~~~~~~~~~~~ Year 2 - Yearly data ~~~~~~~~~~~~~~~~~~~~~~~~~
[4065]116inquire(file = xios_yr_name2,exist = here)
117if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//xios_yr_name2//'"!',1)
[3977]118! Open the NetCDF file of XIOS outputs
[4065]119call print_msg('> Reading "'//xios_yr_name2//'"')
120call open_nc(xios_yr_name2,'read')
[3977]121
122! Allocate and read the variables
[4065]123call get_var_nc('ps',var_read_2d); call lonlat2vect(nlon,nlat,ngrid,var_read_2d,ps_avg)
[3977]124do islope = 1,nslope
125    if (nslope /= 1) then
126        num='  '
127        write(num,'(i2.2)') islope
128        num = '_slope'//num
[4065]129    end if
130    call get_var_nc('tsurf'//num,var_read_2d)           ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,tsurf_avg(:,islope))
[4071]131    call get_var_nc('co2ice'//num,var_read_2d)          ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_co2frost(:,islope,2))
132    call get_var_nc('h2o_ice_s'//num,var_read_2d)       ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_h2ofrost(:,islope,2))
133    call get_var_nc('watercap'//num,var_read_2d)        ; call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_h2operice(:,islope,2))
134    call get_var_nc('perennial_co2ice'//num,var_read_2d); call lonlat2vect(nlon,nlat,ngrid,var_read_2d,minPCM_co2perice(:,islope,2))
[3989]135    if (do_soil) then
[4065]136        call get_var_nc('soiltemp'//num,var_read_3d)
[3977]137        do isoil = 1,nsoil_PCM
138            call lonlat2vect(nlon,nlat,ngrid,var_read_3d(:,:,isoil),tsoil_avg(:,isoil,islope))
[4065]139        end do
140        do isoil = nsoil_PCM + 1,nsoil
141            tsoil_avg(:,isoil,islope) = tsoil_avg(:,nsoil_PCM,islope) ! Explicit initialization because dimension with size nsoil > nsoil_PCM
142        end do
143        call get_var_nc('waterdensity_surface'//num,var_read_2d); call lonlat2vect(nlon,nlat,ngrid,var_read_2d,h2o_surfdensity_avg(:,islope))
144    end if
145end do
[4090]146
[3977]147! Close the NetCDF file of XIOS outputs
[4065]148call close_nc(xios_yr_name2)
[3977]149
150!~~~~~~~~~~~~~~~~~~~~~~~~~ Year 2 - Daily data ~~~~~~~~~~~~~~~~~~~~~~~~~
[4065]151inquire(file = xios_day_name2,exist = here)
152if (.not. here) call stop_clean(__FILE__,__LINE__,'cannot find required file "'//xios_day_name2//'"!',1)
[3977]153! Open the NetCDF file of XIOS outputs
[4065]154call print_msg('> Reading "'//xios_day_name2//'"')
155call open_nc(xios_day_name2,'read')
[3977]156
157! Allocate and read the variables
158deallocate(var_read_2d,var_read_3d)
[4065]159allocate(var_read_3d(nlon,nlat,nday),var_read_4d(nlon,nlat,nsoil_PCM,nday))
160call get_var_nc('ps',var_read_3d)
161do iday = 1,nday
162    call lonlat2vect(nlon,nlat,ngrid,var_read_3d(:,:,iday),ps_ts(:,iday))
163end do
164call get_var_nc('h2o_layer1',var_read_3d)
165do iday = 1,nday
166    call lonlat2vect(nlon,nlat,ngrid,var_read_3d(:,:,iday),q_h2o_ts(:,iday))
167end do
168call get_var_nc('co2_layer1',var_read_3d)
169do iday = 1,nday
170    call lonlat2vect(nlon,nlat,ngrid,var_read_3d(:,:,iday),q_co2_ts(:,iday))
171end do
[3989]172if (do_soil) then
[3977]173    do islope = 1,nslope
174        if (nslope /= 1) then
175            num='  '
176            write(num,'(i2.2)') islope
177            num = '_slope'//num
[4065]178        end if
179        call get_var_nc('soiltemp'//num,var_read_4d)
180        do iday = 1,nday
[3977]181            do isoil = 1,nsoil_PCM
[4065]182                call lonlat2vect(nlon,nlat,ngrid,var_read_4d(:,:,isoil,iday),tsoil_ts(:,isoil,islope,iday))
183            end do
184            do isoil = nsoil_PCM + 1,nsoil
185                tsoil_ts(:,isoil,islope,iday) = tsoil_ts(:,nsoil_PCM,islope,iday) ! Explicit initialization because dimension with size nsoil > nsoil_PCM
186            end do
187        end do
188        call get_var_nc('waterdensity_soil'//num,var_read_4d)
189        do iday = 1,nday
[3977]190            do isoil = 1,nsoil_PCM
[4065]191                call lonlat2vect(nlon,nlat,ngrid,var_read_4d(:,:,isoil,iday),h2o_soildensity_ts(:,isoil,islope,iday))
192            end do
193            do isoil = nsoil_PCM + 1,nsoil
194                h2o_soildensity_ts(:,isoil,islope,iday) = h2o_soildensity_ts(:,nsoil_PCM,islope,iday) ! Explicit initialization because dimension with size nsoil > nsoil_PCM
195            end do
196        end do
197    end do
198    h2o_soildensity_avg(:,:,:) = sum(h2o_soildensity_ts,4)/nday
199end if
[3977]200deallocate(var_read_3d,var_read_4d,num)
201
202! Close the NetCDF file of XIOS outputs
[4065]203call close_nc(xios_day_name2)
[3977]204
205!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[3983]206! Compute frost from yearly minima
[4071]207call compute_frost4PCM(minPCM_h2ofrost(:,:,2),minPCM_co2frost(:,:,2))
[3983]208
[3989]209END SUBROUTINE load_xios_data
210!=======================================================================
[3977]211
[3989]212END MODULE xios_data
Note: See TracBrowser for help on using the repository browser.