# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/DownHole/DownHole.f90" module DownHoleModule use SimulationVariables contains subroutine MudPropertiesToJson(parent) type(json_value),pointer :: parent type(json_core) :: json type(json_value),pointer :: p ! 1. create new node call json%create_object(p,'DownHole') ! 2. add member of data type to new node ! call json%add(p,"AnnalusFluidsCount",data%Equipments%DownHole%AnnalusFluidsCount) ! call json%add(p,"StringFluidsCount",data%Equipments%DownHole%StringFluidsCount) ! call json%add(p,"AnnalusFluids(:)",data%Equipments%DownHole%AnnalusFluids(:)) ! call json%add(p,"StringFluids(:)",data%Equipments%DownHole%StringFluids(:)) ! call json%add(p,"StringCount",data%Equipments%DownHole%StringCount) ! call json%add(p,"String(:)",data%Equipments%DownHole%String(:)) ! call json%add(p,"BopElements(:)",data%Equipments%DownHole%BopElements(:)) call json%add(p,"DrillPipePressure",data%Equipments%DownHole%DrillPipePressure) call json%add(p,"CasingPressure",data%Equipments%DownHole%CasingPressure) call json%add(p,"ShoePressure",data%Equipments%DownHole%ShoePressure) call json%add(p,"BottomHolePressure",data%Equipments%DownHole%BottomHolePressure) call json%add(p,"FormationPressure",data%Equipments%DownHole%FormationPressure) call json%add(p,"InfluxRate",data%Equipments%DownHole%InfluxRate) call json%add(p,"KickVolume",data%Equipments%DownHole%KickVolume) call json%add(p,"SecondKickVolume",data%Equipments%DownHole%SecondKickVolume) call json%add(p,"PermeabilityExposedHeight",data%Equipments%DownHole%PermeabilityExposedHeight) ! 3. add new node to parent call json%add(parent,p) end subroutine subroutine DownHoleFromJson(parent) use json_module,IK =>json_ik type(json_value),pointer :: parent type(json_core) :: json type(json_value),pointer :: p,pitems,pitem,pval,pbit call json%get(parent,'DownHole',p) call json%get(p,'AnnDrillMud',pval) call json%get(pval,data%Equipments%DownHole%AnnDrillMud) call json%get(p,'AnnCirculateMud',pval) call json%get(pval,data%Equipments%DownHole%AnnCirculateMud) end subroutine subroutine SetAnnalusFluids(count, array) implicit none integer, intent(in) :: count integer :: i, offset type(CFluid), intent(inout), target :: array(count) type(CFluid), pointer :: item data%Equipments%DownHole%AnnalusFluidsCount = count print*, 'AnnalusFluidsCount = ', count if(size(data%Equipments%DownHole%AnnalusFluids) > 0) then deallocate(data%Equipments%DownHole%AnnalusFluids) end if if(count > 0) then offset = 0; item => array(1) if(item%StartMd > 0) then data%Equipments%DownHole%AnnalusFluidsCount = data%Equipments%DownHole%AnnalusFluidsCount + 1 offset = 1; allocate(data%Equipments%DownHole%AnnalusFluids(data%Equipments%DownHole%AnnalusFluidsCount)) data%Equipments%DownHole%AnnalusFluids(1)%StartMd = 0 data%Equipments%DownHole%AnnalusFluids(1)%EndMd = item%StartMd data%Equipments%DownHole%AnnalusFluids(1)%Density = 0 data%Equipments%DownHole%AnnalusFluids(1)%MudType = FLUID_NO_MUD endif !if(associated(AnnalusMudCountPtr)) then ! call AnnalusMudCountPtr(AnnalusFluidsCount) !end if if(.not.allocated(data%Equipments%DownHole%AnnalusFluids))allocate(data%Equipments%DownHole%AnnalusFluids(data%Equipments%DownHole%AnnalusFluidsCount)) !print*, '============START-AN============' if(item%StartMd < 0) data%Equipments%DownHole%AnnalusFluids(1)%StartMd = 0 do i = 1, count item => array(i) data%Equipments%DownHole%AnnalusFluids(i + offset)%StartMd = item%StartMd if(i==1) data%Equipments%DownHole%AnnalusFluids(i)%StartMd = 0 !print*, 'AnnalusFluids(',i,')%StartMd=', AnnalusFluids(i)%StartMd data%Equipments%DownHole%AnnalusFluids(i + offset)%EndMd = item%EndMd !print*, 'AnnalusFluids(',i,')%EndMd=', AnnalusFluids(i)%EndMd data%Equipments%DownHole%AnnalusFluids(i + offset)%Density = item%Density !print*, 'AnnalusFluids(',i,')%Density=', AnnalusFluids(i)%Density data%Equipments%DownHole%AnnalusFluids(i + offset)%MudType = item%MudType !print*, 'AnnalusFluids(',i,')%MudType=', AnnalusFluids(i)%MudType !print*, '----------------------------' end do !print*, '============END-AN============' !if(associated(AnnalusMudArrayPtr)) then ! !AnnalusFluidsPtr => AnnalusFluids ! call AnnalusMudArrayPtr(AnnalusFluids) !end if end if end subroutine SetAnnalusFluids subroutine SetStringFluids(count, array) implicit none integer, intent(in) :: count integer :: i, offset !, startArr type(CFluid), intent(inout), target :: array(count) type(CFluid), pointer :: item data%Equipments%DownHole%StringFluidsCount = count print*, 'StringFluidsCount = ', count if(size(data%Equipments%DownHole%StringFluids) > 0) then deallocate(data%Equipments%DownHole%StringFluids) end if !startArr = 1 if(count > 0) then offset = 0; item => array(1) ! !if(item%StartMd <= 0 .and. item%EndMd <= 0) then ! StringFluidsCount = StringFluidsCount - 1 ! count = count - 1 ! offset = offset + 1 ! startArr = startArr + 1 !endif ! !if(count <= 0) return if(item%StartMd > 0) then data%Equipments%DownHole%StringFluidsCount = data%Equipments%DownHole%StringFluidsCount + 1 offset = offset + 1 allocate(data%Equipments%DownHole%StringFluids(data%Equipments%DownHole%StringFluidsCount)) data%Equipments%DownHole%StringFluids(1)%StartMd = 0 data%Equipments%DownHole%StringFluids(1)%EndMd = item%StartMd data%Equipments%DownHole%StringFluids(1)%Density = 0 data%Equipments%DownHole%StringFluids(1)%MudType = FLUID_NO_MUD endif !if(associated(StringMudCountPtr)) then ! call StringMudCountPtr(count) !end if if(.not.allocated(data%Equipments%DownHole%StringFluids))allocate(data%Equipments%DownHole%StringFluids(data%Equipments%DownHole%StringFluidsCount)) !print*, '============START-ST============' !print*, 'count=', count do i = 1, count item => array(i) data%Equipments%DownHole%StringFluids(i + offset)%StartMd = item%StartMd if(i==1) data%Equipments%DownHole%StringFluids(i)%StartMd = 0 !print*, 'StringFluids(i)%StartMd=', StringFluids(i)%StartMd data%Equipments%DownHole%StringFluids(i + offset)%EndMd = item%EndMd !print*, 'StringFluids(i)%EndMd=', StringFluids(i)%EndMd data%Equipments%DownHole%StringFluids(i + offset)%Density = item%Density data%Equipments%DownHole%StringFluids(i + offset)%MudType = item%MudType !print*, '----------------------------' end do !!if(item%StartMd < 0) StringFluids(1)%StartMd = 0 !!print*, '============END-ST============' !if(associated(StringMudArrayPtr)) then ! call StringMudArrayPtr(StringFluids) !end if end if end subroutine SetStringFluids subroutine SetString(count, array) use CLog3 implicit none integer, intent(in) :: count integer :: i !, j type(CStringComponents), intent(inout), target :: array(count) type(CStringComponents), pointer :: item data%Equipments%DownHole%StringCount = count if(size(data%Equipments%DownHole%String) > 0) then deallocate(data%Equipments%DownHole%String) end if if(count > 0) then !if(associated(StringComponentCountPtr)) then ! call StringComponentCountPtr(count) !end if allocate(data%Equipments%DownHole%String(count)) !j = 0 !print*, '============CMP-ST============' !call Log_3( '============CMP-ST============') !do i = count, 1, -1 do i = 1, count item => array(i) !String(i)%Length = item%Length !String(i)%TopDepth = item%TopDepth !String(i)%DownDepth = item%DownDepth !String(i)%Od = item%Od !String(i)%Id = item%Id data%Equipments%DownHole%String(i)%ComponentType= item%ComponentType !j = j + 1 data%Equipments%DownHole%String(i)%StartMd = item%TopDepth data%Equipments%DownHole%String(i)%EndMd = item%DownDepth data%Equipments%DownHole%String(i)%ComponentType=0 !if(item%ComponentType > 4 ) then ! String(i)%ComponentType=0 ! String(i)%StartMd = 0 !endif if(item%ComponentType == 3) data%Equipments%DownHole%String(i)%ComponentType=0 if(item%ComponentType == 4) data%Equipments%DownHole%String(i)%ComponentType=1 if(item%ComponentType == 2) data%Equipments%DownHole%String(i)%ComponentType=2 if(item%ComponentType == 1) data%Equipments%DownHole%String(i)%ComponentType=3 !print*, 'item%ComponentType=', item%ComponentType !print*, 'String(i)%ComponentType=', String(i)%ComponentType !print*, 'String(i)%StartMd=', String(i)%StartMd !print*, 'String(i)%EndMd=', String(i)%EndMd !print*, '----------------------------' !call Log_3( 'item%ComponentType=', item%ComponentType) !call Log_3( 'String(i)%ComponentType=', String(i)%ComponentType) !call Log_3( 'String(i)%StartMd=', String(i)%StartMd) !call Log_3( 'String(i)%EndMd=', String(i)%EndMd) !call Log_3( '----------------------------') end do !!print*, '============CMP-ST============' !!call Log_3( '============CMP-ST============') !if(associated(StringComponentArrayPtr)) then ! call StringComponentArrayPtr(String) !end if end if end subroutine SetString subroutine SetBopElements(array) use CLog4 implicit none integer, parameter :: count = 4 integer :: i = 1 !, j type(CBopElement), intent(inout), target :: array(count) type(CBopElement), pointer :: item if(size(data%Equipments%DownHole%BopElements) > 0) deallocate(data%Equipments%DownHole%BopElements) allocate(data%Equipments%DownHole%BopElements(count)) do i = 1, count item => array(i) !call Log_4('item%ElementStart', item%ElementStart) !call Log_4('item%ElementEnd', item%ElementEnd) !call Log_4('item%ElementType', item%ElementType) !call Log_4('=====================================================') data%Equipments%DownHole%BopElements(i)%ElementStart = item%ElementStart data%Equipments%DownHole%BopElements(i)%ElementEnd = item%ElementEnd data%Equipments%DownHole%BopElements(i)%ElementType = item%ElementType end do !if(associated(BopElementsPtr)) call BopElementsPtr(BopElements) end subroutine SetBopElements end module DownHoleModule