10 use fckit_configuration_module,
only: fckit_configuration
18 use missing_values_mod
29 real(c_double) :: r_miss_val
30 real (kind=kind_real),
allocatable :: jac(:,:)
44 type(fckit_configuration),
intent(in) :: f_conf
52 if (
allocated(self%jac))
deallocate(self%jac)
64 type(c_ptr),
value,
intent(in) :: obss
66 character(len=*),
parameter :: myname_=
"ufo_coolskin_tlad_settraj"
67 type(
ufo_geoval),
pointer :: S_ns,H_I,H_s,R_nl,Td,u
70 self%nlocs = obsspace_get_nlocs(obss)
83 self%r_miss_val = missing_value(self%r_miss_val)
86 allocate(self%jac(6,self%nlocs))
87 do iobs = 1, self%nlocs
105 real(c_double),
intent(inout) :: hofx(:)
106 type(c_ptr),
value,
intent(in) :: obss
108 character(len=*),
parameter :: myname_=
"ufo_coolskin_simobs_tl"
109 character(max_string) :: err_msg
110 integer :: iobs, nobs
111 type(
ufo_geoval),
pointer :: S_ns,H_I,H_s,R_nl,Td,u
123 if (.not. self%ltraj)
then
124 write(err_msg,*) myname_,
' trajectory wasnt set!'
125 call abor1_ftn(err_msg)
131 if (geovals%nlocs /= nobs)
then
132 write(err_msg,*) myname_,
' error: nobs inconsistent!'
133 call abor1_ftn(err_msg)
139 do iobs = 1, self%nlocs
140 hofx(iobs) = self%jac(1,iobs)*s_ns%vals(1,iobs) + &
141 self%jac(2,iobs)*h_i%vals(1,iobs) + &
142 self%jac(3,iobs)*h_s%vals(1,iobs) + &
143 self%jac(4,iobs)*r_nl%vals(1,iobs) + &
144 self%jac(5,iobs)*td%vals(1,iobs) + &
145 self%jac(6,iobs)*u%vals(1,iobs)
156 real(c_double),
intent(in) :: hofx(:)
157 type(c_ptr),
value,
intent(in) :: obss
159 character(len=*),
parameter :: myname_=
"ufo_coolskin_simobs_ad"
160 character(max_string) :: err_msg
162 integer :: iobs, nobs
164 type(
ufo_geoval),
pointer :: S_ns, H_I, H_s, R_nl, Td, u
168 if (.not. self%ltraj)
then
169 write(err_msg,*) myname_,
' trajectory wasnt set!'
170 call abor1_ftn(err_msg)
175 if (geovals%nlocs /= nobs)
then
176 write(err_msg,*) myname_,
' error: nobs inconsistent!'
177 call abor1_ftn(err_msg)
180 if (.not. geovals%linit ) geovals%linit=.true.
191 if (.not.
allocated(td%vals))
allocate(td%vals(1,nobs)); td%vals = 0.0
192 if (.not.
allocated(r_nl%vals))
allocate(r_nl%vals(1,nobs)); r_nl%vals = 0.0
193 if (.not.
allocated(h_i%vals))
allocate(h_i%vals(1,nobs)); h_i%vals = 0.0
194 if (.not.
allocated(h_s%vals))
allocate(h_s%vals(1,nobs)); h_s%vals = 0.0
195 if (.not.
allocated(s_ns%vals))
allocate(s_ns%vals(1,nobs)); s_ns%vals = 0.0
196 if (.not.
allocated(u%vals))
allocate(u%vals(1,nobs)); u%vals = 0.0
200 if (hofx(iobs)/=self%r_miss_val)
then
201 s_ns%vals(1,iobs) = s_ns%vals(1,iobs) + self%jac(1,iobs)*hofx(iobs)
202 h_i%vals(1,iobs) = h_i%vals(1,iobs) + self%jac(2,iobs)*hofx(iobs)
203 h_s%vals(1,iobs) = h_s%vals(1,iobs) + self%jac(3,iobs)*hofx(iobs)
204 r_nl%vals(1,iobs) = r_nl%vals(1,iobs) + self%jac(4,iobs)*hofx(iobs)
205 td%vals(1,iobs) = td%vals(1,iobs) + self%jac(5,iobs)*hofx(iobs)
206 u%vals(1,iobs) = u%vals(1,iobs) + self%jac(6,iobs)*hofx(iobs)