1 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/tools_wrfda.fypp"
2 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp" 1
3 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../subr_list.fypp" 1
12 # 926 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../subr_list.fypp"
13 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp" 2
22 # 112 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/../instrumentation.fypp"
23 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/external/tools_wrfda.fypp" 2
71 integer,
intent(in) :: n
72 real(kind_real),
intent(in) :: a(n,n)
73 real(kind_real),
intent(out) :: ainv(n,n)
74 integer,
intent(in),
optional :: mmax
75 real(kind_real),
intent(in),
optional :: var_th
79 real(kind_real) :: evec(n,n),eval(n),evalinv(n)
91 if (
present(mmax))
then
95 if (
present(var_th))
then
99 call mpl%abort(
'wrfda_pseudoinv',
'either dominant mode or variance threshold should be specified')
102 if (lmmax>n)
call mpl%abort(
'wrfda_pseudoinv',
'dominant mode should smaller than the matrix rank')
106 if (abs(eval(i))>
zero)
then
107 evalinv(i) =
one/eval(i)
131 integer,
intent(in) :: n
132 real(kind_real),
intent(in) :: a(n,n)
133 real(kind_real),
intent(out) :: evec(n,n)
134 real(kind_real),
intent(out) :: eval(n)
137 integer :: work,ierr,i
138 real(kind_real) :: work_array(3*n-1),evec_copy(n,n),eval_copy(n)
152 call dsyev(
'V',
'U',n,evec_copy,n,eval_copy,work_array,work,ierr)
153 if (ierr/=0)
call mpl%abort(
'wrfda_da_eof_decomposition',
'dsyev failed')
157 eval(i) = eval_copy(n+1-i)
158 evec(:,i) = evec_copy(:,n+1-i)
175 integer,
intent(in) :: n
184 real(
kind_real) :: total_variance,cumul_variance
193 total_variance = sum(eval)
196 cumul_variance =
zero
199 cumul_variance = cumul_variance+eval(i)/total_variance
200 if (cumul_variance>
one-var_th)
then
220 integer,
intent(in) :: n
221 integer,
intent(in) :: mmax
222 real(kind_real),
intent(in) :: evec(n,n)
223 real(kind_real),
intent(in) :: eval(n)
224 real(kind_real),
intent(out) :: a(n,n)
228 real(kind_real) :: tmp(n,n)
240 tmp(j,i) = evec(i,j)*eval(j)
247 a(i,j) = sum(evec(i,:)*tmp(:,j))
Generic ranks, dimensions and types.