41 real(wp),
dimension(nc_ml_input * nc_ml_nodes),
parameter :: &
42 nc_ml_w00 = [-2.006957_wp, -0.2812008_wp, -0.339073_wp, 1.596426_wp, 2.395225_wp, 1.76315_wp, &
43 -0.0626798_wp, 1.267002_wp, -0.02234177_wp, -6.522605e-33_wp, 0.4792154_wp, -0.1253034_wp, &
44 -3.217191_wp, -3.092887_wp, -0.0863651_wp, 1.071625_wp, 0.09741028_wp, 0.2255831_wp, &
45 -0.6929023_wp, -0.02693799_wp, -3.432344e-33_wp, -0.8791879_wp, -0.9359049_wp, 1.083484_wp, &
46 -0.07909214_wp, -0.0122418_wp, -0.02815927_wp, 0.1676407_wp, 0.08252326_wp, 0.6697816_wp, &
47 -0.4019359_wp, 0.4687141_wp, 0.001813132_wp, -9.792186e-33_wp, 0.0409322_wp, 0.0113192_wp, &
48 -0.01354596_wp, 0.00307771_wp, -0.4635534_wp, 0.03835761_wp, -0.1015553_wp, 0.7316446_wp, &
49 -0.05791711_wp, -0.0002690362_wp, -7.920147e-33_wp, -0.1216918_wp, -0.3190572_wp, 0.09809405_wp, &
50 -0.16476_wp, -0.03387314_wp, 0.005422261_wp, 0.04043967_wp, 0.03901243_wp, 0.07444729_wp, &
51 0.01954299_wp, 0.06918761_wp, 0.04823543_wp, -8.637957e-33_wp, 0.06371575_wp, -0.09250915_wp, &
52 -1.109653_wp, -1.373999_wp, -0.2412623_wp, -0.04482195_wp, 0.1584691_wp, 0.06353725_wp, &
53 0.0006248798_wp, 0.04593191_wp, -8.878673e-33_wp, -0.4988684_wp, 0.01110262_wp, 0.04623203_wp, &
54 0.006581791_wp, 0.03536217_wp, -0.1890567_wp, -0.08839592_wp, 0.1327181_wp, 0.03478973_wp, &
55 -0.1565902_wp, -0.100401_wp, -0.1179777_wp, -8.879818e-33_wp, -0.1383738_wp, 0.02847495_wp, &
56 -0.005902881_wp, 0.005615512_wp, -0.6308192_wp, -0.02431803_wp, -0.141971_wp, -0.3490018_wp, &
57 -0.9850957_wp, -0.1449479_wp, -8.059166e-33_wp, -0.1186465_wp, -1.165381_wp, 0.069015_wp, &
58 0.003388841_wp, -0.04041302_wp, 0.1638467_wp, 0.1147008_wp, -0.04833491_wp, -0.07755993_wp, &
59 -0.5137688_wp, 0.04546477_wp, 0.04101883_wp, 6.752353e-33_wp, 0.3541977_wp, 0.04880851_wp, &
60 -0.00102834_wp, -0.01280629_wp, -0.1116254_wp, -0.02204754_wp, 0.07100908_wp, 0.2354002_wp, &
61 0.07129629_wp, 0.2489657_wp, 8.080785e-33_wp, -0.03449865_wp, 0.06037927_wp, -0.02023619_wp, &
62 0.7779589_wp, 0.04680278_wp, 0.7492616_wp, 0.6545208_wp, -1.09497_wp, -1.176524_wp, &
63 -0.451585_wp, 0.881124_wp, -0.4551499_wp, -8.708624e-33_wp, 1.006558_wp, -0.04979523_wp, &
64 -0.0006915367_wp, -0.002993054_wp, 0.01654614_wp, -0.07141764_wp, -0.2216591_wp, 0.8637336_wp, &
65 0.8358089_wp, -0.7576646_wp, 8.186339e-33_wp, 0.1161914_wp, 0.7121871_wp, -1.146734_wp, &
66 0.03925339_wp, 0.9975697_wp, -0.06953461_wp, -0.07598846_wp, -0.06418022_wp, -0.01897495_wp, &
67 -0.03612464_wp, -0.06703389_wp, -0.103049_wp, 9.364858e-33_wp, -0.03949085_wp, 1.005938_wp, &
68 0.0001625419_wp, -0.01027657_wp, 0.03823901_wp, 0.3197246_wp, -0.1160718_wp, 0.04449431_wp, &
69 0.009831783_wp, 0.6551342_wp, -8.470687e-33_wp, 0.1374123_wp, -0.01782138_wp, 0.01719949_wp]
104 subroutine tempo_ml_predict_cloud_number(qc, qr, qi, qs, pres, temp, w, &
108 real(wp),
dimension(:),
intent(in) :: qc, qr, qi, qs, pres, temp, w
109 real(wp),
dimension(:),
intent(inout) :: predicted_number
113 integer,
parameter :: input_rows = 1
115 real(wp) :: input(nc_ml_input, size(qc))
116 real(wp) :: input_transformed(nc_ml_input, size(qc))
117 real(wp) :: output00(nc_ml_nodes, size(qc))
118 real(wp) :: output00_activ(nc_ml_nodes, size(qc))
119 real(wp) :: reshaped_bias00(nc_ml_nodes, size(qc))
120 real(wp) :: output01(nc_ml_output, size(qc))
121 real(wp) :: output01_activ(nc_ml_output, size(qc))
122 real(wp) :: reshaped_bias01(nc_ml_output, size(qc))
124 real(wp),
parameter :: logmin = -6.0_wp
125 real(wp),
parameter :: logmax = 9.3010299957_wp
126 real(wp) :: predicted_exp, bias_corr
130 call save_or_read_ml_data(ml_data_out=get_ml_data)
131 ml_data = get_ml_data(1)
144 call standard_scaler_transform(mean=ml_data%transform_mean, var=ml_data%transform_var, &
145 raw_data=input, transformed_data=input_transformed)
148 reshaped_bias00(:,k) = ml_data%bias00
149 reshaped_bias01(1,k) = ml_data%bias01(1)
154 output00 = matmul(ml_data%weights00, input_transformed) + reshaped_bias00
155 call relu_activation(input=output00, output=output00_activ)
158 output01 = matmul(ml_data%weights01, output00_activ) + reshaped_bias01
159 call relu_activation(input=output01, output=output01_activ)
163 predicted_exp = min(logmax, max(logmin, output01_activ(1,k)))
167 if ((predicted_exp >= 0._wp) .and. (predicted_exp < 3._wp))
then
168 bias_corr = -0.2704_wp*predicted_exp**5 + 1.838_wp*predicted_exp**4 - &
169 5.127_wp*predicted_exp**3 + 8.547_wp*predicted_exp**2 - &
170 8.439_wp*predicted_exp + 4.297_wp
172 predicted_number(k) = bias_corr * (10._wp**predicted_exp)