integrate_SXR_datresol Subroutine

public subroutine integrate_SXR_datresol(igrid, nXIF1, nXIF2, xIF1, xIF2, dxIF1, dxIF2, fl, SXR)

Uses

  • proc~~integrate_sxr_datresol~~UsesGraph proc~integrate_sxr_datresol integrate_SXR_datresol module~mod_global_parameters mod_global_parameters proc~integrate_sxr_datresol->module~mod_global_parameters module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: igrid
integer, intent(in) :: nXIF1
integer, intent(in) :: nXIF2
double precision, intent(in) :: xIF1(nXIF1)
double precision, intent(in) :: xIF2(nXIF2)
double precision, intent(in) :: dxIF1(nXIF1)
double precision, intent(in) :: dxIF2(nXIF2)
type(te_fluid), intent(in) :: fl
double precision, intent(out) :: SXR(nXIF1,nXIF2)

Calls

proc~~integrate_sxr_datresol~~CallsGraph proc~integrate_sxr_datresol integrate_SXR_datresol proc~get_sxr get_SXR proc~integrate_sxr_datresol->proc~get_sxr dexp dexp proc~get_sxr->dexp

Called by

proc~~integrate_sxr_datresol~~CalledByGraph proc~integrate_sxr_datresol integrate_SXR_datresol proc~get_image_datresol get_image_datresol proc~get_image_datresol->proc~integrate_sxr_datresol proc~get_euv_image get_EUV_image proc~get_euv_image->proc~get_image_datresol proc~get_sxr_image get_SXR_image proc~get_sxr_image->proc~get_image_datresol

