[1897] | 1 | ! Copyright 2017 Université de Reims Champagne-Ardenne |
---|
| 2 | ! Contributor: J. Burgalat (GSMA, URCA) |
---|
| 3 | ! email of the author : jeremie.burgalat@univ-reims.fr |
---|
| 4 | ! |
---|
| 5 | ! This software is a computer program whose purpose is to compute |
---|
| 6 | ! microphysics processes using a two-moments scheme. |
---|
| 7 | ! |
---|
| 8 | ! This library is governed by the CeCILL license under French law and |
---|
| 9 | ! abiding by the rules of distribution of free software. You can use, |
---|
| 10 | ! modify and/ or redistribute the software under the terms of the CeCILL |
---|
| 11 | ! license as circulated by CEA, CNRS and INRIA at the following URL |
---|
| 12 | ! "http://www.cecill.info". |
---|
| 13 | ! |
---|
| 14 | ! As a counterpart to the access to the source code and rights to copy, |
---|
| 15 | ! modify and redistribute granted by the license, users are provided only |
---|
| 16 | ! with a limited warranty and the software's author, the holder of the |
---|
| 17 | ! economic rights, and the successive licensors have only limited |
---|
| 18 | ! liability. |
---|
| 19 | ! |
---|
| 20 | ! In this respect, the user's attention is drawn to the risks associated |
---|
| 21 | ! with loading, using, modifying and/or developing or reproducing the |
---|
| 22 | ! software by the user in light of its specific status of free software, |
---|
| 23 | ! that may mean that it is complicated to manipulate, and that also |
---|
| 24 | ! therefore means that it is reserved for developers and experienced |
---|
| 25 | ! professionals having in-depth computer knowledge. Users are therefore |
---|
| 26 | ! encouraged to load and test the software's suitability as regards their |
---|
| 27 | ! requirements in conditions enabling the security of their systems and/or |
---|
| 28 | ! data to be ensured and, more generally, to use and operate it in the |
---|
| 29 | ! same conditions as regards security. |
---|
| 30 | ! |
---|
| 31 | ! The fact that you are presently reading this means that you have had |
---|
| 32 | ! knowledge of the CeCILL license and that you accept its terms. |
---|
| 33 | |
---|
| 34 | !! file: mmp_optics.f90 |
---|
| 35 | !! summary: Interface for YAMMS aerosols optical properties calculations. |
---|
| 36 | !! author: J. Burgalat |
---|
| 37 | !! date: 2017 |
---|
| 38 | MODULE MMP_OPTICS |
---|
| 39 | !! Optical properties of spherical/fractal aerosols using moments |
---|
| 40 | !! |
---|
| 41 | !! |
---|
| 42 | !! The module contains an initialization function, [mmp_optics(module):mmp_init_aer_optics(function)], |
---|
| 43 | !! that must be called before any calls of the other methods. On failure, it returns .false. and |
---|
| 44 | !! consequently, all calls to the other methods will fail ! |
---|
| 45 | !! |
---|
| 46 | !! If openMP is enabled the call to [mmp_optics(module):mmp_init_aer_optics(function)] should be |
---|
| 47 | !! done by a single thread. |
---|
| 48 | !! |
---|
| 49 | !! Then the module provides 4 four public methods to compute optical properties in infrared and |
---|
| 50 | !! visible channels as a function of moments of the size-distribution: |
---|
| 51 | !! |
---|
| 52 | !! - EXT, the total extinction opacity. |
---|
| 53 | !! - SSA, the single scattering albedo. |
---|
| 54 | !! - ASF, the asymetry factor. |
---|
| 55 | !! |
---|
| 56 | !! Fractals and spherical aerosols are calculated sperately, but each EXT, SSA and ASF should be added |
---|
| 57 | !! to get the global optical properties. |
---|
| 58 | USE MMP_GLOBALS |
---|
| 59 | USE DATASETS |
---|
| 60 | |
---|
| 61 | IMPLICIT NONE |
---|
| 62 | |
---|
| 63 | PRIVATE |
---|
[1926] | 64 | PUBLIC :: mmp_optic_file ! from mmp_globals :) |
---|
[1897] | 65 | PUBLIC :: mmp_initialize_optics |
---|
| 66 | PUBLIC :: mmp_sph_optics_vis,mmp_sph_optics_ir |
---|
| 67 | PUBLIC :: mmp_fra_optics_vis,mmp_fra_optics_ir |
---|
| 68 | |
---|
| 69 | ! OPTICAL PROPERTIES ! |
---|
| 70 | |
---|
| 71 | !> Extinction opacty table (spherical,IR). |
---|
| 72 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: ext_s_i |
---|
| 73 | !> Single scattering albedo table (spherical,IR). |
---|
| 74 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: sca_s_i |
---|
| 75 | !> Asymetry factor table (spherical,IR). |
---|
| 76 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: asf_s_i |
---|
| 77 | !> Extinction opacty table (fractal,IR). |
---|
| 78 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: ext_f_i |
---|
| 79 | !> Single scattering albedo table (fractal,IR). |
---|
| 80 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: sca_f_i |
---|
| 81 | !> Asymetry factor table (fractal,IR). |
---|
| 82 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: asf_f_i |
---|
| 83 | |
---|
| 84 | !> Extinction opacty table (spherical,VIS). |
---|
| 85 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: ext_s_v |
---|
| 86 | !> Single scattering albedo table (spherical,VIS). |
---|
| 87 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: sca_s_v |
---|
| 88 | !> Asymetry factor table (spherical,VIS). |
---|
| 89 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: asf_s_v |
---|
| 90 | !> Extinction opacty table (fractal,VIS). |
---|
| 91 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: ext_f_v |
---|
| 92 | !> Single scattering albedo table (fractal,VIS). |
---|
| 93 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: sca_f_v |
---|
| 94 | !> Asymetry factor table (fractal,VIS). |
---|
| 95 | REAL(kind=8), DIMENSION(:,:), ALLOCATABLE, SAVE :: asf_f_v |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | INTEGER, SAVE :: mmp_nrc = -1 !! Size of radius grid. |
---|
| 99 | |
---|
| 100 | !> Characteristic radius grid |
---|
| 101 | REAL(kind=8), DIMENSION(:), ALLOCATABLE, SAVE :: mmp_rc |
---|
| 102 | |
---|
| 103 | CONTAINS |
---|
| 104 | |
---|
| 105 | SUBROUTINE mmp_initialize_optics(path) |
---|
| 106 | !! Initialize optics data for aerosols optical properties computation. |
---|
| 107 | !! |
---|
| 108 | !! @note |
---|
| 109 | !! If the subroutine fails to initialize parameters, the run is aborted. |
---|
| 110 | !! |
---|
| 111 | !! @warning |
---|
| 112 | !! The method assumes YAMMS model has been already intialized correctly ! |
---|
| 113 | !! |
---|
| 114 | !! @warning |
---|
| 115 | !! If OpenMP is activated, this subroutine must be called in an $OMP SINGLE statement as it |
---|
| 116 | !! initializes global variables that are not thread private. |
---|
| 117 | !! |
---|
| 118 | !! ''' |
---|
| 119 | !! !$OMP SINGLE |
---|
| 120 | !! call mmp_initialize(...) |
---|
| 121 | !! !$OMP END SINGLE |
---|
| 122 | CHARACTER(len=*), INTENT(in) :: path !! Path of NetCDF look-up tables file. |
---|
| 123 | LOGICAL :: ret |
---|
| 124 | WRITE(*,'(a)') "*** mmp_init_aer_optics speaking ***" |
---|
| 125 | WRITE(*,'(a)') "I'm about to initialize look-up tables of aerosols optical properties." |
---|
| 126 | WRITE(*,'(a)') "If something's wrong... I will abort the program !" |
---|
| 127 | IF (.NOT.mm_ini) THEN |
---|
| 128 | call abort_program(error("[mmp_init_aer_optics] Too bad mmp_initialize has not been called yet !",2)) |
---|
| 129 | ENDIF |
---|
| 130 | ! look-up tables |
---|
| 131 | ret = read_lookup_tables(path) |
---|
| 132 | IF (.NOT.ret) & |
---|
| 133 | call abort_program(error("[mmp_init_aer_optics] Failed to retrieve data.",2)) |
---|
| 134 | END SUBROUTINE mmp_initialize_optics |
---|
| 135 | |
---|
| 136 | FUNCTION mmp_sph_optics_vis(M0,M3,iwn,ext,sca,ssa,asf) RESULT(ret) |
---|
| 137 | !! Compute optical properties of the spherical mode in the visible range. |
---|
| 138 | REAL(kind=mm_wp), INTENT(in) :: M0 !! 0th order moment of the spherical mode (m-2). |
---|
| 139 | REAL(kind=mm_wp), INTENT(in) :: M3 !! 3rd order moment of the spherical mode (m3.m-2). |
---|
| 140 | INTEGER, INTENT(in) :: iwn !! Index of the wavenumber to compute |
---|
| 141 | REAL(kind=mm_wp), INTENT(out) :: ext !! Extinction opacity. |
---|
| 142 | REAL(kind=mm_wp), INTENT(out) :: sca !! Scattering. |
---|
| 143 | REAL(kind=mm_wp), INTENT(out) :: ssa !! Single scattering albedo. |
---|
| 144 | REAL(kind=mm_wp), INTENT(out) :: asf !! Asymetry factor. |
---|
| 145 | LOGICAL :: ret !! true on success, false otherwise. |
---|
| 146 | INTEGER :: i,ridx |
---|
| 147 | REAL(kind=mm_wp) :: rc1,rc2,rx,rc |
---|
| 148 | ret = .false. |
---|
| 149 | IF (mmp_nrc == -1) RETURN |
---|
| 150 | ret = .true. |
---|
| 151 | rc = mm_get_rcs(M0,M3) |
---|
| 152 | ridx = mmp_nrc |
---|
| 153 | DO i=1, mmp_nrc |
---|
| 154 | IF (rc < mmp_rc(i)) THEN |
---|
| 155 | ridx = i-1 |
---|
| 156 | EXIT |
---|
| 157 | ENDIF |
---|
| 158 | ENDDO |
---|
| 159 | IF (ridx == 0) THEN |
---|
| 160 | ! out of range lower bound |
---|
| 161 | ext = ext_s_v(1,iwn) |
---|
| 162 | sca = sca_s_v(1,iwn) |
---|
| 163 | asf = asf_s_v(1,iwn) |
---|
| 164 | ssa = sca/ext |
---|
| 165 | ELSE IF (ridx == mmp_nrc) THEN |
---|
| 166 | ! out of range upper bound |
---|
| 167 | ext = ext_s_v(mmp_nrc,iwn) |
---|
| 168 | sca = sca_s_v(mmp_nrc,iwn) |
---|
| 169 | asf = asf_s_v(mmp_nrc,iwn) |
---|
| 170 | ssa = sca/ext |
---|
| 171 | ELSE |
---|
| 172 | ! in range: interpolate |
---|
| 173 | rc1 = mmp_rc(ridx) ; rc2 = mmp_rc(ridx+1) |
---|
| 174 | rx = (rc-rc1)/(rc2-rc1) |
---|
| 175 | ext = exp(log(ext_s_v(ridx,iwn))*(1d0-rx) + log(ext_s_v(ridx+1,iwn))*rx) |
---|
| 176 | sca = exp(log(sca_s_v(ridx,iwn))*(1d0-rx) + log(sca_s_v(ridx+1,iwn))*rx) |
---|
| 177 | asf = asf_s_v(ridx,iwn)*(1d0-rx) + asf_s_v(ridx+1,iwn)*rx |
---|
| 178 | ssa = sca/ext |
---|
| 179 | ENDIF |
---|
| 180 | ! scale by M0 |
---|
| 181 | ext = ext * M0 |
---|
| 182 | RETURN |
---|
| 183 | END FUNCTION mmp_sph_optics_vis |
---|
| 184 | |
---|
| 185 | FUNCTION mmp_sph_optics_ir(M0,M3,iwn,ext,sca,ssa,asf) RESULT(ret) |
---|
| 186 | !! Compute optical properties of the spherical mode in the infra-red range. |
---|
| 187 | REAL(kind=mm_wp), INTENT(in) :: M0 !! 0th order moment of the spherical mode (m-2). |
---|
| 188 | REAL(kind=mm_wp), INTENT(in) :: M3 !! 3rd order moment of the spherical mode (m3.m-2). |
---|
| 189 | INTEGER, INTENT(in) :: iwn !! Index of the wavenumber to compute |
---|
| 190 | REAL(kind=mm_wp), INTENT(out) :: ext !! Extinction opacity. |
---|
| 191 | REAL(kind=mm_wp), INTENT(out) :: sca !! Scattering. |
---|
| 192 | REAL(kind=mm_wp), INTENT(out) :: ssa !! Single scattering albedo. |
---|
| 193 | REAL(kind=mm_wp), INTENT(out) :: asf !! Asymetry factor. |
---|
| 194 | LOGICAL :: ret !! true on success, false otherwise. |
---|
| 195 | INTEGER :: i,ridx |
---|
| 196 | REAL(kind=mm_wp) :: rc1,rc2,rx,rc |
---|
| 197 | ret = .false. |
---|
| 198 | IF (mmp_nrc == -1) RETURN |
---|
| 199 | ret = .true. |
---|
| 200 | rc = mm_get_rcs(M0,M3) |
---|
| 201 | ridx = mmp_nrc |
---|
| 202 | DO i=1, mmp_nrc |
---|
| 203 | IF (rc < mmp_rc(i)) THEN |
---|
| 204 | ridx = i-1 |
---|
| 205 | EXIT |
---|
| 206 | ENDIF |
---|
| 207 | ENDDO |
---|
| 208 | IF (ridx == 0) THEN |
---|
| 209 | ! out of range lower bound |
---|
| 210 | ext = ext_s_i(1,iwn) |
---|
| 211 | sca = sca_s_i(1,iwn) |
---|
| 212 | asf = asf_s_i(1,iwn) |
---|
| 213 | ssa = sca/ext |
---|
| 214 | ELSE IF (ridx == mmp_nrc) THEN |
---|
| 215 | ! out of range upper bound |
---|
| 216 | ext = ext_s_i(mmp_nrc,iwn) |
---|
| 217 | sca = sca_s_i(mmp_nrc,iwn) |
---|
| 218 | asf = asf_s_i(mmp_nrc,iwn) |
---|
| 219 | ssa = sca/ext |
---|
| 220 | ELSE |
---|
| 221 | ! in range: interpolate |
---|
| 222 | rc1 = mmp_rc(ridx) ; rc2 = mmp_rc(ridx+1) |
---|
| 223 | rx = (rc-rc1)/(rc2-rc1) |
---|
| 224 | ext = exp(log(ext_s_i(ridx,iwn))*(1d0-rx) + log(ext_s_i(ridx+1,iwn))*rx) |
---|
| 225 | sca = exp(log(sca_s_i(ridx,iwn))*(1d0-rx) + log(sca_s_i(ridx+1,iwn))*rx) |
---|
| 226 | asf = asf_s_i(ridx,iwn)*(1d0-rx) + asf_s_i(ridx+1,iwn)*rx |
---|
| 227 | ssa = sca/ext |
---|
| 228 | ENDIF |
---|
| 229 | ! scale by M0 |
---|
| 230 | ext = ext * M0 |
---|
| 231 | RETURN |
---|
| 232 | END FUNCTION mmp_sph_optics_ir |
---|
| 233 | |
---|
| 234 | FUNCTION mmp_fra_optics_vis(M0,M3,iwn,ext,sca,ssa,asf) RESULT(ret) |
---|
| 235 | !! Compute optical properties of the spherical mode in the visible range. |
---|
| 236 | REAL(kind=mm_wp), INTENT(in) :: M0 !! 0th order moment of the fractal mode (m-2). |
---|
| 237 | REAL(kind=mm_wp), INTENT(in) :: M3 !! 3rd order moment of the fractal mode (m3.m-2). |
---|
| 238 | INTEGER, INTENT(in) :: iwn !! Index of the wavenumber to compute. |
---|
| 239 | REAL(kind=mm_wp), INTENT(out) :: ext !! Extinction opacity. |
---|
| 240 | REAL(kind=mm_wp), INTENT(out) :: sca !! Scattering. |
---|
| 241 | REAL(kind=mm_wp), INTENT(out) :: ssa !! Single scattering albedo. |
---|
| 242 | REAL(kind=mm_wp), INTENT(out) :: asf !! Asymetry factor. |
---|
| 243 | LOGICAL :: ret !! true on success, false otherwise. |
---|
| 244 | INTEGER :: i,ridx |
---|
| 245 | REAL(kind=mm_wp) :: rc1,rc2,rx,rc |
---|
| 246 | ret = .false. |
---|
| 247 | IF (mmp_nrc == -1) RETURN |
---|
| 248 | ret = .true. |
---|
| 249 | rc = mm_get_rcs(M0,M3) |
---|
| 250 | ridx = mmp_nrc |
---|
| 251 | DO i=1, mmp_nrc |
---|
| 252 | IF (rc < mmp_rc(i)) THEN |
---|
| 253 | ridx = i-1 |
---|
| 254 | EXIT |
---|
| 255 | ENDIF |
---|
| 256 | ENDDO |
---|
| 257 | IF (ridx == 0) THEN |
---|
| 258 | ! out of range lower bound |
---|
| 259 | ext = ext_f_v(1,iwn) |
---|
| 260 | sca = sca_f_v(1,iwn) |
---|
| 261 | asf = asf_f_v(1,iwn) |
---|
| 262 | ssa = sca/ext |
---|
| 263 | ELSE IF (ridx == mmp_nrc) THEN |
---|
| 264 | ! out of range upper bound |
---|
| 265 | ext = ext_f_v(mmp_nrc,iwn) |
---|
| 266 | sca = sca_f_v(mmp_nrc,iwn) |
---|
| 267 | asf = asf_f_v(mmp_nrc,iwn) |
---|
| 268 | ssa = sca/ext |
---|
| 269 | ELSE |
---|
| 270 | ! in range: interpolate |
---|
| 271 | rc1 = mmp_rc(ridx) ; rc2 = mmp_rc(ridx+1) |
---|
| 272 | rx = (rc-rc1)/(rc2-rc1) |
---|
| 273 | ext = exp(log(ext_f_v(ridx,iwn))*(1d0-rx) + log(ext_f_v(ridx+1,iwn))*rx) |
---|
| 274 | sca = exp(log(sca_f_v(ridx,iwn))*(1d0-rx) + log(sca_f_v(ridx+1,iwn))*rx) |
---|
| 275 | asf = asf_f_v(ridx,iwn)*(1d0-rx) + asf_f_v(ridx+1,iwn)*rx |
---|
| 276 | ssa = sca/ext |
---|
| 277 | ENDIF |
---|
| 278 | ! scale by M0 |
---|
| 279 | ext = ext * M0 |
---|
| 280 | RETURN |
---|
| 281 | END FUNCTION mmp_fra_optics_vis |
---|
| 282 | |
---|
| 283 | FUNCTION mmp_fra_optics_ir(M0,M3,iwn,ext,sca,ssa,asf) RESULT(ret) |
---|
| 284 | !! Compute optical properties of the spherical mode in the infra-red range. |
---|
| 285 | REAL(kind=mm_wp), INTENT(in) :: M0 !! 0th order moment of the spherical mode (m-2). |
---|
| 286 | REAL(kind=mm_wp), INTENT(in) :: M3 !! 3rd order moment of the spherical mode (m3.m-2). |
---|
| 287 | INTEGER, INTENT(in) :: iwn !! Index of the wavenumber to compute |
---|
| 288 | REAL(kind=mm_wp), INTENT(out) :: ext !! Extinction opacity. |
---|
| 289 | REAL(kind=mm_wp), INTENT(out) :: sca !! Scattering. |
---|
| 290 | REAL(kind=mm_wp), INTENT(out) :: ssa !! Single scattering albedo. |
---|
| 291 | REAL(kind=mm_wp), INTENT(out) :: asf !! Asymetry factor. |
---|
| 292 | LOGICAL :: ret !! true on success, false otherwise. |
---|
| 293 | INTEGER :: i,ridx |
---|
| 294 | REAL(kind=mm_wp) :: rc1,rc2,rx,rc |
---|
| 295 | ret = .false. |
---|
| 296 | IF (mmp_nrc == -1) RETURN |
---|
| 297 | ret = .true. |
---|
| 298 | rc = mm_get_rcs(M0,M3) |
---|
| 299 | ridx = mmp_nrc |
---|
| 300 | DO i=1, mmp_nrc |
---|
| 301 | IF (rc < mmp_rc(i)) THEN |
---|
| 302 | ridx = i-1 |
---|
| 303 | EXIT |
---|
| 304 | ENDIF |
---|
| 305 | ENDDO |
---|
| 306 | IF (ridx == 0) THEN |
---|
| 307 | ! out of range lower bound |
---|
| 308 | ext = ext_f_i(1,iwn) |
---|
| 309 | sca = sca_f_i(1,iwn) |
---|
| 310 | asf = asf_f_i(1,iwn) |
---|
| 311 | ssa = sca/ext |
---|
| 312 | ELSE IF (ridx == mmp_nrc) THEN |
---|
| 313 | ! out of range upper bound |
---|
| 314 | ext = ext_f_i(mmp_nrc,iwn) |
---|
| 315 | sca = sca_f_i(mmp_nrc,iwn) |
---|
| 316 | asf = asf_f_i(mmp_nrc,iwn) |
---|
| 317 | ssa = sca/ext |
---|
| 318 | ELSE |
---|
| 319 | ! in range: interpolate |
---|
| 320 | rc1 = mmp_rc(ridx) ; rc2 = mmp_rc(ridx+1) |
---|
| 321 | rx = (rc-rc1)/(rc2-rc1) |
---|
| 322 | ext = exp(log(ext_f_i(ridx,iwn))*(1d0-rx) + log(ext_f_i(ridx+1,iwn))*rx) |
---|
| 323 | sca = exp(log(sca_f_i(ridx,iwn))*(1d0-rx) + log(sca_f_i(ridx+1,iwn))*rx) |
---|
| 324 | asf = asf_f_i(ridx,iwn)*(1d0-rx) + asf_f_i(ridx+1,iwn)*rx |
---|
| 325 | ssa = sca/ext |
---|
| 326 | ENDIF |
---|
| 327 | ! scale by M0 |
---|
| 328 | ext = ext * M0 |
---|
| 329 | RETURN |
---|
| 330 | END FUNCTION mmp_fra_optics_ir |
---|
| 331 | |
---|
| 332 | FUNCTION read_lookup_tables(path) RESULT(ret) |
---|
| 333 | !! Read look-up tables. |
---|
| 334 | CHARACTER(len=*), INTENT(in) :: path !! Path of the look-up tables netcdf file. |
---|
| 335 | LOGICAL :: ret !! .true. on success, .false. otherwise. |
---|
| 336 | REAL(kind=mm_wp), DIMENSION(:), ALLOCATABLE :: sigmas_vi,sigmas_ir |
---|
| 337 | |
---|
| 338 | TYPE(DSET2D) :: dset |
---|
| 339 | ! data(nrc,ni|nv) |
---|
| 340 | ! INFRARED |
---|
| 341 | ret = read_dset(path,"ext_s_i",dset) |
---|
| 342 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'ext_s_i' table" ; RETURN ; ENDIF |
---|
| 343 | ext_s_i = dset%data ; sigmas_ir = dset%y ; mmp_rc = dset%x |
---|
| 344 | ret = read_dset(path,"ext_f_i",dset) |
---|
| 345 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'ext_f_i' table" ; RETURN ; ENDIF |
---|
| 346 | ext_f_i = dset%data |
---|
| 347 | ret = read_dset(path,"sca_s_i",dset) |
---|
| 348 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'sca_s_i' table" ; RETURN ; ENDIF |
---|
| 349 | sca_s_i = dset%data |
---|
| 350 | ret = read_dset(path,"sca_f_i",dset) |
---|
| 351 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'sca_f_i' table" ; RETURN ; ENDIF |
---|
| 352 | sca_f_i = dset%data |
---|
| 353 | ret = read_dset(path,"asf_s_i",dset) |
---|
| 354 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'asf_s_i' table" ; RETURN ; ENDIF |
---|
| 355 | asf_s_i = dset%data |
---|
| 356 | ret = read_dset(path,"asf_f_i",dset) |
---|
| 357 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'asf_f_i' table" ; RETURN ; ENDIF |
---|
| 358 | asf_f_i = dset%data |
---|
| 359 | ! VISIBLE |
---|
| 360 | ret = read_dset(path,"ext_s_v",dset) |
---|
| 361 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'ext_s_v' table" ; RETURN ; ENDIF |
---|
| 362 | ext_s_v = dset%data ; sigmas_vi = dset%y |
---|
| 363 | ret = read_dset(path,"ext_f_v",dset) |
---|
| 364 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'ext_f_v' table" ; RETURN ; ENDIF |
---|
| 365 | ext_f_v = dset%data |
---|
| 366 | ret = read_dset(path,"sca_s_v",dset) |
---|
| 367 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'sca_s_v' table" ; RETURN ; ENDIF |
---|
| 368 | sca_s_v = dset%data |
---|
| 369 | ret = read_dset(path,"sca_f_v",dset) |
---|
| 370 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'sca_f_v' table" ; RETURN ; ENDIF |
---|
| 371 | sca_f_v = dset%data |
---|
| 372 | ret = read_dset(path,"asf_s_v",dset) |
---|
| 373 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'asf_s_v' table" ; RETURN ; ENDIF |
---|
| 374 | asf_s_v = dset%data |
---|
| 375 | ret = read_dset(path,"asf_f_v",dset) |
---|
| 376 | IF (.NOT.ret) THEN ; WRITE(*,'(a)') "[read_tables] cannot read 'asf_f_v' table" ; RETURN ; ENDIF |
---|
| 377 | asf_f_v = dset%data |
---|
| 378 | mmp_nrc = SIZE(mmp_rc) |
---|
| 379 | ret = .true. |
---|
| 380 | RETURN |
---|
| 381 | END FUNCTION read_lookup_tables |
---|
| 382 | |
---|
| 383 | END MODULE MMP_OPTICS |
---|
| 384 | |
---|