Skip to content

Commit 5bfdadb

Browse files
committed
Added guard against divide by zero in LIDAR simulator.
1 parent df36cf6 commit 5bfdadb

File tree

1 file changed

+24
-16
lines changed

1 file changed

+24
-16
lines changed

actsim/lidar_simulator.F90

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ SUBROUTINE lidar_simulator(npoints,nlev,npart,nrefl &
199199
REAL pnorm_ice(npoints,nlev) ! lidar backscattered signal power for ice
200200
REAL pnorm_perp_ice(npoints,nlev) ! perpendicular lidar backscattered signal power for ice
201201
REAL pnorm_perp_liq(npoints,nlev) ! perpendicular lidar backscattered signal power for liq
202-
202+
real epsreal
203+
203204
! Output variable
204205
REAL pnorm_perp_tot (npoints,nlev) ! perpendicular lidar backscattered signal power
205206

@@ -498,20 +499,24 @@ SUBROUTINE lidar_simulator(npoints,nlev,npart,nrefl &
498499
ENDDO
499500

500501
! Computation of beta_perp_ice/liq using the lidar equation
502+
epsreal = epsilon(1.)
501503
! Ice only
502504
! Upper layer
503505
beta_perp_ice(:,nlev) = pnorm_perp_ice(:,nlev) * (2.*tautot_ice(:,nlev)) &
504506
& / (1.-exp(-2.0*tautot_ice(:,nlev)))
505507

506508
DO k= nlev-1, 1, -1
507-
tautot_lay_ice(:) = tautot_ice(:,k)-tautot_ice(:,k+1)
508-
WHERE (tautot_lay_ice(:).GT.0.)
509-
beta_perp_ice(:,k) = pnorm_perp_ice(:,k)/ EXP(-2.0*tautot_ice(:,k+1)) * (2.*tautot_lay_ice(:)) &
510-
& / (1.-exp(-2.0*tautot_lay_ice(:)))
511-
512-
ELSEWHERE
513-
beta_perp_ice(:,k)=pnorm_perp_ice(:,k)/EXP(-2.0*tautot_ice(:,k+1))
514-
END WHERE
509+
tautot_lay_ice(:) = tautot_ice(:,k)-tautot_ice(:,k+1)
510+
WHERE ( EXP(-2.0*tautot_ice(:,k+1)) .gt. epsreal )
511+
WHERE (tautot_lay_ice(:).GT.0.)
512+
beta_perp_ice(:,k) = pnorm_perp_ice(:,k)/ EXP(-2.0*tautot_ice(:,k+1)) * (2.*tautot_lay_ice(:)) &
513+
& / (1.-exp(-2.0*tautot_lay_ice(:)))
514+
ELSEWHERE
515+
beta_perp_ice(:,k)=pnorm_perp_ice(:,k)/EXP(-2.0*tautot_ice(:,k+1))
516+
END WHERE
517+
elsewhere
518+
beta_perp_ice(:,k)=pnorm_perp_ice(:,k)/epsreal
519+
endwhere
515520
ENDDO
516521

517522
! Liquid only
@@ -521,13 +526,16 @@ SUBROUTINE lidar_simulator(npoints,nlev,npart,nrefl &
521526

522527
DO k= nlev-1, 1, -1
523528
tautot_lay_liq(:) = tautot_liq(:,k)-tautot_liq(:,k+1)
524-
WHERE (tautot_lay_liq(:).GT.0.)
525-
beta_perp_liq(:,k) = pnorm_perp_liq(:,k)/ EXP(-2.0*tautot_liq(:,k+1)) * (2.*tautot_lay_liq(:)) &
526-
& / (1.-exp(-2.0*tautot_lay_liq(:)))
527-
528-
ELSEWHERE
529-
beta_perp_liq(:,k)=pnorm_perp_liq(:,k)/EXP(-2.0*tautot_liq(:,k+1))
530-
END WHERE
529+
WHERE ( EXP(-2.0*tautot_liq(:,k+1)) .gt. epsreal )
530+
WHERE (tautot_lay_liq(:).GT.0.)
531+
beta_perp_liq(:,k) = pnorm_perp_liq(:,k)/ EXP(-2.0*tautot_liq(:,k+1)) * (2.*tautot_lay_liq(:)) &
532+
& / (1.-exp(-2.0*tautot_lay_liq(:)))
533+
ELSEWHERE
534+
beta_perp_liq(:,k)=pnorm_perp_liq(:,k)/EXP(-2.0*tautot_liq(:,k+1))
535+
END WHERE
536+
elsewhere
537+
beta_perp_liq(:,k)=pnorm_perp_liq(:,k)/epsreal
538+
endwhere
531539
ENDDO
532540

533541

0 commit comments

Comments
 (0)