Source Code

    subroutine integrate_SXR_datresol(igrid,nXIF1,nXIF2,xIF1,xIF2,dxIF1,dxIF2,&
       fl,SXR)
      use mod_global_parameters

      integer, intent(in) :: igrid,nXIF1,nXIF2
      double precision, intent(in) :: xIF1(nXIF1),xIF2(nXIF2)
      double precision, intent(in) :: dxIF1(nXIF1),dxIF2(nXIF2)
      type(te_fluid), intent(in) :: fl
      double precision, intent(out) :: SXR(nXIF1,nXIF2)

      integer :: ixOmin1,ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3,ixO1,ixO2,&
         ixO3,ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,ixImax3,ix1,ix2,ix3,i,j
      double precision :: xbmin1,xbmin2,xbmin3,xbmax1,xbmax2,xbmax3,xd1,xd2,&
         xd3
      double precision, allocatable :: flux(:,:,:)
      double precision, allocatable :: dxb1(:,:,:),dxb2(:,:,:),dxb3(:,:,:)
      double precision, allocatable :: SXRg(:,:),xg1(:),xg2(:),dxg1(:),dxg2(:)
      integer :: levelg,nXg1,nXg2,iXgmin1,iXgmax1,iXgmin2,iXgmax2,rft,iXg1,&
         iXg2,iXg3
      double precision :: SXRt,xcmin1,xcmin2,xcmin3,xcmax1,xcmax2,xcmax3,&
         xgmin1,xgmin2,xgmin3,xgmax1,xgmax2,xgmax3,r2,area_1AU
      integer :: ixPmin1,ixPmin2,ixPmin3,ixPmax1,ixPmax2,ixPmax3,ixP1,ixP2,&
         ixP3
      integer :: direction_LOS

      if (LOS_phi==0 .and. LOS_theta==90) then
        direction_LOS=1
      else if (LOS_phi==90 .and. LOS_theta==90) then
        direction_LOS=2
      else
        direction_LOS=3
      endif

      ixOmin1=ixmlo1
  ixOmin2=ixmlo2
  ixOmin3=ixmlo3
      ixOmax1=ixmhi1
  ixOmax2=ixmhi2
  ixOmax3=ixmhi3
      ixImin1=ixglo1
  ixImin2=ixglo2
  ixImin3=ixglo3
      ixImax1=ixghi1
  ixImax2=ixghi2
  ixImax3=ixghi3
      xbmin1=rnode(rpxmin1_,igrid)
  xbmin2=rnode(rpxmin2_,igrid)
  xbmin3=rnode(rpxmin3_,igrid)
      xbmax1=rnode(rpxmax1_,igrid)
  xbmax2=rnode(rpxmax2_,igrid)
  xbmax3=rnode(rpxmax3_,igrid)

      allocate(flux(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3))
      allocate(dxb1(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3),&
         dxb2(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3),&
         dxb3(ixImin1:ixImax1,ixImin2:ixImax2,ixImin3:ixImax3))
      dxb1(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3)=ps(igrid)%dx(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3,1)
      dxb2(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3)=ps(igrid)%dx(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3,2)
      dxb3(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3)=ps(igrid)%dx(ixOmin1:ixOmax1,ixOmin2:ixOmax2,&
         ixOmin3:ixOmax3,3)
      ! get local SXR flux
      call get_SXR(ixImin1,ixImin2,ixImin3,ixImax1,ixImax2,ixImax3,ixOmin1,&
         ixOmin2,ixOmin3,ixOmax1,ixOmax2,ixOmax3,ps(igrid)%w,ps(igrid)%x,fl,&
         flux,emin_sxr,emax_sxr)

      ! grid parameters
      levelg=ps(igrid)%level
      rft=2**(refine_max_level-levelg)

      ! fine table for storing EUV flux of current grid
      select case(direction_LOS)
      case(1)
        nXg1=ixImax2*rft
        nXg2=ixImax3*rft
      case(2)
        nXg1=ixImax3*rft
        nXg2=ixImax1*rft
      case(3)
        nXg1=ixImax1*rft
        nXg2=ixImax2*rft
      end select
      allocate(SXRg(nXg1,nXg2),xg1(nXg1),xg2(nXg2),dxg1(nXg1),dxg2(nXg2))
      SXRg=zero
      xg1=zero
      xg2=zero

      ! integrate for different direction
      select case(direction_LOS)
      case(1)
        do ix2=ixOmin2,ixOmax2
          iXgmin1=(ix2-1)*rft+1
          iXgmax1=ix2*rft
          do ix3=ixOmin3,ixOmax3
            iXgmin2=(ix3-1)*rft+1
            iXgmax2=ix3*rft
            SXRt=0.d0
            do ix1=ixOmin1,ixOmax1
              SXRt=SXRt+flux(ix1,ix2,ix3)*dxb1(ix1,ix2,ix3)*unit_length
            enddo
            SXRg(iXgmin1:iXgmax1,iXgmin2:iXgmax2)=SXRt
          enddo
        enddo
      case(2)
        do ix3=ixOmin3,ixOmax3
          iXgmin1=(ix3-1)*rft+1
          iXgmax1=ix3*rft
          do ix1=ixOmin1,ixOmax1
            iXgmin2=(ix1-1)*rft+1
            iXgmax2=ix1*rft
            SXRt=0.d0
            do ix2=ixOmin2,ixOmax2
              SXRt=SXRt+flux(ix1,ix2,ix3)*dxb2(ix1,ix2,ix3)*unit_length
            enddo
            SXRg(iXgmin1:iXgmax1,iXgmin2:iXgmax2)=SXRt
          enddo
        enddo
      case(3)
        do ix1=ixOmin1,ixOmax1
          iXgmin1=(ix1-1)*rft+1
          iXgmax1=ix1*rft
          do ix2=ixOmin2,ixOmax2
            iXgmin2=(ix2-1)*rft+1
            iXgmax2=ix2*rft
            SXRt=0.d0
            do ix3=ixOmin3,ixOmax3
              SXRt=SXRt+flux(ix1,ix2,ix3)*dxb3(ix1,ix2,ix3)*unit_length
            enddo
            SXRg(iXgmin1:iXgmax1,iXgmin2:iXgmax2)=SXRt
          enddo
        enddo
      end select

      area_1AU=2.81d27
      SXRg=SXRg/area_1AU

      ! mapping grid data to global table 
      ! index ranges in local table
      select case(direction_LOS)
      case(1)
        iXgmin1=(ixOmin2-1)*rft+1
        iXgmax1=ixOmax2*rft
        iXgmin2=(ixOmin3-1)*rft+1
        iXgmax2=ixOmax3*rft
      case(2)
        iXgmin1=(ixOmin3-1)*rft+1
        iXgmax1=ixOmax3*rft
        iXgmin2=(ixOmin1-1)*rft+1
        iXgmax2=ixOmax1*rft
      case(3)
        iXgmin1=(ixOmin1-1)*rft+1
        iXgmax1=ixOmax1*rft
        iXgmin2=(ixOmin2-1)*rft+1
        iXgmax2=ixOmax2*rft
      end select
      ! index ranges in global table & mapping
      select case(direction_LOS)
      case(1)
        ixPmin1=(node(pig2_,igrid)-1)*rft*block_nx2+1
        ixPmax1=node(pig2_,igrid)*rft*block_nx2
        ixPmin2=(node(pig3_,igrid)-1)*rft*block_nx3+1
        ixPmax2=node(pig3_,igrid)*rft*block_nx3
      case(2)
        ixPmin1=(node(pig3_,igrid)-1)*rft*block_nx3+1
        ixPmax1=node(pig3_,igrid)*rft*block_nx3
        ixPmin2=(node(pig1_,igrid)-1)*rft*block_nx1+1
        ixPmax2=node(pig1_,igrid)*rft*block_nx1
      case(3)
        ixPmin1=(node(pig1_,igrid)-1)*rft*block_nx1+1
        ixPmax1=node(pig1_,igrid)*rft*block_nx1
        ixPmin2=(node(pig2_,igrid)-1)*rft*block_nx2+1
        ixPmax2=node(pig2_,igrid)*rft*block_nx2
      end select
      xg1(iXgmin1:iXgmax1)=xIF1(ixPmin1:ixPmax1)
      xg2(iXgmin2:iXgmax2)=xIF2(ixPmin2:ixPmax2)
      dxg1(iXgmin1:iXgmax1)=dxIF1(ixPmin1:ixPmax1)
      dxg2(iXgmin2:iXgmax2)=dxIF2(ixPmin2:ixPmax2)
      SXR(ixPmin1:ixPmax1,ixPmin2:ixPmax2)=SXR(ixPmin1:ixPmax1,&
         ixPmin2:ixPmax2)+SXRg(iXgmin1:iXgmax1,iXgmin2:iXgmax2)

      deallocate(flux,dxb1,dxb2,dxb3,SXRg,xg1,xg2,dxg1,dxg2)

    end subroutine integrate_SXR_datresol