From f36a8890df53b9183821dc03e0128b780e856e25 Mon Sep 17 00:00:00 2001
From: ronesy <rlt@nilu.no>
Date: Mon, 8 Jul 2024 16:11:37 +0200
Subject: [PATCH] Bug fix for prior profile reading from tropomi data and
 completion of the routine to read OCO2 data

---
 prep_satellite/get_bremen.f90  | 37 +++++++++++++++-------
 prep_satellite/get_oco2.f90    | 22 ++++++-------
 prep_satellite/get_tropomi.f90 | 56 +++++++++++++++++++++++++++-------
 3 files changed, 82 insertions(+), 33 deletions(-)

diff --git a/prep_satellite/get_bremen.f90 b/prep_satellite/get_bremen.f90
index e428896..a9c8e23 100644
--- a/prep_satellite/get_bremen.f90
+++ b/prep_satellite/get_bremen.f90
@@ -235,27 +235,27 @@ subroutine get_bremen(settings)
 
       ! select retrievals and extract needed info
       if( n.eq.1 ) then
-        allocate( xpoints(maxretr,ncoord) )
+        allocate( xpoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate xpoints'
-        allocate( ypoints(maxretr,ncoord) )
+        allocate( ypoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate ypoints'
-        allocate( zpoint1(maxretr,nlayer) )
+        allocate( zpoint1(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint1'
-        allocate( zpoint2(maxretr,nlayer) )
+        allocate( zpoint2(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint2'
-        allocate( idate(maxretr) )
+        allocate( idate(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate idate'
-        allocate( itime(maxretr) )
+        allocate( itime(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate itime'
-        allocate( cak_out(maxretr,nlayer) )
+        allocate( cak_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate cak_out'
-        allocate( vapri_out(maxretr,nlayer) )
+        allocate( vapri_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vapri_out'
-        allocate( vdryair_out(maxretr,nlayer) )
+        allocate( vdryair_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vdryair_out'
-        allocate( vmr_out(maxretr) )
+        allocate( vmr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vmr_out'
-        allocate( verr_out(maxretr) )
+        allocate( verr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate verr_out'
         nretr = 0
       endif
@@ -352,6 +352,21 @@ subroutine get_bremen(settings)
                    vapri_out, cpri, cakpri, cak_out, cdryair, vdryair_out, nretr, ncoord, nlayer)
     endif 
 
+    !! testing
+!    open(500,file='bremen_cak.txt',action='write',status='replace')
+!    do nm = 1, nretr
+!      write(500,fmt='(20(F7.5,1X))') cak_out(nm,:)
+!    end do
+!    close(500)
+!    open(500,file='bremen_cpri.txt',action='write',status='replace')
+!    do nm = 1, nretr
+!      write(500,fmt='(20(F7.2,1X))') vapri_out(nm,:)
+!    end do
+!    close(500)
+!    stop
+    !! 
+
+
     ! write output data
     ! -----------------
 
diff --git a/prep_satellite/get_oco2.f90 b/prep_satellite/get_oco2.f90
index e206ef5..9f3c00c 100644
--- a/prep_satellite/get_oco2.f90
+++ b/prep_satellite/get_oco2.f90
@@ -262,27 +262,27 @@ subroutine get_oco2(settings)
 
       ! select retrievals and extract needed info
       if( n.eq.1 ) then
-        allocate( xpoints(maxretr,ncoord) )
+        allocate( xpoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate xpoints'
-        allocate( ypoints(maxretr,ncoord) )
+        allocate( ypoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate ypoints'
-        allocate( zpoint1(maxretr,nlevel) )
+        allocate( zpoint1(maxretr,nlevel), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint1'
-        allocate( zpoint2(maxretr,nlevel) )
+        allocate( zpoint2(maxretr,nlevel), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint2'
-        allocate( idate(maxretr) )
+        allocate( idate(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate idate'
-        allocate( itime(maxretr) )
+        allocate( itime(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate itime'
-        allocate( cak_out(maxretr,nlevel) )
+        allocate( cak_out(maxretr,nlevel), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate cak_out'
-        allocate( vapri_out(maxretr,nlevel) )
+        allocate( vapri_out(maxretr,nlevel), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vapri_out'
-        allocate( vdryair_out(maxretr,nlevel) )
+        allocate( vdryair_out(maxretr,nlevel), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vdryair_out'
-        allocate( vmr_out(maxretr) )
+        allocate( vmr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vmr_out'
-        allocate( verr_out(maxretr) )
+        allocate( verr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate verr_out'
         nretr = 0
 
diff --git a/prep_satellite/get_tropomi.f90 b/prep_satellite/get_tropomi.f90
index bf8477d..0462e7a 100644
--- a/prep_satellite/get_tropomi.f90
+++ b/prep_satellite/get_tropomi.f90
@@ -69,6 +69,7 @@ subroutine get_tropomi(settings)
   real, dimension(:,:), allocatable                     :: xpoints, ypoints
   real, dimension(:,:), allocatable                     :: zpoint1, zpoint2
   real, dimension(:,:), allocatable                     :: cak_out, vapri_out, vdryair_out
+  real, dimension(:,:), allocatable                     :: cak_tmp, vapri_tmp, vdryair_tmp
   real, dimension(:), allocatable                       :: vmr_out, verr_out
   real, dimension(:), allocatable                       :: cpri, cakpri, cdryair
   integer, dimension(:), allocatable                    :: idate, itime, time
@@ -350,27 +351,27 @@ subroutine get_tropomi(settings)
 
       ! select retrievals and extract needed info
       if( n.eq.1 ) then
-        allocate( xpoints(maxretr,ncoord) )
+        allocate( xpoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate xpoints'
-        allocate( ypoints(maxretr,ncoord) )
+        allocate( ypoints(maxretr,ncoord), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate ypoints'
-        allocate( zpoint1(maxretr,nlayer) )
+        allocate( zpoint1(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint1'
-        allocate( zpoint2(maxretr,nlayer) )
+        allocate( zpoint2(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate zpoint2'
-        allocate( idate(maxretr) )
+        allocate( idate(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate idate'
-        allocate( itime(maxretr) )
+        allocate( itime(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate itime'
-        allocate( cak_out(maxretr,nlayer) )
+        allocate( cak_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate cak_out'
-        allocate( vapri_out(maxretr,nlayer) )
+        allocate( vapri_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vapri_out'
-        allocate( vdryair_out(maxretr,nlayer) )
+        allocate( vdryair_out(maxretr,nlayer), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vdryair_out'
-        allocate( vmr_out(maxretr) )
+        allocate( vmr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vmr_out'
-        allocate( verr_out(maxretr) )
+        allocate( verr_out(maxretr), stat=ierr )
         if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate verr_out'
         cak_out(:,:)=0.
         vapri_out(:,:)=0.
@@ -452,6 +453,26 @@ subroutine get_tropomi(settings)
 
     end do  ! nread
 
+    ! reverse direction of vertical coordinate
+    ! raw data ordered from top of atmosphere to surface
+    ! which is opposite to the pressure levels calculated (zpoint)
+    allocate( cak_tmp(maxretr,nlayer), stat=ierr )
+    if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate cak_tmp'
+    allocate( vapri_tmp(maxretr,nlayer), stat=ierr )
+    if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vapri_tmp'
+    allocate( vdryair_tmp(maxretr,nlayer), stat=ierr )
+    if ( ierr.ne.0 ) write(logid,*) 'ERROR: cannot allocate vdryair_tmp'
+
+    do nl = 1, nlayer
+      cak_tmp(:,nl) = cak_out(:,(nlayer-nl+1))
+      vapri_tmp(:,nl) = vapri_out(:,(nlayer-nl+1))
+      vdryair_tmp(:,nl) = vdryair_out(:,(nlayer-nl+1))
+    end do
+    cak_out = cak_tmp
+    vapri_out = vapri_tmp
+    vdryair_out = vdryair_tmp
+    deallocate( cak_tmp, vapri_tmp, vdryair_tmp)
+
     print*, 'itime(1), itime(nretr) = ',itime(1),itime(nretr)
 
     ! calculate column prior (units mol/m2)
@@ -476,6 +497,19 @@ subroutine get_tropomi(settings)
                    vapri_out, cpri, cakpri, cak_out, cdryair, vdryair_out, nretr, ncoord, nlayer)
     endif
 
+    !! testing
+!    open(500,file='tropomi_cak.txt',action='write',status='replace')
+!    do nm = 1, nretr
+!      write(500,fmt='(12(F7.5,1X))') cak_out(nm,:)
+!    end do
+!    close(500)
+!    open(500,file='tropomi_cpri.txt',action='write',status='replace')
+!    do nm = 1, nretr
+!      write(500,fmt='(12(F7.2,1X))') vapri_out(nm,:)*1.e9/vdryair_out(nm,:)
+!    end do
+!    close(500)
+!    !!  
+
     ! write output data
     ! -----------------
 
-- 
GitLab