Line data Source code
1 : !-------------------------------------------------------------------------------
2 : ! solar wind data -- IMF components, wind velocity and density
3 : !-------------------------------------------------------------------------------
4 : module solar_wind_data
5 :
6 : use shr_kind_mod, only : r8 => shr_kind_r8, shr_kind_cl
7 : use input_data_utils, only : time_coordinate
8 : use infnan, only : nan, assignment(=)
9 :
10 : implicit none
11 :
12 : private
13 : save
14 :
15 : ! public interface
16 :
17 : public :: solar_wind_init
18 : public :: solar_wind_advance
19 :
20 : logical, public :: solar_wind_on = .false.
21 :
22 : ! time-interpolated quantities
23 :
24 : real(r8), public, protected :: solar_wind_byimf
25 : real(r8), public, protected :: solar_wind_bzimf
26 : real(r8), public, protected :: solar_wind_swvel
27 : real(r8), public, protected :: solar_wind_swden
28 :
29 : ! private data
30 :
31 : real(r8), allocatable :: byimf_in(:)
32 : real(r8), allocatable :: bzimf_in(:)
33 : real(r8), allocatable :: swvel_in(:)
34 : real(r8), allocatable :: swden_in(:)
35 :
36 : type(time_coordinate) :: time_coord
37 :
38 : contains
39 :
40 1536 : subroutine solar_wind_init(filepath, fixed, fixed_ymd, fixed_tod)
41 : !---------------------------------------------------------------
42 : ! ... initialize solar parmaters
43 : !---------------------------------------------------------------
44 :
45 : use ioFileMod
46 : use error_messages, only: alloc_err
47 : use cam_pio_utils, only: cam_pio_openfile
48 : use pio, only: file_desc_t, var_desc_t, pio_get_var, &
49 : pio_inq_varid, pio_closefile, pio_nowrite
50 :
51 : !---------------------------------------------------------------
52 : ! arguments
53 : !---------------------------------------------------------------
54 : character(len=*), intent(in) :: filepath
55 : logical, intent(in) :: fixed
56 : integer, intent(in) :: fixed_ymd
57 : integer, intent(in) :: fixed_tod
58 :
59 : !---------------------------------------------------------------
60 : ! ... local variables
61 : !---------------------------------------------------------------
62 : type(file_desc_t) :: ncid
63 : type(var_desc_t) :: varid
64 : integer :: astat
65 : character(len=shr_kind_cl) :: locfn
66 : integer :: ierr
67 :
68 1536 : solar_wind_byimf = nan
69 1536 : solar_wind_bzimf = nan
70 1536 : solar_wind_swvel = nan
71 1536 : solar_wind_swden = nan
72 :
73 1536 : solar_wind_on = (trim(filepath).ne.'NONE' .and. len_trim(filepath)>0)
74 :
75 1536 : if (.not.solar_wind_on) return
76 :
77 : !-----------------------------------------------------------------------
78 : ! ... readin the solar parms dataset
79 : !-----------------------------------------------------------------------
80 :
81 0 : call getfil(filepath, locfn, 0)
82 0 : call cam_pio_openfile ( ncid, locfn, PIO_NOWRITE)
83 :
84 : call time_coord%initialize( filepath, fixed=fixed, fixed_ymd=fixed_ymd, &
85 0 : fixed_tod=fixed_tod, force_time_interp=.true. )
86 :
87 : !---------------------------------------------------------------
88 : ! ... allocate and read solar parms
89 : !---------------------------------------------------------------
90 : allocate( byimf_in(time_coord%ntimes), bzimf_in(time_coord%ntimes), &
91 : swvel_in(time_coord%ntimes), swden_in(time_coord%ntimes), &
92 0 : stat=astat )
93 0 : if( astat /= 0 ) then
94 : call alloc_err( astat, 'solar_wind_init', 'byimf_in ... swden_in ', &
95 0 : time_coord%ntimes )
96 : end if
97 :
98 0 : ierr = pio_inq_varid( ncid, 'by', varid )
99 0 : ierr = pio_get_var( ncid, varid, byimf_in )
100 0 : ierr = pio_inq_varid( ncid, 'bz', varid )
101 0 : ierr = pio_get_var( ncid, varid, bzimf_in )
102 0 : ierr = pio_inq_varid( ncid, 'swvel', varid )
103 0 : ierr = pio_get_var( ncid, varid, swvel_in )
104 0 : ierr = pio_inq_varid( ncid, 'swden', varid )
105 0 : ierr = pio_get_var( ncid, varid, swden_in )
106 :
107 0 : call pio_closefile( ncid )
108 :
109 3072 : end subroutine solar_wind_init
110 :
111 370944 : subroutine solar_wind_advance
112 : !---------------------------------------------------------------
113 : ! time interpolate space wx indices
114 : !---------------------------------------------------------------
115 :
116 370944 : if (solar_wind_on) then
117 0 : call time_coord%advance()
118 : ! time interpolate
119 0 : solar_wind_byimf = time_coord%wghts(1)*byimf_in(time_coord%indxs(1)) &
120 0 : + time_coord%wghts(2)*byimf_in(time_coord%indxs(2))
121 0 : solar_wind_bzimf = time_coord%wghts(1)*bzimf_in(time_coord%indxs(1)) &
122 0 : + time_coord%wghts(2)*bzimf_in(time_coord%indxs(2))
123 0 : solar_wind_swvel = time_coord%wghts(1)*swvel_in(time_coord%indxs(1)) &
124 0 : + time_coord%wghts(2)*swvel_in(time_coord%indxs(2))
125 0 : solar_wind_swden = time_coord%wghts(1)*swden_in(time_coord%indxs(1)) &
126 0 : + time_coord%wghts(2)*swden_in(time_coord%indxs(2))
127 : endif
128 :
129 1536 : end subroutine solar_wind_advance
130 :
131 : end module solar_wind_data
|