Changeset 1538 for trunk/LMDZ.GENERIC/libf/phystd/soil_settings.F
- Timestamp:
- Apr 8, 2016, 4:57:00 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LMDZ.GENERIC/libf/phystd/soil_settings.F
r1516 r1538 3 3 ! use netcdf 4 4 use comsoil_h, only: layer, mlayer, inertiedat, volcapa, 5 & lay1 , alpha5 & lay1_soil, alpha_soil 6 6 use iostart, only: inquire_field_ndims, get_var, get_field, 7 7 & inquire_field, inquire_dimension_length … … 71 71 real,dimension(:),allocatable :: newval 72 72 73 real malpha,mlay1 ! coefficients for building layers73 real malpha,mlay1_soil ! coefficients for building layers 74 74 real xmin,xmax ! to display min and max of a field 75 75 … … 84 84 85 85 if (dimlen.ne.nsoil) then 86 write(*,*)'soil_settings: Interpolation of soil temperature ',87 & 'and thermal inertia will be required!'88 86 ! if dimlen doesn't match nsoil, then interpolation of 89 87 ! soil temperatures and thermal inertia will be requiered 90 88 interpol=.true. 91 ! allocate olmlayer92 allocate(oldmlayer(dimlen),stat=ierr)93 if (ierr.ne.0) then94 write(*,*) 'soil_settings: failed allocation of oldmlayer!'95 stop96 endif97 89 endif 90 91 ! allocate oldmlayer 92 allocate(oldmlayer(dimlen),stat=ierr) 93 if (ierr.ne.0) then 94 write(*,*) 'soil_settings: failed allocation of oldmlayer!' 95 stop 96 endif 97 98 ! check if olmlayer distribution matches current one 99 call get_var("soildepth",oldmlayer,found) 100 if (found) then 101 malpha=oldmlayer(2)/oldmlayer(1) 102 if ((abs(malpha-alpha_soil)/alpha_soil).gt.1.e-6) then 103 ! alpha values are too different, intepolation needed 104 interpol=.true. 105 endif 106 ! check if loaded mid-layer depth value differs from current one 107 if (abs((oldmlayer(1)-lay1_soil*alpha_soil**(-1./2.))/ 108 & (lay1_soil*alpha_soil**(-1./2.))).gt.1.e-6) then 109 interpol=.true. 110 endif 111 endif 112 113 if (interpol) then 114 write(*,*)'soil_settings: Interpolation of soil temperature ', 115 & 'and thermal inertia will be required!' 116 endif 117 98 118 ! 1.2 Find out the # of dimensions <inertiedat> was defined as using 99 119 ndims=inquire_field_ndims("inertiedat") … … 133 153 if (interpol) then 134 154 ! default mlayer distribution, following a power law: 135 ! mlayer(k)=lay1 *alpha**(k-1/2)155 ! mlayer(k)=lay1_soil*alpha_soil**(k-1/2) 136 156 do iloop=0,nsoil-1 137 mlayer(iloop)=lay1 *(alpha**(iloop-0.5))157 mlayer(iloop)=lay1_soil*(alpha_soil**(iloop-0.5)) 138 158 enddo 139 159 endif 140 160 ! 1.5 Build layer(); following the same law as mlayer() 141 161 ! Assuming layer distribution follows mid-layer law: 142 ! layer(k)=lay1 *alpha**(k-1)143 mlay1 =sqrt(mlayer(0)*mlayer(1))162 ! layer(k)=lay1_soil*alpha_soil**(k-1) 163 mlay1_soil=sqrt(mlayer(0)*mlayer(1)) 144 164 malpha=mlayer(1)/mlayer(0) 145 165 ! Check that these values are the same as those prescibed for mlayers 146 if ((abs(mlay1 -lay1)/lay1).gt.1.e-6) then147 write(*,*) "soil_settings error: mlay1 =",mlay1148 write(*,*) " does not match comsoil_h lay1 =",lay1166 if ((abs(mlay1_soil-lay1_soil)/lay1_soil).gt.1.e-6) then 167 write(*,*) "soil_settings error: mlay1_soil=",mlay1_soil 168 write(*,*) " does not match comsoil_h lay1_soil=",lay1_soil 149 169 stop 150 170 endif 151 if ((abs(malpha-alpha )/alpha).gt.1.e-6) then171 if ((abs(malpha-alpha_soil)/alpha_soil).gt.1.e-6) then 152 172 write(*,*) "soil_settings error: malpha=",malpha 153 write(*,*) " does not match comsoil_h alpha =",alpha173 write(*,*) " does not match comsoil_h alpha_soil=",alpha_soil 154 174 stop 155 175 endif 156 176 do iloop=1,nsoil 157 layer(iloop)=mlay1 *(malpha**(iloop-1))177 layer(iloop)=mlay1_soil*(malpha**(iloop-1)) 158 178 enddo 159 179
Note: See TracChangeset
for help on using the changeset viewer.