diff --git a/.ipynb_checkpoints/Data Structures-checkpoint.txt b/.ipynb_checkpoints/Data Structures-checkpoint.txt new file mode 100644 index 0000000..e473b2e --- /dev/null +++ b/.ipynb_checkpoints/Data Structures-checkpoint.txt @@ -0,0 +1,134 @@ +CSharp: + BasicInputs: + Bha: + StringConfiguration + Geology: + Formation + Reservoir + Shoe + RigSpecification: + Accumulator + BopStackSpecification + Hoisting + Power + PumpsSpecification + RigSize + WellProfile: + CasingLinerChoke + PathGeneration + WellSurveyData + MudProperties + Equipments: + ControlPanel: + BopControlPanel + CholeControlPanel + ChokeManifold + DataDisplayConsole + DrillingConsole + Hook + StandPipleManifold + TopDrivePanel + ِDrillWatch + DrillingWatch + MudPathfinding: + Manifold + Tanks: + Tank + Common: + Common + Lesson + DownHole: + DownHole + OperationScenario: + Common: + OperationScenario: Constants? or Variables? + Enums: + ElevatorConnectionEnum: merged into OperationScenario + KellyConnectionEnum + TdsConnectionModesEnum + Notifications: + Notifications + Permissions: + Permissions + SoftwareInputs + Unity: + UnityInputs + UnityOutputs + UnitySignals: + UnitySignals + StudentStation: + StudentStation + Warnings: + Warnings + Problems: + BitProblems + BopProblems + ChockProblems + DrillStemProblems + GaugesProblems + HoistingProblems + KickProblems + LostProblems + MudTreatmentProblems + OtherProblems + PumpProblems + RotaryProblems +Equipments: + BopStack: + BopStackInput + BopStackAcc + RamLine + AnnularComputational + Annular + PipeRam1 + ShearRam + PipeRam2 + ChokeLine + KillLine + Pumps + RAM (previously exists) + RAMS + ChokeControl: + Choke + AirDrivenPump + AirPumpLine + CHOOKE (previously exists) + MudSystem: + MudSystem + Pumps: + MPumps + Pump(1:3) + RotaryTable: + RTable + TopDrive: + TDS + TorqueDrag: + TDGeo + data%State%F_String(:) + F_Counts + data%State%F_Interval(:) + data%State%OD_Annulus(4) + data%State%TD_String + data%State%TD_DrillStem(:) + data%State%TD_DrillStems(:) + data%State%TD_Count + data%State%G_StringElement + data%State%TD_Vol + data%State%TD_General + data%State%TD_BOP + data%State%TD_BOPElement(4) + data%State%TD_StConn + data%State%TD_Load + data%State%TD_WellEl + data%State%TD_Casing + data%State%TD_Liner + data%State%TD_OpenHole + data%State%TD_ROPHole + data%State%TD_WellGeneral + data%State%TD_WellGeo(:) + +FluidFlow: + +Rop: + ROP_Bit + ROP_Spec diff --git a/.ipynb_checkpoints/config-asiatech-checkpoint.json b/.ipynb_checkpoints/config-asiatech-checkpoint.json new file mode 100644 index 0000000..cbdd4b7 --- /dev/null +++ b/.ipynb_checkpoints/config-asiatech-checkpoint.json @@ -0,0 +1,11 @@ +{ + "redis":{ + "address":"85.198.9.229", + "port":6379, + "password":"1qazxsw2$$" + }, + "logging":3, + "process_name": "SimulationCore2", + "work_dir" : ".", + "step_time" : 100 +} \ No newline at end of file diff --git a/.ipynb_checkpoints/first_demo-checkpoint.sh b/.ipynb_checkpoints/first_demo-checkpoint.sh new file mode 100755 index 0000000..e5231fb --- /dev/null +++ b/.ipynb_checkpoints/first_demo-checkpoint.sh @@ -0,0 +1 @@ +./SimulationCore2 aberama.iran.liara.ir 32815 4YKFnubfFFjfh4yTK7b0Rg9X 60f8144a-c1b7-4d1a-5d99-08db9e4e35f5 5 \ No newline at end of file diff --git a/.ipynb_checkpoints/simulatorManager-checkpoint.py b/.ipynb_checkpoints/simulatorManager-checkpoint.py new file mode 100644 index 0000000..5e374fa --- /dev/null +++ b/.ipynb_checkpoints/simulatorManager-checkpoint.py @@ -0,0 +1,42 @@ +import sys +import redis +import json +import time +import subprocess +import psutil + +if __name__=='__main__': + if len(sys.argv)<=1: + configFN = 'config-remote.json' + else: + configFN = sys.argv[1] + + f = open(configFN) + config = json.load(f) + + redis_address = config['redis']['address'] + redis_password = config['redis']['password'] + redis_port = config['redis']['port'] + log_level = config['logging'] + work_dir = config['work_dir'] + stepTime = config['step_time'] + process_name = config['process_name'] + + r = redis.Redis(host=redis_address, port=redis_port, decode_responses=True,password=redis_password) + runnings = [] + while True: + sims = r.get('Simulations') + sims = json.loads(sims) + for sim in sims: + simulation_id = sim['Id'] + process_exists = False + for proc in psutil.process_iter(['pid', 'name', 'cmdline']): + if proc.info['name'] == process_name and len(proc.info['cmdline']) > 1 and proc.info['cmdline'][1] == simulation_id: + process_exists = True + break + if not simulation_id in runnings: #process_exists: + runnings.append(simulation_id) + command = ['./SimulationCore2', redis_address,str(redis_port),redis_password,simulation_id,str(log_level),str(stepTime)] + print(command) + subprocess.Popen(command, cwd=work_dir) + time.sleep(5) diff --git a/Bit_Database.TXT b/Bit_Database.TXT new file mode 100644 index 0000000..426a9e0 --- /dev/null +++ b/Bit_Database.TXT @@ -0,0 +1,15 @@ +Bit Class H1 H2 H3 (w/d)max +11 , 1.9 , 7. , 1. , 7. +12 , 1.9 , 7. , 1. , 7. +13 , 1.84 , 6. , 0.8 , 8. +14 , 1.84 , 6. , 0.8 , 8. +21 , 1.8 , 5. , 0.6 , 8.5 +22 , 1.8 , 5. , 0.6 , 8.5 +23 , 1.76 , 4. , 0.48 , 9. +24 , 1.76 , 4. , 0.48 , 9. +31 , 1.7 , 3. , 0.36 , 10. +32 , 1.65 , 2. , 0.26 , 10. +33 , 1.6 , 2. , 0.2 , 10. +34 , 1.6 , 2. , 0.2 , 10. +41 , 1.5 , 2. , 0.18 , 10. +10 , 1.5 , 1. , 0.02 , 10. \ No newline at end of file diff --git a/CSharp/BasicInputs/RigSpecifications/CAccumulator.i90 b/CSharp/BasicInputs/RigSpecifications/CAccumulator.i90 index 9fb6e70..11c66a7 100644 --- a/CSharp/BasicInputs/RigSpecifications/CAccumulator.i90 +++ b/CSharp/BasicInputs/RigSpecifications/CAccumulator.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/BasicInputs/RigSpecifications/CAccumulator.f90" +# 1 "/home/admin/SimulationCore2/CSharp/BasicInputs/RigSpecifications/CAccumulator.f90" module CAccumulator use SimulationVariables ! use CAccumulatorVariables diff --git a/CSharp/BasicInputs/RigSpecifications/CHoisting.i90 b/CSharp/BasicInputs/RigSpecifications/CHoisting.i90 new file mode 100644 index 0000000..20ea511 --- /dev/null +++ b/CSharp/BasicInputs/RigSpecifications/CHoisting.i90 @@ -0,0 +1,58 @@ +# 1 "/home/admin/SimulationCore2/CSharp/BasicInputs/RigSpecifications/CHoisting.f90" +module CHoisting + use SimulationVariables + use json_module + implicit none + public + contains + + subroutine HoistingFromJson(parent) + + use json_module,IK =>json_ik + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p,pitem,pval + logical::is_found + integer::i,n_children + CHARACTER(KIND=JSON_CK, LEN=:), ALLOCATABLE :: val + + call json%get(parent,'Hoisting',p) + call json%get(p,'DriveType',pval) + call json%get(pval,data%Configuration%Hoisting%DriveType) + call json%get(p,'TravelingBlockWeight',pval) + call json%get(pval,data%Configuration%Hoisting%TravelingBlockWeight) + call json%get(p,'TopDriveWeight',pval) + call json%get(pval,data%Configuration%Hoisting%TopDriveWeight) + call json%get(p,'KellyWeight',pval) + call json%get(pval,data%Configuration%Hoisting%KellyWeight) + call json%get(p,'NumberOfLine',pval) + call json%get(pval,data%Configuration%Hoisting%NumberOfLine) + call json%get(p,'DrillingLineBreakingLoad',pval) + call json%get(pval,data%Configuration%Hoisting%DrillingLineBreakingLoad) + +!@@@ + data%Configuration%Hoisting%NumberOfLine = 10 + end subroutine + + subroutine HoistingToJson(parent) + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + +! 1. create new node + call json%create_object(p,'Hoisting') + +! 2. add member of data type to new node +! call StringConfigurationToJson(p) +! call FormationToJson(p) + call json%add(p,"DrillingLineBreakingLoad",data%Configuration%Hoisting%DrillingLineBreakingLoad) + call json%add(p,"DriveType",data%Configuration%Hoisting%DriveType) + call json%add(p,"KellyWeight",data%Configuration%Hoisting%KellyWeight) + call json%add(p,"NumberOfLine",data%Configuration%Hoisting%NumberOfLine) + call json%add(p,"TopDriveWeight",data%Configuration%Hoisting%TopDriveWeight) + call json%add(p,"TravelingBlockWeight",data%Configuration%Hoisting%TravelingBlockWeight) +! 3. add new node to parent + call json%add(parent,p) + end subroutine + +end module CHoisting diff --git a/CSharp/Equipments/ControlPanels/CChokeControlPanel.i90 b/CSharp/Equipments/ControlPanels/CChokeControlPanel.i90 index fd4c809..4a4fa45 100644 --- a/CSharp/Equipments/ControlPanels/CChokeControlPanel.i90 +++ b/CSharp/Equipments/ControlPanels/CChokeControlPanel.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90" +# 1 "/home/admin/SimulationCore2/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90" module CChokeControlPanel use CChokeControlPanelVariables use SimulationVariables diff --git a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 index c051a5e..2bc7456 100644 --- a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 +++ b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 @@ -14,26 +14,6 @@ module CDataDisplayConsole call json%get(parent,'DataDisplay',p) ! 2. get member of data type from node - ! call json%get(p,'TripAlarmLow',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TripAlarmLow) - ! call json%get(p,'TripAlarmHigh',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TripAlarmHigh) - ! call json%get(p,'RetFlowAlarmLow',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RetFlowAlarmLow) - ! call json%get(p,'RetFlowAlarmHigh',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RetFlowAlarmHigh) - ! call json%get(p,'PitAlarmLow',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PitAlarmLow) - ! call json%get(p,'PitAlarmHigh',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PitAlarmHigh) - ! call json%get(p,'PortWeightOnBit',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PortWeightOnBit) - ! call json%get(p,'PortHookLoad',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PortHookLoad) - ! call json%get(p,'PortCasingPressure',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PortCasingPressure) - ! call json%get(p,'PortPumpPressure',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PortPumpPressure) call json%get(p,'TripTankSetAlarmLow',pval) call json%get(pval,data%Equipments%DataDisplayConsole%TripTankSetAlarmLow) call json%get(p,'TripTankSetAlarmHigh',pval) @@ -97,85 +77,6 @@ module CDataDisplayConsole call json%get(p,'ResetWob',pval) call json%get(pval,data%Equipments%DataDisplayConsole%ResetWob) call json%get(p,'Clutch',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%Clutch) - ! call json%get(p,'WOBPointer',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%WOBPointer) - ! call json%get(p,'HookLoadPointer',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%HookLoadPointer) - ! call json%get(p,'TripTankGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankGauge) - ! call json%get(p,'TripTankAlarmLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankAlarmLED) - ! call json%get(p,'TripTankPumpLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankPumpLED) - ! call json%get(p,'StandPipePressureGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%StandPipePressureGauge) - ! call json%get(p,'CasingPressureGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%CasingPressureGauge) - ! call json%get(p,'MP1SPMGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MP1SPMGauge) - ! call json%get(p,'MP2SPMGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MP2SPMGauge) - ! call json%get(p,'ReturnLineTempGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%ReturnLineTempGauge) - ! call json%get(p,'RotaryTorqueGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RotaryTorqueGauge) - ! call json%get(p,'RotaryRPMGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RotaryRPMGauge) - ! call json%get(p,'AcidGasDetectionLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%AcidGasDetectionLED) - ! call json%get(p,'TotalStrokeCounter',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TotalStrokeCounter) - ! call json%get(p,'PitGainLossGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%PitGainLossGauge) - ! call json%get(p,'MudTanksVolumeGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MudTanksVolumeGauge) - ! call json%get(p,'MVTAlarmLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MVTAlarmLED) - ! call json%get(p,'ReturnMudFlowGauge',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%ReturnMudFlowGauge) - ! call json%get(p,'FillStrokeCounter',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%FillStrokeCounter) - ! call json%get(p,'MFFITotalStrokeCounter',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MFFITotalStrokeCounter) - ! call json%get(p,'MFFIAlarmLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MFFIAlarmLED) - ! call json%get(p,'MFFIPumpLED',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MFFIPumpLED) - ! call json%get(p,'TotalWellDepth',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%TotalWellDepth) - ! call json%get(p,'BitDepth',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%BitDepth) - ! call json%get(p,'HookLoad',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%HookLoad) - ! call json%get(p,'StandPipePressure',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%StandPipePressure) - ! call json%get(p,'CasingPressure',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%CasingPressure) - ! call json%get(p,'MP1SPM',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MP1SPM) - ! call json%get(p,'MP2SPM',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MP2SPM) - ! call json%get(p,'RTTorque',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RTTorque) - ! call json%get(p,'RTRPM',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%RTRPM) - ! call json%get(p,'WOP',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%WOP) - ! call json%get(p,'ROP',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%ROP) - ! call json%get(p,'MudWeightIn',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MudWeightIn) - ! call json%get(p,'MudWeightOut',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%MudWeightOut) - ! call json%get(p,'Buzzer1',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer1) - ! call json%get(p,'Buzzer2',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer2) - ! call json%get(p,'Buzzer3',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer3) - ! call json%get(p,'Buzzer4',pval) - ! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer4) end subroutine subroutine DataDisplayConsoleToJson(parent) @@ -186,49 +87,6 @@ module CDataDisplayConsole ! 1. create new node call json%create_object(p,'DataDisplay') - ! call json%add(p,"TripAlarmLow",data%Equipments%DataDisplayConsole%TripAlarmLow) - ! call json%add(p,"TripAlarmHigh",data%Equipments%DataDisplayConsole%TripAlarmHigh) - ! call json%add(p,"RetFlowAlarmLow",data%Equipments%DataDisplayConsole%RetFlowAlarmLow) - ! call json%add(p,"RetFlowAlarmHigh",data%Equipments%DataDisplayConsole%RetFlowAlarmHigh) - ! call json%add(p,"PitAlarmLow",data%Equipments%DataDisplayConsole%PitAlarmLow) - ! call json%add(p,"PitAlarmHigh",data%Equipments%DataDisplayConsole%PitAlarmHigh) - ! call json%add(p,"PortWeightOnBit",data%Equipments%DataDisplayConsole%PortWeightOnBit) - ! call json%add(p,"PortHookLoad",data%Equipments%DataDisplayConsole%PortHookLoad) - ! call json%add(p,"PortCasingPressure",data%Equipments%DataDisplayConsole%PortCasingPressure) - ! call json%add(p,"PortPumpPressure",data%Equipments%DataDisplayConsole%PortPumpPressure) - - ! call json%add(p,"TripTankSetAlarmLow",data%Equipments%DataDisplayConsole%TripTankSetAlarmLow) - ! call json%add(p,"TripTankSetAlarmHigh",data%Equipments%DataDisplayConsole%TripTankSetAlarmHigh) - ! call json%add(p,"TripTankSetAlarmSwitch",data%Equipments%DataDisplayConsole%TripTankSetAlarmSwitch) - ! call json%add(p,"TripTankPowerSwitch",data%Equipments%DataDisplayConsole%TripTankPowerSwitch) - ! call json%add(p,"TripTankPumpSwitch",data%Equipments%DataDisplayConsole%TripTankPumpSwitch) - ! call json%add(p,"TripTankHornSwitch",data%Equipments%DataDisplayConsole%TripTankHornSwitch) - ! call json%add(p,"AcidGasDetectionHornSwitch",data%Equipments%DataDisplayConsole%AcidGasDetectionHornSwitch) - ! call json%add(p,"TotalStrokeCounterResetSwitch",data%Equipments%DataDisplayConsole%TotalStrokeCounterResetSwitch) - ! call json%add(p,"DrillingTrippingSelectorSwitch",data%Equipments%DataDisplayConsole%DrillingTrippingSelectorSwitch) - ! call json%add(p,"MVTSetAlarmLowKnob",data%Equipments%DataDisplayConsole%MVTSetAlarmLowKnob) - ! call json%add(p,"MVTSetAlarmHighKnob",data%Equipments%DataDisplayConsole%MVTSetAlarmHighKnob) - ! call json%add(p,"MVTSetAlarmSwitch",data%Equipments%DataDisplayConsole%MVTSetAlarmSwitch) - ! call json%add(p,"MudTank1Switch",data%Equipments%DataDisplayConsole%MudTank1Switch) - ! call json%add(p,"MudTank2Switch",data%Equipments%DataDisplayConsole%MudTank2Switch) - ! call json%add(p,"MudTank3Switch",data%Equipments%DataDisplayConsole%MudTank3Switch) - ! call json%add(p,"MudTank4Switch",data%Equipments%DataDisplayConsole%MudTank4Switch) - ! call json%add(p,"MVTFineKnob",data%Equipments%DataDisplayConsole%MVTFineKnob) - ! call json%add(p,"MVTCoarseKnob",data%Equipments%DataDisplayConsole%MVTCoarseKnob) - ! call json%add(p,"MVTHornSwitch",data%Equipments%DataDisplayConsole%MVTHornSwitch) - ! call json%add(p,"MVTDeviationTripSelectionSwitch",data%Equipments%DataDisplayConsole%MVTDeviationTripSelectionSwitch) - ! call json%add(p,"MVTPowerSwitch",data%Equipments%DataDisplayConsole%MVTPowerSwitch) - ! call json%add(p,"MFFIResetTotalStrokes",data%Equipments%DataDisplayConsole%MFFIResetTotalStrokes) - ! call json%add(p,"MFFIResetFillCounter",data%Equipments%DataDisplayConsole%MFFIResetFillCounter) - ! call json%add(p,"MFFIPumpSelectorSwitch",data%Equipments%DataDisplayConsole%MFFIPumpSelectorSwitch) - ! call json%add(p,"MFFIFillSPMSelectorSwitch",data%Equipments%DataDisplayConsole%MFFIFillSPMSelectorSwitch) - ! call json%add(p,"MFFISetAlarmLowKnob",data%Equipments%DataDisplayConsole%MFFISetAlarmLowKnob) - ! call json%add(p,"MFFISetAlarmHighKnob",data%Equipments%DataDisplayConsole%MFFISetAlarmHighKnob) - ! call json%add(p,"MFFISetAlarmSwitch",data%Equipments%DataDisplayConsole%MFFISetAlarmSwitch) - ! call json%add(p,"MFFIPowerSwitch",data%Equipments%DataDisplayConsole%MFFIPowerSwitch) - ! call json%add(p,"MFFIHornSwitch",data%Equipments%DataDisplayConsole%MFFIHornSwitch) - ! call json%add(p,"ResetWob",data%Equipments%DataDisplayConsole%ResetWob) - ! call json%add(p,"Clutch",data%Equipments%DataDisplayConsole%Clutch) call json%add(p,"WOBPointer",data%Equipments%DataDisplayConsole%WOBPointer) call json%add(p,"HookLoadPointer",data%Equipments%DataDisplayConsole%HookLoadPointer) @@ -253,7 +111,6 @@ module CDataDisplayConsole call json%add(p,"MFFIAlarmLED",data%Equipments%DataDisplayConsole%MFFIAlarmLED) call json%add(p,"MFFIPumpLED",data%Equipments%DataDisplayConsole%MFFIPumpLED) call json%add(p,"TotalWellDepth",data%Equipments%DataDisplayConsole%TotalWellDepth) - ! call json%add(p,"TotalWellDepth",1000) call json%add(p,"BitDepth",data%Equipments%DataDisplayConsole%BitDepth) call json%add(p,"HookLoad",data%Equipments%DataDisplayConsole%HookLoad) call json%add(p,"StandPipePressure",data%Equipments%DataDisplayConsole%StandPipePressure) @@ -277,8 +134,6 @@ module CDataDisplayConsole subroutine Set_TotalDepth(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%Depth - ! use CSimulationVariables, only: SetDistanceDrilled implicit none real(8), intent(in) :: v ! print *,"total depth = ",v @@ -288,7 +143,6 @@ module CDataDisplayConsole end subroutine subroutine Set_BitPosition(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%BitPosition implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%BitDepth = v @@ -296,7 +150,6 @@ module CDataDisplayConsole end subroutine subroutine Set_RotaryTorque(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%Torque implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%RotaryTorqueGauge = v @@ -306,7 +159,7 @@ module CDataDisplayConsole subroutine Set_MudWeightIn(v) - use SimulationVariables !@!, only: MudWeightInDw => data%Equipments%DataDisplayConsole%MudWeightIn + use SimulationVariables implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%MudWeightIn = v @@ -354,7 +207,6 @@ module CDataDisplayConsole end subroutine subroutine Set_ROP(v) - use SimulationVariables !@!, only: ROPDw => data%Equipments%DataDisplayConsole%ROP implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%ROP = v @@ -362,9 +214,7 @@ module CDataDisplayConsole end subroutine subroutine Set_CasingPressure(v) - use SimulationVariables !@!, only: CasingPressureDw => CasingPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: CasingPressureChoke => CasingPressure + ! use CChokeControlPanelVariables implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%CasingPressureGauge = v @@ -374,9 +224,6 @@ module CDataDisplayConsole end subroutine subroutine Set_StandPipePressure(v) - use SimulationVariables !@!, only: data%Equipments%DrillingWatch%PumpPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: StandPipePressureChoke => data%Equipments%DataDisplayConsole%StandPipePressure implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%StandPipePressureGauge = v @@ -390,7 +237,6 @@ module CDataDisplayConsole subroutine Set_RotaryRPMGauge(v) - use SimulationVariables !@!, only: data%Equipments%DrillingWatch%RPM implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%RotaryRPMGauge = v @@ -408,9 +254,9 @@ module CDataDisplayConsole data%Equipments%DataDisplayConsole%MP1SPMGauge = v data%Equipments%DataDisplayConsole%MP1SPM = v !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%Equipments%DataDisplayConsole%MP1SPMGauge, data%Equipments%DataDisplayConsole%MP2SPMGauge) -#ifdef deb - print*, 'MP1SPMGauge=', data%Equipments%DataDisplayConsole%MP1SPMGauge -#endif + #ifdef deb + print*, 'MP1SPMGauge=', data%Equipments%DataDisplayConsole%MP1SPMGauge + #endif end subroutine subroutine Set_MP2SPMGauge(v) @@ -419,8 +265,8 @@ module CDataDisplayConsole data%Equipments%DataDisplayConsole%MP2SPMGauge = v data%Equipments%DataDisplayConsole%MP2SPM = v !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%Equipments%DataDisplayConsole%MP1SPMGauge, data%Equipments%DataDisplayConsole%MP2SPMGauge) -#ifdef deb - print*, 'MP2SPMGauge=', data%Equipments%DataDisplayConsole%MP2SPMGauge -#endif + #ifdef deb + print*, 'MP2SPMGauge=', data%Equipments%DataDisplayConsole%MP2SPMGauge + #endif end subroutine end module CDataDisplayConsole \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.i90 b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.i90 index 0238169..75fdbba 100644 --- a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.i90 +++ b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.i90 @@ -15,26 +15,6 @@ module CDataDisplayConsole call json%get(parent,'DataDisplay',p) ! 2. get member of data type from node -! call json%get(p,'TripAlarmLow',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TripAlarmLow) -! call json%get(p,'TripAlarmHigh',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TripAlarmHigh) -! call json%get(p,'RetFlowAlarmLow',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RetFlowAlarmLow) -! call json%get(p,'RetFlowAlarmHigh',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RetFlowAlarmHigh) -! call json%get(p,'PitAlarmLow',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PitAlarmLow) -! call json%get(p,'PitAlarmHigh',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PitAlarmHigh) -! call json%get(p,'PortWeightOnBit',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PortWeightOnBit) -! call json%get(p,'PortHookLoad',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PortHookLoad) -! call json%get(p,'PortCasingPressure',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PortCasingPressure) -! call json%get(p,'PortPumpPressure',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PortPumpPressure) call json%get(p,'TripTankSetAlarmLow',pval) call json%get(pval,data%Equipments%DataDisplayConsole%TripTankSetAlarmLow) call json%get(p,'TripTankSetAlarmHigh',pval) @@ -98,85 +78,6 @@ module CDataDisplayConsole call json%get(p,'ResetWob',pval) call json%get(pval,data%Equipments%DataDisplayConsole%ResetWob) call json%get(p,'Clutch',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%Clutch) -! call json%get(p,'WOBPointer',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%WOBPointer) -! call json%get(p,'HookLoadPointer',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%HookLoadPointer) -! call json%get(p,'TripTankGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankGauge) -! call json%get(p,'TripTankAlarmLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankAlarmLED) -! call json%get(p,'TripTankPumpLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TripTankPumpLED) -! call json%get(p,'StandPipePressureGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%StandPipePressureGauge) -! call json%get(p,'CasingPressureGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%CasingPressureGauge) -! call json%get(p,'MP1SPMGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MP1SPMGauge) -! call json%get(p,'MP2SPMGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MP2SPMGauge) -! call json%get(p,'ReturnLineTempGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%ReturnLineTempGauge) -! call json%get(p,'RotaryTorqueGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RotaryTorqueGauge) -! call json%get(p,'RotaryRPMGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RotaryRPMGauge) -! call json%get(p,'AcidGasDetectionLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%AcidGasDetectionLED) -! call json%get(p,'TotalStrokeCounter',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TotalStrokeCounter) -! call json%get(p,'PitGainLossGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%PitGainLossGauge) -! call json%get(p,'MudTanksVolumeGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MudTanksVolumeGauge) -! call json%get(p,'MVTAlarmLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MVTAlarmLED) -! call json%get(p,'ReturnMudFlowGauge',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%ReturnMudFlowGauge) -! call json%get(p,'FillStrokeCounter',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%FillStrokeCounter) -! call json%get(p,'MFFITotalStrokeCounter',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MFFITotalStrokeCounter) -! call json%get(p,'MFFIAlarmLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MFFIAlarmLED) -! call json%get(p,'MFFIPumpLED',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MFFIPumpLED) -! call json%get(p,'TotalWellDepth',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%TotalWellDepth) -! call json%get(p,'BitDepth',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%BitDepth) -! call json%get(p,'HookLoad',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%HookLoad) -! call json%get(p,'StandPipePressure',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%StandPipePressure) -! call json%get(p,'CasingPressure',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%CasingPressure) -! call json%get(p,'MP1SPM',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MP1SPM) -! call json%get(p,'MP2SPM',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MP2SPM) -! call json%get(p,'RTTorque',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RTTorque) -! call json%get(p,'RTRPM',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%RTRPM) -! call json%get(p,'WOP',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%WOP) -! call json%get(p,'ROP',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%ROP) -! call json%get(p,'MudWeightIn',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MudWeightIn) -! call json%get(p,'MudWeightOut',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%MudWeightOut) -! call json%get(p,'Buzzer1',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer1) -! call json%get(p,'Buzzer2',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer2) -! call json%get(p,'Buzzer3',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer3) -! call json%get(p,'Buzzer4',pval) -! call json%get(pval,data%Equipments%DataDisplayConsole%Buzzer4) end subroutine subroutine DataDisplayConsoleToJson(parent) @@ -187,49 +88,6 @@ module CDataDisplayConsole ! 1. create new node call json%create_object(p,'DataDisplay') -! call json%add(p,"TripAlarmLow",data%Equipments%DataDisplayConsole%TripAlarmLow) -! call json%add(p,"TripAlarmHigh",data%Equipments%DataDisplayConsole%TripAlarmHigh) -! call json%add(p,"RetFlowAlarmLow",data%Equipments%DataDisplayConsole%RetFlowAlarmLow) -! call json%add(p,"RetFlowAlarmHigh",data%Equipments%DataDisplayConsole%RetFlowAlarmHigh) -! call json%add(p,"PitAlarmLow",data%Equipments%DataDisplayConsole%PitAlarmLow) -! call json%add(p,"PitAlarmHigh",data%Equipments%DataDisplayConsole%PitAlarmHigh) -! call json%add(p,"PortWeightOnBit",data%Equipments%DataDisplayConsole%PortWeightOnBit) -! call json%add(p,"PortHookLoad",data%Equipments%DataDisplayConsole%PortHookLoad) -! call json%add(p,"PortCasingPressure",data%Equipments%DataDisplayConsole%PortCasingPressure) -! call json%add(p,"PortPumpPressure",data%Equipments%DataDisplayConsole%PortPumpPressure) - -! call json%add(p,"TripTankSetAlarmLow",data%Equipments%DataDisplayConsole%TripTankSetAlarmLow) -! call json%add(p,"TripTankSetAlarmHigh",data%Equipments%DataDisplayConsole%TripTankSetAlarmHigh) -! call json%add(p,"TripTankSetAlarmSwitch",data%Equipments%DataDisplayConsole%TripTankSetAlarmSwitch) -! call json%add(p,"TripTankPowerSwitch",data%Equipments%DataDisplayConsole%TripTankPowerSwitch) -! call json%add(p,"TripTankPumpSwitch",data%Equipments%DataDisplayConsole%TripTankPumpSwitch) -! call json%add(p,"TripTankHornSwitch",data%Equipments%DataDisplayConsole%TripTankHornSwitch) -! call json%add(p,"AcidGasDetectionHornSwitch",data%Equipments%DataDisplayConsole%AcidGasDetectionHornSwitch) -! call json%add(p,"TotalStrokeCounterResetSwitch",data%Equipments%DataDisplayConsole%TotalStrokeCounterResetSwitch) -! call json%add(p,"DrillingTrippingSelectorSwitch",data%Equipments%DataDisplayConsole%DrillingTrippingSelectorSwitch) -! call json%add(p,"MVTSetAlarmLowKnob",data%Equipments%DataDisplayConsole%MVTSetAlarmLowKnob) -! call json%add(p,"MVTSetAlarmHighKnob",data%Equipments%DataDisplayConsole%MVTSetAlarmHighKnob) -! call json%add(p,"MVTSetAlarmSwitch",data%Equipments%DataDisplayConsole%MVTSetAlarmSwitch) -! call json%add(p,"MudTank1Switch",data%Equipments%DataDisplayConsole%MudTank1Switch) -! call json%add(p,"MudTank2Switch",data%Equipments%DataDisplayConsole%MudTank2Switch) -! call json%add(p,"MudTank3Switch",data%Equipments%DataDisplayConsole%MudTank3Switch) -! call json%add(p,"MudTank4Switch",data%Equipments%DataDisplayConsole%MudTank4Switch) -! call json%add(p,"MVTFineKnob",data%Equipments%DataDisplayConsole%MVTFineKnob) -! call json%add(p,"MVTCoarseKnob",data%Equipments%DataDisplayConsole%MVTCoarseKnob) -! call json%add(p,"MVTHornSwitch",data%Equipments%DataDisplayConsole%MVTHornSwitch) -! call json%add(p,"MVTDeviationTripSelectionSwitch",data%Equipments%DataDisplayConsole%MVTDeviationTripSelectionSwitch) -! call json%add(p,"MVTPowerSwitch",data%Equipments%DataDisplayConsole%MVTPowerSwitch) -! call json%add(p,"MFFIResetTotalStrokes",data%Equipments%DataDisplayConsole%MFFIResetTotalStrokes) -! call json%add(p,"MFFIResetFillCounter",data%Equipments%DataDisplayConsole%MFFIResetFillCounter) -! call json%add(p,"MFFIPumpSelectorSwitch",data%Equipments%DataDisplayConsole%MFFIPumpSelectorSwitch) -! call json%add(p,"MFFIFillSPMSelectorSwitch",data%Equipments%DataDisplayConsole%MFFIFillSPMSelectorSwitch) -! call json%add(p,"MFFISetAlarmLowKnob",data%Equipments%DataDisplayConsole%MFFISetAlarmLowKnob) -! call json%add(p,"MFFISetAlarmHighKnob",data%Equipments%DataDisplayConsole%MFFISetAlarmHighKnob) -! call json%add(p,"MFFISetAlarmSwitch",data%Equipments%DataDisplayConsole%MFFISetAlarmSwitch) -! call json%add(p,"MFFIPowerSwitch",data%Equipments%DataDisplayConsole%MFFIPowerSwitch) -! call json%add(p,"MFFIHornSwitch",data%Equipments%DataDisplayConsole%MFFIHornSwitch) -! call json%add(p,"ResetWob",data%Equipments%DataDisplayConsole%ResetWob) -! call json%add(p,"Clutch",data%Equipments%DataDisplayConsole%Clutch) call json%add(p,"WOBPointer",data%Equipments%DataDisplayConsole%WOBPointer) call json%add(p,"HookLoadPointer",data%Equipments%DataDisplayConsole%HookLoadPointer) @@ -254,7 +112,6 @@ module CDataDisplayConsole call json%add(p,"MFFIAlarmLED",data%Equipments%DataDisplayConsole%MFFIAlarmLED) call json%add(p,"MFFIPumpLED",data%Equipments%DataDisplayConsole%MFFIPumpLED) call json%add(p,"TotalWellDepth",data%Equipments%DataDisplayConsole%TotalWellDepth) -! call json%add(p,"TotalWellDepth",1000) call json%add(p,"BitDepth",data%Equipments%DataDisplayConsole%BitDepth) call json%add(p,"HookLoad",data%Equipments%DataDisplayConsole%HookLoad) call json%add(p,"StandPipePressure",data%Equipments%DataDisplayConsole%StandPipePressure) @@ -278,8 +135,6 @@ module CDataDisplayConsole subroutine Set_TotalDepth(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%Depth -! use CSimulationVariables, only: SetDistanceDrilled implicit none real(8), intent(in) :: v ! print *,"total depth = ",v @@ -289,7 +144,6 @@ module CDataDisplayConsole end subroutine subroutine Set_BitPosition(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%BitPosition implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%BitDepth = v @@ -297,7 +151,6 @@ module CDataDisplayConsole end subroutine subroutine Set_RotaryTorque(v) - use SimulationVariables !@!!, only: data%Equipments%DrillingWatch%Torque implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%RotaryTorqueGauge = v @@ -307,7 +160,7 @@ module CDataDisplayConsole subroutine Set_MudWeightIn(v) - use SimulationVariables !@!, only: MudWeightInDw => data%Equipments%DataDisplayConsole%MudWeightIn + use SimulationVariables implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%MudWeightIn = v @@ -355,7 +208,6 @@ module CDataDisplayConsole end subroutine subroutine Set_ROP(v) - use SimulationVariables !@!, only: ROPDw => data%Equipments%DataDisplayConsole%ROP implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%ROP = v @@ -363,9 +215,7 @@ module CDataDisplayConsole end subroutine subroutine Set_CasingPressure(v) - use SimulationVariables !@!, only: CasingPressureDw => CasingPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: CasingPressureChoke => CasingPressure +! use CChokeControlPanelVariables implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%CasingPressureGauge = v @@ -375,9 +225,6 @@ module CDataDisplayConsole end subroutine subroutine Set_StandPipePressure(v) - use SimulationVariables !@!, only: data%Equipments%DrillingWatch%PumpPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: StandPipePressureChoke => data%Equipments%DataDisplayConsole%StandPipePressure implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%StandPipePressureGauge = v @@ -391,7 +238,6 @@ module CDataDisplayConsole subroutine Set_RotaryRPMGauge(v) - use SimulationVariables !@!, only: data%Equipments%DrillingWatch%RPM implicit none real(8), intent(in) :: v data%Equipments%DataDisplayConsole%RotaryRPMGauge = v @@ -409,8 +255,9 @@ module CDataDisplayConsole data%Equipments%DataDisplayConsole%MP1SPMGauge = v data%Equipments%DataDisplayConsole%MP1SPM = v !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%Equipments%DataDisplayConsole%MP1SPMGauge, data%Equipments%DataDisplayConsole%MP2SPMGauge) -# 413 - + #ifdef deb + print*, 'MP1SPMGauge=', data%Equipments%DataDisplayConsole%MP1SPMGauge + #endif end subroutine subroutine Set_MP2SPMGauge(v) @@ -419,7 +266,8 @@ module CDataDisplayConsole data%Equipments%DataDisplayConsole%MP2SPMGauge = v data%Equipments%DataDisplayConsole%MP2SPM = v !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%Equipments%DataDisplayConsole%MP1SPMGauge, data%Equipments%DataDisplayConsole%MP2SPMGauge) -# 424 - + #ifdef deb + print*, 'MP2SPMGauge=', data%Equipments%DataDisplayConsole%MP2SPMGauge + #endif end subroutine end module CDataDisplayConsole diff --git a/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 b/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 index 1937b4f..27d4489 100644 --- a/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 +++ b/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 @@ -16,6 +16,7 @@ module CDrillingConsole type(json_value),pointer :: p,pval type(json_file)::jsonfile logical::found + integer :: i call jsonfile%get('Equipments.Drilling.AssignmentSwitch',data%Equipments%DrillingConsole%AssignmentSwitch,found) if ( .not. found ) call logg(4,"Not found: AssignmentSwitch") @@ -44,15 +45,20 @@ module CDrillingConsole call jsonfile%get('Equipments.Drilling.MP2ThrottleUpdate',data%Equipments%DrillingConsole%MP2ThrottleUpdate,found) if ( .not. found ) call logg(4,"Not found: MP2ThrottleUpdate") call jsonfile%get('Equipments.Drilling.MP2Throttle',data%Equipments%DrillingConsole%MP2Throttle,found) - if ( .not. found ) call logg(4,"Not found: MP2Throttle") - ! call jsonfile%get('Equipments.Drilling.DWSwitch',data%Equipments%DrillingConsole%DWSwitch,found) + if ( .not. found ) then + call logg(4,"Not found: MP2Throttle") + endif + ! call jsonfile%get('Equipments.Drilling.DWSwitch',data%Equipments%DrillingConsole%DWSwitch,found) ! if ( .not. found ) call logg(4,"Not found: DWSwitch") call jsonfile%get('Equipments.Drilling.DWThrottle',data%Equipments%DrillingConsole%DWThrottle,found) if ( .not. found ) call logg(4,"Not found: DWThrottle") call jsonfile%get('Equipments.Drilling.RTSwitch',data%Equipments%DrillingConsole%RTSwitch,found) if ( .not. found ) call logg(4,"Not found: RTSwitch") - call jsonfile%get('Equipments.Drilling.RTThrottle',data%Equipments%DrillingConsole%RTThrottle,found) - if ( .not. found ) call logg(4,"Not found: RTThrottle") + call jsonfile%get('Equipments.Drilling.RTThrottle',i,found) + data%Equipments%DrillingConsole%RTThrottle = real(i) + if ( .not. found ) then + call logg(4,"Not found: RTThrottle") + endif call jsonfile%get('Equipments.Drilling.DWBreak',data%Equipments%DrillingConsole%DWBreak,found) if ( .not. found ) call logg(4,"Not found: DWBreak") call jsonfile%get('Equipments.Drilling.PreviousDWBreak',data%Equipments%DrillingConsole%PreviousDWBreak,found) @@ -124,6 +130,8 @@ module CDrillingConsole call jsonfile%get('Equipments.Drilling.ParkingBrakeBtn',data%Equipments%DrillingConsole%ParkingBrakeBtn,found) if ( .not. found ) call logg(4,"Not found: ParkingBrakeBtn") + ! call jsonfile%destroy() + data%Equipments%DrillingConsole%DWSwitch = -1 data%Equipments%DrillingConsole%AssignmentSwitch = 1 data%Equipments%DrillingConsole%MP1CPSwitch = -1 diff --git a/CSharp/Equipments/ControlPanels/CDrillingConsole.i90 b/CSharp/Equipments/ControlPanels/CDrillingConsole.i90 index f4b31d1..cc2234e 100644 --- a/CSharp/Equipments/ControlPanels/CDrillingConsole.i90 +++ b/CSharp/Equipments/ControlPanels/CDrillingConsole.i90 @@ -17,6 +17,7 @@ module CDrillingConsole type(json_value),pointer :: p,pval type(json_file)::jsonfile logical::found + integer :: i call jsonfile%get('Equipments.Drilling.AssignmentSwitch',data%Equipments%DrillingConsole%AssignmentSwitch,found) if ( .not. found ) call logg(4,"Not found: AssignmentSwitch") @@ -45,15 +46,20 @@ module CDrillingConsole call jsonfile%get('Equipments.Drilling.MP2ThrottleUpdate',data%Equipments%DrillingConsole%MP2ThrottleUpdate,found) if ( .not. found ) call logg(4,"Not found: MP2ThrottleUpdate") call jsonfile%get('Equipments.Drilling.MP2Throttle',data%Equipments%DrillingConsole%MP2Throttle,found) - if ( .not. found ) call logg(4,"Not found: MP2Throttle") + if ( .not. found ) then + call logg(4,"Not found: MP2Throttle") + endif ! call jsonfile%get('Equipments.Drilling.DWSwitch',data%Equipments%DrillingConsole%DWSwitch,found) ! if ( .not. found ) call logg(4,"Not found: DWSwitch") call jsonfile%get('Equipments.Drilling.DWThrottle',data%Equipments%DrillingConsole%DWThrottle,found) if ( .not. found ) call logg(4,"Not found: DWThrottle") call jsonfile%get('Equipments.Drilling.RTSwitch',data%Equipments%DrillingConsole%RTSwitch,found) if ( .not. found ) call logg(4,"Not found: RTSwitch") - call jsonfile%get('Equipments.Drilling.RTThrottle',data%Equipments%DrillingConsole%RTThrottle,found) - if ( .not. found ) call logg(4,"Not found: RTThrottle") + call jsonfile%get('Equipments.Drilling.RTThrottle',i,found) + data%Equipments%DrillingConsole%RTThrottle = real(i) + if ( .not. found ) then + call logg(4,"Not found: RTThrottle") + endif call jsonfile%get('Equipments.Drilling.DWBreak',data%Equipments%DrillingConsole%DWBreak,found) if ( .not. found ) call logg(4,"Not found: DWBreak") call jsonfile%get('Equipments.Drilling.PreviousDWBreak',data%Equipments%DrillingConsole%PreviousDWBreak,found) @@ -125,6 +131,8 @@ module CDrillingConsole call jsonfile%get('Equipments.Drilling.ParkingBrakeBtn',data%Equipments%DrillingConsole%ParkingBrakeBtn,found) if ( .not. found ) call logg(4,"Not found: ParkingBrakeBtn") +! call jsonfile%destroy() + data%Equipments%DrillingConsole%DWSwitch = -1 data%Equipments%DrillingConsole%AssignmentSwitch = 1 data%Equipments%DrillingConsole%MP1CPSwitch = -1 diff --git a/CSharp/Equipments/ControlPanels/CEquipmentsConstants.i90 b/CSharp/Equipments/ControlPanels/CEquipmentsConstants.i90 new file mode 100644 index 0000000..0ff6445 --- /dev/null +++ b/CSharp/Equipments/ControlPanels/CEquipmentsConstants.i90 @@ -0,0 +1,12 @@ +# 1 "/home/admin/SimulationCore2/CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90" +module CEquipmentsConstants + implicit none + public + +! LED State Types + integer :: LedOff = 0 + integer :: LedOn = 1 + integer :: LedBlinking = 2 + + contains +end module CEquipmentsConstants diff --git a/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.i90 b/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.i90 index 62e181a..bb6cf02 100644 --- a/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.i90 +++ b/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90" +# 1 "/home/admin/SimulationCore2/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90" module CUnlatchLedNotification use OperationScenariosModule use UnityModule diff --git a/CSharp/OperationScenarios/Permissions/CIrIbopPermission.i90 b/CSharp/OperationScenarios/Permissions/CIrIbopPermission.i90 new file mode 100644 index 0000000..94c1f09 --- /dev/null +++ b/CSharp/OperationScenarios/Permissions/CIrIbopPermission.i90 @@ -0,0 +1,92 @@ +# 1 "/home/admin/SimulationCore2/CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90" +module CIrIbopPermission + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_IrIbopPermission() + use TD_DrillStemComponents + use UnitySignalsModule !for CTdsConnectionModesEnum + use CStudentStationVariables!, only: data%State%StudentStation%FillupHeadInstallation + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +# 16 + + + +!TOPDRIVE-CODE=58 + if (GetRotaryRpm() == 0.0d0 .and.& + Get_NearFloorConnection() >= 3 .and. Get_NearFloorConnection() <= 10 .and.& + Get_JointConnectionPossible() == .false. .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + data%State%StudentStation%FillupHeadInstallation == .false.) then + + call Set_IrIbopPermission(.true.) + return + end if + + + + + call Set_IrIbopPermission(.false.) + + + + endif + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +# 46 + + +!OPERATION-CODE=62 + if (GetRotaryRpm() == 0.0d0 .and.& + Get_OperationCondition() == OPERATION_TRIP .and.& +!(Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + data%State%TD_String%TopJointHeight >= 3.0 .and. data%State%TD_String%TopJointHeight <= 10.0 .and.& +!Get_IbopHeight() >= 22.0 .and. Get_IbopHeight() <= 35.0 .and.& + Get_JointConnectionPossible() == .false. .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_FillupHead() == FILLUP_HEAD_REMOVE) then + call Set_IrIbopPermission(.true.) + return + end if + + +!if (Get_OperationCondition() == OPERATION_DRILL .and.& +! Get_IbopHeight() >= 1 .and. Get_IbopHeight() <= 8 .and.& +! Get_NearFloorConnection() >= 1 .and. Get_NearFloorConnection() <= 8 .and.& +! Get_JointConnectionPossible() == .false. .and.& +! Get_KellyConnection() /= KELLY_CONNECTION_STRING .and.& +! Get_Swing() == SWING_WELL_END .and.& +! Get_Slips() == SLIPS_SET_END) then +! call Set_IrIbopPermission(.true.) +! return +!end if + + + + + call Set_IrIbopPermission(.false.) + + + + endif + + + + + + + end subroutine + + subroutine Subscribe_IrIbopPermission() + implicit none + end subroutine + +end module CIrIbopPermission diff --git a/CSharp/OperationScenarios/UnitySignals/UnitySignals.i90 b/CSharp/OperationScenarios/UnitySignals/UnitySignals.i90 index 8ecf474..b45c840 100644 --- a/CSharp/OperationScenarios/UnitySignals/UnitySignals.i90 +++ b/CSharp/OperationScenarios/UnitySignals/UnitySignals.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90" +# 1 "/home/admin/SimulationCore2/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90" module UnitySignalsModule use UnitySignalVariables use SimulationVariables diff --git a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 index 4f0a668..9172df7 100644 --- a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 +++ b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 @@ -33,7 +33,8 @@ module UnitySignalVariables enumerator TONG_BREAKOUT_END enumerator TONG_MAKEUP_BEGIN enumerator TONG_MAKEUP_END - + end enum + enum, bind(c) enumerator TDS_SWING_NEUTRAL enumerator TDS_SWING_OFF_BEGIN enumerator TDS_SWING_OFF_END @@ -41,18 +42,21 @@ module UnitySignalVariables enumerator TDS_SWING_DRILL_END enumerator TDS_SWING_TILT_BEGIN enumerator TDS_SWING_TILT_END - + end enum + enum, bind(c) enumerator TDS_SPINE_NEUTRAL enumerator TDS_SPINE_CONNECT_BEGIN enumerator TDS_SPINE_CONNECT_END enumerator TDS_SPINE_DISCONNECT_BEGIN enumerator TDS_SPINE_DISCONNECT_END - + end enum + enum, bind(c) enumerator BACKUP_CLAMP_OFF_END enumerator BACKUP_CLAMP_OFF_BEGIN enumerator BACKUP_CLAMP_FW_BEGIN enumerator BACKUP_CLAMP_FW_END - + end enum + enum, bind(c) enumerator SWING_NEUTRAL enumerator SWING_MOUSE_HOLE_BEGIN enumerator SWING_MOUSE_HOLE_END @@ -66,11 +70,11 @@ module UnitySignalVariables enumerator TDS_TONG_BREAKOUT_BEGIN enumerator TDS_TONG_MAKEUP_BEGIN enumerator TDS_TONG_MAKEUP_END - + end enum + enum, bind(c) enumerator SAFETY_VALVE_NEUTRAL enumerator SAFETY_VALVE_REMOVE enumerator SAFETY_VALVE_INSTALL - end enum enum, bind(c) enumerator OPERATION_DRILL diff --git a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.i90 b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.i90 index 538b205..9e1dc00 100644 --- a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.i90 +++ b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90" +# 1 "/home/admin/SimulationCore2/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90" module UnitySignalVariables ! use CVoidEventHandlerCollection ! use CIntegerEventHandlerCollection diff --git a/Common/DynamicDoubleArray.i90 b/Common/DynamicDoubleArray.i90 new file mode 100644 index 0000000..019cb9d --- /dev/null +++ b/Common/DynamicDoubleArray.i90 @@ -0,0 +1,158 @@ +# 1 "/home/admin/SimulationCore2/Common/DynamicDoubleArray.f90" +module DynamicDoubleArray + implicit none + public + + type, public :: DynamicDoubleArrayType + real(8), allocatable :: Array(:) + contains + procedure :: First => First + procedure :: Last => Last + procedure :: Length => Length + procedure :: Add => Add + procedure :: AddToFirst => AddToFirst + procedure :: AddTo => AddTo + procedure :: Remove => Remove + procedure :: Empty => Empty + end type DynamicDoubleArrayType + + private::First,Last,Length + contains + + real(8) function First(this) + implicit none + class(DynamicDoubleArrayType), intent(in) :: this + if(allocated(this%Array) .and. size(this%Array) > 0) then + First = this%Array(1) + return + end if + First = 0 + end function + + real(8) function Last(this) + implicit none + class(DynamicDoubleArrayType), intent(in) :: this + if(allocated(this%Array) .and. size(this%Array) > 0) then + Last = this%Array(size(this%Array)) + return + end if + Last = 0 + end function + + integer function Length(this) + implicit none + class(DynamicDoubleArrayType), intent(in) :: this + if(allocated(this%Array)) then + Length = size(this%Array) + return + end if + Length = 0 + end function + + + subroutine AddToFirst(this, value) + implicit none + class(DynamicDoubleArrayType), intent(inout) :: this + real(8), allocatable :: tempArr(:) + real(8), intent(in) :: value + integer :: i, isize + + if(allocated(this%Array)) then + isize = size(this%Array) + allocate(tempArr(isize+1)) + tempArr(1) = value + do i=2,isize+1 + tempArr(i) = this%Array(i-1) + end do + deallocate(this%Array) + call move_alloc(tempArr, this%Array) + else + allocate(this%Array(1)) + this%Array(1) = value + end if + + end subroutine + + subroutine AddTo(this, index, value) + implicit none + class(DynamicDoubleArrayType), intent(inout) :: this + real(8), allocatable :: tempArr(:) + integer, intent(in) :: index + real(8), intent(in) :: value + integer :: isize + if(index <= 0) return + if(index > size(this%Array)) then + call this%Add(value) + return + endif + if(allocated(this%Array)) then + isize = size(this%Array) + allocate(tempArr(isize+1)) + tempArr(:index-1) = this%Array(:index-1) + tempArr(index) = value + tempArr(index+1:) = this%Array(index:) + deallocate(this%Array) + call move_alloc(tempArr, this%Array) + end if + end subroutine + + subroutine Add(this, value) + implicit none + class(DynamicDoubleArrayType), intent(inout) :: this + real(8), allocatable :: tempArr(:) + real(8), intent(in) :: value + integer :: i, isize + + if(allocated(this%Array)) then + isize = size(this%Array) + allocate(tempArr(isize+1)) + do i=1,isize + tempArr(i) = this%Array(i) + end do + tempArr(isize+1) = value + deallocate(this%Array) + call move_alloc(tempArr, this%Array) + else + allocate(this%Array(1)) + this%Array(1) = value + end if + + end subroutine + + + subroutine Empty(this) + implicit none + class(DynamicDoubleArrayType), intent(inout) :: this + if(allocated(this%Array)) deallocate(this%Array) + end subroutine + + + subroutine Remove(this, index) + implicit none + class(DynamicDoubleArrayType), intent(inout) :: this + integer, intent(in) :: index + real(8), allocatable :: tempArr(:) + integer :: i + logical :: found + + if(index <= 0 .or. index > size(this%Array)) return + if(.not.allocated(this%Array))return + allocate(tempArr(size(this%Array)-1)) + found = .false. + do i=1, size(this%Array) + if(i==index) then + found = .true. + cycle + end if + if(found) then + tempArr(i-1) = this%Array(i) + else + tempArr(i) = this%Array(i) + endif + end do + deallocate(this%Array) + call move_alloc(tempArr, this%Array) + end subroutine + + +end module DynamicDoubleArray diff --git a/Common/json-fortran/json_file_module.i90 b/Common/json-fortran/json_file_module.i90 index 33845fa..c3473c7 100644 --- a/Common/json-fortran/json_file_module.i90 +++ b/Common/json-fortran/json_file_module.i90 @@ -1,4 +1,4 @@ -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" !***************************************************************************************** !> author: Jacob Williams ! license: BSD @@ -22,7 +22,7 @@ private -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_macros.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_macros.inc" 1 ! JSON-Fortran preprocessor macros. ! ! License @@ -60,7 +60,7 @@ !********************************************************* -# 25 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 25 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 !********************************************************* !> author: Jacob Williams @@ -512,7 +512,7 @@ ! all have a similar interface. subroutine initialize_json_core_in_file(me,& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -538,13 +538,13 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 506 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 506 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) implicit none class(json_file),intent(inout) :: me -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc @@ -659,10 +659,10 @@ logical(LK),intent(in),optional :: strict_integer_type_checking !! value cannot be read. !! !! (default is true) -# 512 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 512 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call me%core%initialize(& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -688,7 +688,7 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 515 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 515 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) end subroutine initialize_json_core_in_file !***************************************************************************************** @@ -745,7 +745,7 @@ strict_integer_type_checking & ! all have a similar interface. function initialize_json_file(p,& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -771,7 +771,7 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 572 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 572 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none @@ -780,7 +780,7 @@ strict_integer_type_checking & type(json_value),pointer,optional :: p !! `json_value` object to cast !! as a `json_file` object. This !! will be nullified. -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc @@ -895,10 +895,10 @@ logical(LK),intent(in),optional :: strict_integer_type_checking !! value cannot be read. !! !! (default is true) -# 581 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 581 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call file_object%initialize(& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -924,7 +924,7 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 584 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 584 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) if (present(p)) then @@ -981,7 +981,7 @@ strict_integer_type_checking & ! all have a similar interface. function initialize_json_file_from_string(str,& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -1007,14 +1007,14 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 641 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 641 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none type(json_file) :: file_object character(kind=CK,len=*),intent(in) :: str !! string to load JSON data from -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc @@ -1129,10 +1129,10 @@ logical(LK),intent(in),optional :: strict_integer_type_checking !! value cannot be read. !! !! (default is true) -# 648 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 648 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call file_object%initialize(& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -1158,7 +1158,7 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 651 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 651 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) call file_object%deserialize(str) @@ -1170,7 +1170,7 @@ strict_integer_type_checking & ! Alternate version of [[initialize_json_file_from_string]], where "str" is kind=CDK. function wrap_initialize_json_file_from_string(str,& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -1196,14 +1196,14 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 663 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 663 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none type(json_file) :: file_object character(kind=CDK,len=*),intent(in) :: str !! string to load JSON data from -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc @@ -1318,11 +1318,11 @@ logical(LK),intent(in),optional :: strict_integer_type_checking !! value cannot be read. !! !! (default is true) -# 670 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 670 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 file_object = initialize_json_file_from_string(& to_unicode(str),& -# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 +# 1 "/home/admin/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc @@ -1348,7 +1348,7 @@ null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & -# 674 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 +# 674 "/home/admin/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) end function wrap_initialize_json_file_from_string diff --git a/Equipments/Drawworks/Drawworks_Direction.f90 b/Equipments/Drawworks/Drawworks_Direction.f90 index d904b44..d15174b 100644 --- a/Equipments/Drawworks/Drawworks_Direction.f90 +++ b/Equipments/Drawworks/Drawworks_Direction.f90 @@ -9,11 +9,6 @@ subroutine Drawworks_Direction IMPLICIT NONE - - - - - if (data%State%Drawworks%Switch==1) then !Up data%State%Drawworks%motion = +1 data%State%Drawworks%w_old_drum = data%State%Drawworks%w_drum !(pi*(data%State%Drawworks%N_old/data%State%Drawworks%Conv_Ratio)/30.d0) ? diff --git a/Equipments/Drawworks/Drawworks_Direction.i90 b/Equipments/Drawworks/Drawworks_Direction.i90 new file mode 100644 index 0000000..13e637e --- /dev/null +++ b/Equipments/Drawworks/Drawworks_Direction.i90 @@ -0,0 +1,148 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Drawworks/Drawworks_Direction.f90" +subroutine Drawworks_Direction + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CDataDisplayConsole + use SimulationVariables + use SimulationVariables !@ + + IMPLICIT NONE + + if (data%State%Drawworks%Switch==1) then !Up + data%State%Drawworks%motion = +1 + data%State%Drawworks%w_old_drum = data%State%Drawworks%w_drum !(pi*(data%State%Drawworks%N_old/data%State%Drawworks%Conv_Ratio)/30.d0) ? + data%State%Drawworks%w_drum = (pi*(data%State%Drawworks%Speed/data%State%Drawworks%Conv_Ratio)/30.d0) ![rad/s] + data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height+(((data%State%Drawworks%Diameter/2.0)*(data%State%Drawworks%time_step*0.5d0*(data%State%Drawworks%w_drum+data%State%Drawworks%w_old_drum)))/data%State%Drawworks%NumberOfLine) ![m] + else if (data%State%Drawworks%Switch==-1) then !Down + data%State%Drawworks%motion = -1 + data%State%Drawworks%w_old_drum = data%State%Drawworks%w_drum !(pi*(data%State%Drawworks%N_old/data%State%Drawworks%Conv_Ratio)/30.d0) ? + data%State%Drawworks%w_drum = (pi*(data%State%Drawworks%Speed/data%State%Drawworks%Conv_Ratio)/30.d0) ![rad/s] + data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height-(((data%State%Drawworks%Diameter/2.0)*(data%State%Drawworks%time_step*0.5d0*(data%State%Drawworks%w_drum+data%State%Drawworks%w_old_drum)))/data%State%Drawworks%NumberOfLine) ![m] +!else if (data%State%Drawworks%Switch==0) then !Off +! data%State%Drawworks%motion = 0 +! data%State%Drawworks%w_old_drum = 0.d0 +! data%State%Drawworks%w_drum = 0.d0 +! data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height + end if + + + + + + + + + + + + + + + + +!if (data%State%Drawworks%Conv_Ratio==1.d0) then +! +! +! IF (data%State%Drawworks%motion==+1) THEN +! Call Drawworks_Free_Traction_motor_Dir +! if (data%State%Drawworks%w_drum_Dir<=0.) then +! data%State%Drawworks%motion = 0 +! else +! data%State%Drawworks%motion = +1 +! Call Drawworks_Free_Traction_motor +! data%State%Drawworks%w = data%State%Drawworks%w_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old = data%State%Drawworks%w_old_drum*data%State%Drawworks%Conv_Ratio +! end if +! ELSE +! if (((data%State%Drawworks%F_fastline*(data%State%Drawworks%Diameter/2.0d0))-(((data%State%Drawworks%Diameter/2.0d0)*data%State%Drawworks%BreakLoad)*(data%State%Drawworks%ManualBreak/100.0d0)))<=0.) then +! data%State%Drawworks%motion = 0 +! data%State%Drawworks%w_drum = 0.0d0 +! data%State%Drawworks%w_old_drum = 0.0d0 +! data%State%Drawworks%w = data%State%Drawworks%w_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old = data%State%Drawworks%w_old_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height +! +! data%State%Drawworks%ia = 0. +! data%State%Drawworks%ia_old = 0. +! data%State%Drawworks%x = 0. +! data%State%Drawworks%x_old = 0. +! data%State%Drawworks%y = 0. +! data%State%Drawworks%y_old = 0. +! else +! data%State%Drawworks%motion = -1 +! Call Drawworks_Free_Traction_motor_dawn_motion +! data%State%Drawworks%w = data%State%Drawworks%w_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old = data%State%Drawworks%w_old_drum*data%State%Drawworks%Conv_Ratio +! end if +! +! END IF +! +! +!else +! +! IF (data%State%Drawworks%motion==-1) THEN +! data%State%Drawworks%w = -data%State%Drawworks%w +! data%State%Drawworks%w_old = -data%State%Drawworks%w_old +! data%State%Drawworks%w_drum = -data%State%Drawworks%w_drum +! data%State%Drawworks%w_old_drum = -data%State%Drawworks%w_old_drum +! END IF +! Call Drawworks_Traction_motor_ClutchMode_Dir +! IF (data%State%Drawworks%w_Dir>0.d0) then +! +! data%State%Drawworks%motion = +1 +! Call Drawworks_Traction_motor_ClutchMode +! data%State%Drawworks%w_drum = data%State%Drawworks%w/data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old_drum = data%State%Drawworks%w_old/data%State%Drawworks%Conv_Ratio +! ELSE +! data%State%Drawworks%EddyTorque = (1.039d5*exp(4.343d-4*(30.0d0*(data%State%Drawworks%w/data%State%Drawworks%Conv_Ratio)/pi)))+(-1.036d5*exp(-.047920d0*(30.0d0*(data%State%Drawworks%w/data%State%Drawworks%Conv_Ratio)/pi))) !Lbf.ft +! if (data%State%Drawworks%EddyTorque>115000.) then +! data%State%Drawworks%EddyTorque = 115000.0d0 +! end if +! data%State%Drawworks%EddyTorque = 1.355817948*data%State%Drawworks%EddyTorque ![N.m] +! if ((data%State%Drawworks%F_fastline*(data%State%Drawworks%Diameter/2.0d0))>((((data%State%Drawworks%Diameter/2.0d0)*data%State%Drawworks%BreakLoad)*(data%State%Drawworks%ManualBreak/100.0d0))+(data%State%Drawworks%EddyTorque*(data%State%Drawworks%EddyBreak/100.0d0)))) then +! data%State%Drawworks%motion = -1 +! +! IF (data%State%Drawworks%w_drum<0.) THEN +! data%State%Drawworks%w = -data%State%Drawworks%w +! data%State%Drawworks%w_old = -data%State%Drawworks%w_old +! !data%State%Drawworks%w = 0. !??????????????? +! !data%State%Drawworks%w_old = 0. !??????????????? +! data%State%Drawworks%w_drum = -data%State%Drawworks%w_drum +! data%State%Drawworks%w_old_drum = -data%State%Drawworks%w_old_drum +! END IF +! +! data%State%Drawworks%Conv_Ratio = 1. +! Call Drawworks_Free_Traction_motor_dawn_motion +! data%State%Drawworks%w = data%State%Drawworks%w_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old = data%State%Drawworks%w_old_drum*data%State%Drawworks%Conv_Ratio +! !data%State%Drawworks%w_drum = data%State%Drawworks%w/data%State%Drawworks%Conv_Ratio +! !data%State%Drawworks%w_old_drum = data%State%Drawworks%w_old/data%State%Drawworks%Conv_Ratio +! else +! data%State%Drawworks%motion = 0 +! data%State%Drawworks%w_drum = 0.0d0 +! data%State%Drawworks%w_old_drum = 0.0d0 +! data%State%Drawworks%w = data%State%Drawworks%w_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%w_old = data%State%Drawworks%w_old_drum*data%State%Drawworks%Conv_Ratio +! data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height +! +! data%State%Drawworks%ia = 0. +! data%State%Drawworks%ia_old = 0. +! data%State%Drawworks%x = 0. +! data%State%Drawworks%x_old = 0. +! data%State%Drawworks%y = 0. +! data%State%Drawworks%y_old = 0. +! end if +! +! END IF +! +!end if + + + +!Call DWBrakeSound + + + +end subroutine Drawworks_Direction diff --git a/Equipments/Drawworks/Drawworks_Solver.i90 b/Equipments/Drawworks/Drawworks_Solver.i90 new file mode 100644 index 0000000..3b08a7c --- /dev/null +++ b/Equipments/Drawworks/Drawworks_Solver.i90 @@ -0,0 +1,285 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Drawworks/Drawworks_Solver.f90" +subroutine Drawworks_Solver + + Use CUnityInputs + use UnitySignalVariables + use UnitySignalsModule + use SimulationVariables !@ + use OperationScenariosModule + use OperationScenariosModule !!CElevator... + use UnitySignalsModule +! Use CTdsElevatorModesEnumVariables + use OperationScenariosModule + + IMPLICIT NONE + + + Integer :: j + Integer :: CrownCollision_Status , FloorCollision_Status , CrownWarning_Status , FloorWarning_Status + + + + + +!>>>>>>>>>>>>>>>>>>>> Speed <<<<<<<<<<<<<<<<<<<<<<<< + + data%State%Drawworks%N_Throtle = data%State%Drawworks%Throttle ![rpm] +!data%State%Drawworks%N_Accelarator = (data%State%Drawworks%Acceleretor/100.d0)*965.d0 ![rpm] + +!IF (data%State%Drawworks%N_Throtle>data%State%Drawworks%N_Accelarator) THEN + data%State%Drawworks%N_new = data%State%Drawworks%N_Throtle +!ELSE +! data%State%Drawworks%N_new = data%State%Drawworks%N_Accelarator +!END IF + +!========================== Drawworks Rate limit ========================== + if (((data%State%Drawworks%N_new-data%State%Drawworks%N_old)/data%State%Drawworks%time_step)>data%State%Drawworks%RateChange) then + data%State%Drawworks%Speed =(data%State%Drawworks%RateChange*data%State%Drawworks%time_step)+data%State%Drawworks%N_old ![rpm] + else if (((data%State%Drawworks%N_old-data%State%Drawworks%N_new)/data%State%Drawworks%time_step)>data%State%Drawworks%RateChange) then + data%State%Drawworks%Speed = (-data%State%Drawworks%RateChange*data%State%Drawworks%time_step)+data%State%Drawworks%N_old + else + data%State%Drawworks%Speed = data%State%Drawworks%N_new + end if +!======================================================================= + +!========================== Speed Correction ========================== +!===> SLIPS SET , No Motion + if ( data%State%Drawworks%DriveType==1 .and. Get_Slips() == SLIPS_SET_END .and. Get_KellyConnection() == KELLY_CONNECTION_STRING ) then + data%State%Drawworks%Speed = 0.d0 + end if + if ( data%State%Drawworks%DriveType==0 .and. Get_Slips() == SLIPS_SET_END .and. (Get_TdsConnectionModes()==TDS_CONNECTION_SPINE .or. Get_TdsConnectionModes()==TDS_CONNECTION_STRING) ) then + data%State%Drawworks%Speed = 0.d0 + end if + + +!===> Closed BOP Rams , No Motion + if ( data%State%Drawworks%ShearBopSituation==1 .and. (any(data%State%Drawworks%DrillModeCond==(/3,10,19,20,24/))) ) then + data%State%Drawworks%Speed = 0.d0 + end if +!======================================================================= + + + Call Drawworks_Direction + + + +!==================================================== +! Collision & Warning +!==================================================== + if ( data%State%Drawworks%CrownCollision == .false. ) then + CrownCollision_Status = 0 + end if + if ( data%State%Drawworks%FloorCollision == .false. ) then + FloorCollision_Status = 0 + end if + + + + + + +!==================================================== +! Crown Collision (Max_Hook_Height) +!==================================================== + if ( ((3.280839895d0*data%State%Drawworks%Hook_Height)>=data%State%Drawworks%max_Hook_Height) .and. (any(data%State%Drawworks%DrillModeCond==(/3,4,7,10,11,12,14/))) ) then + if ( CrownCollision_Status==0 .and. data%State%Drawworks%motion==1 ) then + CrownCollision_Status = 1 + data%State%Drawworks%CrownCollision = .true. + data%State%Drawworks%SoundCrownCollision = .true. + else + data%State%Drawworks%SoundCrownCollision = .false. + end if + if ( data%State%Drawworks%motion==-1 .and. data%State%Drawworks%CrownCollision==.false. ) then + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + else + Call DWFixModeMotion + end if + return + end if + + + + + + + +!==================================================== +! Floor Collision (Min_Hook_Height) +!==================================================== + if ( ((3.280839895*data%State%Drawworks%Hook_Height)<=data%State%Drawworks%min_Hook_Height) .and. (any(data%State%Drawworks%DrillModeCond==(/3,4,7,10,11,12,14/))) ) then + if ( FloorCollision_Status==0 .and. data%State%Drawworks%motion==-1 ) then + FloorCollision_Status = 1 + data%State%Drawworks%FloorCollision = .true. + data%State%Drawworks%SoundFloorCollision = .true. + else + data%State%Drawworks%SoundFloorCollision = .false. + end if + if ( data%State%Drawworks%motion==1 .and. data%State%Drawworks%FloorCollision==.false. ) then + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + else + Call DWFixModeMotion + end if + return + end if + + + + + + + + +!==================================================== +! Crown Warning +!==================================================== + if ( ((3.280839895*data%State%Drawworks%Hook_Height)>=data%State%Drawworks%max_Hook_Height) .and. (any(data%State%Drawworks%DrillModeCond==(/1,2,5,6,8,9,13/))) ) then + if ( data%State%Drawworks%motion==-1 ) then + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + else + Call DWFixModeMotion + end if + return + end if + + + + + + + +!==================================================== +! Floor Warning +!==================================================== + if ( ((3.280839895*data%State%Drawworks%Hook_Height)<=data%State%Drawworks%min_Hook_Height) .and. (any(data%State%Drawworks%DrillModeCond==(/1,2,5,6,8,9,13/))) ) then + if ( data%State%Drawworks%motion==1 ) then + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + else + Call DWFixModeMotion + end if + return + end if + + + + + + + + + + +!==================================================== +! ELEVATOR CONNECTION STRING (SLIPS SET , No Motion) +!==================================================== + if ( data%State%Drawworks%DriveType==1 .and. Get_Slips() == SLIPS_SET_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and. data%State%Drawworks%motion/=-1 ) then + Call DWFixModeMotion + return + end if + + if ( data%State%Drawworks%DriveType==0 .and. Get_Slips() == SLIPS_SET_END .and. (Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING) .and. data%State%Drawworks%motion/=-1 ) then + Call DWFixModeMotion + return + end if + + + + + + + + + + + +!==================================================== +! RAM & ToolJoint Collision (Top of RAM) +!==================================================== + Do j = 2,4 !startup problem ??????? + if ( data%State%Drawworks%TDBOPElementNo(j)/=0 ) then + if ( ((data%State%Drawworks%TDBOPHeight(j)-data%State%Drawworks%TDBOPThickness)<=(data%State%Drawworks%TDDrillStemsTopDepth(data%State%Drawworks%TDBOPElementNo(j))+data%State%Drawworks%TDDrillStemsToolJointRange(data%State%Drawworks%TDBOPElementNo(j)))) .and. ((data%State%Drawworks%TDBOPHeight(j)-data%State%Drawworks%TDBOPThickness)>data%State%Drawworks%TDDrillStemsTopDepth(data%State%Drawworks%TDBOPElementNo(j))) .and. (data%State%Drawworks%TDBOPRamDiam(j)<(2.d0*12.d0*data%State%Drawworks%TDDrillStemsRtoolJoint(data%State%Drawworks%TDBOPElementNo(j)))) ) then + if ( data%State%Drawworks%motion==1 ) then + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + else + Call DWFixModeMotion + end if + return + end if + end if + End Do + + + + + + + + + +!==================================================== +! RAM & ToolJoint Collision (Bottom of RAM) +!==================================================== + Do j = 2,4 + if ( data%State%Drawworks%TDBOPElementNo(j)/=0 ) then + if ( ((data%State%Drawworks%TDBOPHeight(j)+data%State%Drawworks%TDBOPThickness)>=(data%State%Drawworks%TDDrillStemsDownDepth(data%State%Drawworks%TDBOPElementNo(j))-data%State%Drawworks%TDDrillStemsToolJointRange(data%State%Drawworks%TDBOPElementNo(j)))) .and. ((data%State%Drawworks%TDBOPHeight(j)+data%State%Drawworks%TDBOPThickness) BottomHole ROP Condition + if ( (int(data%State%Drawworks%TDDrillStemBottom*10000.d0)>=(int((data%State%Drawworks%TDWellTotalLength+data%State%Drawworks%TDDlMax)*10000.d0))) .and. (data%State%Drawworks%motion==-1 .or. data%State%Drawworks%motion==0) ) then + if ( data%State%Drawworks%StringIsBottomOfWell==0 ) then + data%State%Drawworks%Hook_Height_final = data%State%Drawworks%Hook_Height_final+(data%State%Drawworks%TDDrillStemBottom-(data%State%Drawworks%TDWellTotalLength+data%State%Drawworks%TDDlMax)) + data%State%Drawworks%StringIsBottomOfWell = 1 + end if + Call DWFixModeMotion + return + else + data%State%Drawworks%StringIsBottomOfWell = 0 + end if + + + + + + + + + data%State%Drawworks%Hook_Height_final = 3.280839895d0*data%State%Drawworks%Hook_Height ![ft] + data%State%Drawworks%HookHeight_graph_output = 0.1189d0*((3.280839895d0*data%State%Drawworks%Hook_Height)-28.d0)-2.6d0 ![ft] + + + + +end subroutine Drawworks_Solver diff --git a/Equipments/Drawworks/Drawworks_StartUp.i90 b/Equipments/Drawworks/Drawworks_StartUp.i90 new file mode 100644 index 0000000..129f19e --- /dev/null +++ b/Equipments/Drawworks/Drawworks_StartUp.i90 @@ -0,0 +1,58 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Drawworks/Drawworks_StartUp.f90" +subroutine Drawworks_StartUp + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CHoistingVariables + use SimulationVariables + use SimulationVariables !@ +!use CWarnings + + IMPLICIT NONE + + + + data%State%Drawworks%RateChange = 193.d0 ! [rpm/s?] !??????? motaghayere voroudi + + + +!===> Hook Height + data%State%Drawworks%Hook_Height_ini = 75.0d0 ![ft] + data%State%Drawworks%Hook_Height_ini_graph_output = -1.54090d0 ![ft] + data%State%Drawworks%Hook_Height_inim = 0.3048d0*data%State%Drawworks%Hook_Height_ini ![m] + data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height_inim ![m] + data%State%Drawworks%Hook_Height_final = 75.d0 ![ft] + data%State%Drawworks%TDHookHeight = 75.d0 ![ft] + + + +!===> Drum (Drawworks) Diameter + data%State%Drawworks%Diameter = 2.50d0 ![ft] + data%State%Drawworks%Diameter = 0.3048d0*data%State%Drawworks%Diameter ![m] + + + +!===> Number of Line + data%State%Drawworks%NumberOfLine = data%Configuration%Hoisting%NumberOfLine + + + +!===> Simulation time step + data%State%Drawworks%time_step = 0.10d0 ![s] + + + +!===> Initial Values + data%State%Drawworks%w_drum = 0.d0 + data%State%Drawworks%w_old_drum = 0.d0 + data%State%Drawworks%motion = 0 + data%State%Drawworks%K_Throttle = 0 + data%State%Drawworks%StringIsBottomOfWell = 0 ! 1= string is at the bottom of the well +!data%State%Drawworks%CrownCollision = 0 +!data%State%Drawworks%FloorCollision = 0 + + + + +end subroutine Drawworks_StartUp diff --git a/Equipments/Drawworks/Drawworks_VARIABLES.i90 b/Equipments/Drawworks/Drawworks_VARIABLES.i90 new file mode 100644 index 0000000..f64113f --- /dev/null +++ b/Equipments/Drawworks/Drawworks_VARIABLES.i90 @@ -0,0 +1,56 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Drawworks/Drawworks_VARIABLES.f90" +MODULE Drawworks_VARIABLES + + IMPLICIT NONE + PUBLIC + + + +! REAL, PARAMETER :: pi=3.14159265 + + + +!************************************************************************************************** +!**************** Define Drawworks Array **************************************************** + TYPE, PUBLIC :: Drawworks_Var +!***** Drawworks_VARIABLES ********************** + + logical :: CrownCollision, FloorCollision + INTEGER :: AssignmentSwitch , K_Throttle , Switch + INTEGER :: MotorFaileMalf , ClutchEngageMalf , ClutchDisengageMalf + INTEGER :: motion, DriveType, ShearBopSituation, TDDrillStemComponentsNumbs + INTEGER :: DrillModeCond, StringIsBottomOfWell + INTEGER , Dimension(6) :: TDBOPElementNo + + REAL :: Throttle, RateChange + REAL :: Diameter + REAL :: Hook_Height, Hook_Height_ini, Hook_Height_inim, Hook_Height_ini_graph_output, Hook_Height_final, max_Hook_Height, min_Hook_Height, HookHeight_graph_output + REAL :: N_Throtle, Conv_Ratio, NumberOfLine, Speed, N_new, N_old ! N[RPM] + REAL :: w_drum, w_old_drum ! w[rad/s] + REAL , Dimension(6) :: TDBOPHeight + REAL , Dimension(4) :: TDBOPRamDiam + REAL :: TDBOPThickness, TDDrillStemBottom, TDWellTotalLength, TDDlMax + REAL , Allocatable, DIMENSION(:) :: TDDrillStemsDownDepth + REAL , Allocatable, DIMENSION(:) :: TDDrillStemsTopDepth + REAL , Allocatable, DIMENSION(:) :: TDDrillStemsToolJointRange + REAL , Allocatable, DIMENSION(:) :: TDDrillStemsRtoolJoint + REAL :: TDHookHeight + + REAL :: time_step + + INTEGER :: BLWR ! 1=On , 0=Off + +!************* Sound_VARIABLES ********************** + INTEGER :: SoundFw , SoundRev + Logical :: SoundBlower + Logical :: SoundFloorCollision , SoundCrownCollision + + END TYPE Drawworks_Var +!*********************************************************************************************** +!**************************************************************************************************** + + + + + +END MODULE Drawworks_VARIABLES diff --git a/Equipments/Pumps/Pump1_MainSolver.i90 b/Equipments/Pumps/Pump1_MainSolver.i90 new file mode 100644 index 0000000..325fea5 --- /dev/null +++ b/Equipments/Pumps/Pump1_MainSolver.i90 @@ -0,0 +1,58 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Pumps/Pump1_MainSolver.f90" +subroutine Pump1_MainSolver + + use SimulationVariables + + Implicit none + + + + + if (data%State%Pump(1)%Throttle<=0.d0) then + data%State%Pump(1)%K_throttle = 1 + end if + + + if((any(data%State%Pump(1)%AssignmentSwitchh==(/1,2,3,4,9,10/))) .and. (data%State%Pump(1)%Switch==-1) .and. (data%State%Pump(1)%K_throttle==1) .and. (data%State%Pump(1)%PowerFailMalf==0) .and. (data%State%Pump(1)%Failure==0)) then + + data%State%Pump(1)%SoundBlower = .true. + data%State%Pump(1)%BLWR = 1 + +!========================== Pump 1 Rate limit ========================== + if (((data%State%Pump(1)%N_new-data%State%Pump(1)%N_old)/data%State%Pump(1)%time_step)>data%State%Pump(1)%RateChange) then + data%State%Pump(1)%Speed =(data%State%Pump(1)%RateChange*data%State%Pump(1)%time_step)+data%State%Pump(1)%N_old ![RPM] + else if (((data%State%Pump(1)%N_old-data%State%Pump(1)%N_new)/data%State%Pump(1)%time_step)>data%State%Pump(1)%RateChange) then + data%State%Pump(1)%Speed = (-data%State%Pump(1)%RateChange*data%State%Pump(1)%time_step)+data%State%Pump(1)%N_old + else + data%State%Pump(1)%Speed = data%State%Pump(1)%N_new + end if +!======================================================================= + + Call Pump_OnMode_Solver(1) + + else + + if ((any(data%State%Pump(1)%AssignmentSwitchh==(/1,2,3,4,9,10/))) .and. (data%State%Pump(1)%Switch==-1)) then + data%State%Pump(1)%SoundBlower = .true. + else + data%State%Pump(1)%SoundBlower = .false. + end if + + if ((any(data%State%Pump(1)%AssignmentSwitchh==(/1,2,3,4,9,10/))) .and. (data%State%Pump(1)%Switch==-1) .and. (data%State%Pump(1)%PowerFailMalf==0) .and. (data%State%Pump(1)%Failure==0)) then + data%State%Pump(1)%BLWR = 1 + else + data%State%Pump(1)%BLWR = 0 + end if + + + Call Pump_OffMode_Solver(1) + data%State%Pump(1)%K_throttle = 0 + + end if + + + data%State%Pump(1)%N_old = data%State%Pump(1)%Speed + + + +end subroutine Pump1_MainSolver diff --git a/Equipments/Pumps/Pump_OffMode_Solver.i90 b/Equipments/Pumps/Pump_OffMode_Solver.i90 new file mode 100644 index 0000000..7de401c --- /dev/null +++ b/Equipments/Pumps/Pump_OffMode_Solver.i90 @@ -0,0 +1,47 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Pumps/Pump_OffMode_Solver.f90" +subroutine Pump_OffMode_Solver(Pump_No) + + use SimulationVariables + + IMPLICIT NONE + INTEGER :: Pump_No + + + + data%State%Pump(Pump_No)%N_new = 0.d0 + +!========================== Pump Rate limit ========================== + if (((data%State%Pump(Pump_No)%N_new-data%State%Pump(Pump_No)%N_old)/data%State%Pump(Pump_No)%time_step)>data%State%Pump(Pump_No)%RateChange) then + data%State%Pump(Pump_No)%Speed =(data%State%Pump(Pump_No)%RateChange*data%State%Pump(Pump_No)%time_step)+data%State%Pump(Pump_No)%N_old + else if (((data%State%Pump(Pump_No)%N_old-data%State%Pump(Pump_No)%N_new)/data%State%Pump(Pump_No)%time_step)>data%State%Pump(Pump_No)%RateChange) then + data%State%Pump(Pump_No)%Speed = (-data%State%Pump(Pump_No)%RateChange*data%State%Pump(Pump_No)%time_step)+data%State%Pump(Pump_No)%N_old + else + data%State%Pump(Pump_No)%Speed = data%State%Pump(Pump_No)%N_new + end if +!======================================================================= + + + data%State%Pump(Pump_No)%Flow_Rate = data%State%Pump(Pump_No)%FlowRatePerSTK*4118.d0*0.01d0*(data%State%Pump(Pump_No)%Speed/data%State%Pump(Pump_No)%Trans_Ratio) ![gpm] + data%State%Pump(Pump_No)%HorsePower = ((data%State%Pump(Pump_No)%Flow_Rate/0.01d0)*data%State%Pump(Pump_No)%StandPipe_Pressure)/(168067.d0*data%State%Pump(Pump_No)%Mech_Efficiency) ![HHP] +!data%State%Pump(Pump_No)%Max_Horsepower = ((data%State%Pump(Pump_No)%Flow_Rate/0.01d0)*data%State%Pump(Pump_No)%Max_Pressure)/(168067.d0*data%State%Pump(Pump_No)%Mech_Efficiency) ![HHP] + data%State%Pump(Pump_No)%Max_Horsepower = (data%State%Pump(Pump_No)%Flow_Rate*data%State%Pump(Pump_No)%Max_Pressure)/(1714.d0*data%State%Pump(Pump_No)%Mech_Efficiency) + if ( data%State%Pump(Pump_No)%StandPipe_Pressure>data%State%Pump(Pump_No)%Max_Pressure ) then ! in shart check shavad +!if ( (data%State%Pump(Pump_No)%StandPipe_Pressure*data%State%Pump(Pump_No)%Flow_Rate)>(1714.d0*data%State%Pump(Pump_No)%Max_Horsepower*data%State%Pump(Pump_No)%Mech_Efficiency) ) then + data%State%Pump(Pump_No)%Flow_Rate = (1714.d0*data%State%Pump(Pump_No)%Mech_Efficiency*data%State%Pump(Pump_No)%Max_Horsepower)/data%State%Pump(Pump_No)%StandPipe_Pressure ![gpm] + data%State%Pump(Pump_No)%Speed = ( data%State%Pump(Pump_No)%Flow_Rate/(data%State%Pump(Pump_No)%FlowRatePerSTK*4118.d0*0.01d0) )*data%State%Pump(Pump_No)%Trans_Ratio ![rpm] + end if + + data%State%Pump(Pump_No)%SoundSPM = INT(data%State%Pump(Pump_No)%Speed/data%State%Pump(Pump_No)%Trans_Ratio) + + If (data%State%Pump(Pump_No)%Flow_Rate>0.d0) Then + data%State%Pump(Pump_No)%Open_Close = 1 + Else + data%State%Pump(Pump_No)%Open_Close = 0 + End if + + + + + + +end subroutine Pump_OffMode_Solver diff --git a/Equipments/Pumps/Pumps_MainSolver.i90 b/Equipments/Pumps/Pumps_MainSolver.i90 new file mode 100644 index 0000000..5170244 --- /dev/null +++ b/Equipments/Pumps/Pumps_MainSolver.i90 @@ -0,0 +1,27 @@ +# 1 "/home/admin/SimulationCore2/Equipments/Pumps/Pumps_MainSolver.f90" +subroutine Pumps_MainSolver + + use SimulationVariables + + Implicit none + + + + Call DrillingConsole_ScrLEDs !koja bezaramesh????? + + Call Pumps_Inputs + + Call Pump1_MainSolver + + Call Pump2_MainSolver + + Call Pump3_MainSolver + + Call Pumps_TotalSolver + + + + Call Pumps_Outputs + + +end subroutine Pumps_MainSolver diff --git a/Equipments/RotaryTable/RTable_INPUTS.i90 b/Equipments/RotaryTable/RTable_INPUTS.i90 new file mode 100644 index 0000000..827388b --- /dev/null +++ b/Equipments/RotaryTable/RTable_INPUTS.i90 @@ -0,0 +1,78 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/RTable_INPUTS.f90" +subroutine RTable_INPUTS + + use CDrillingConsoleVariables + use SimulationVariables +! use CSimulationVariables + use UnitySignalsModule +! use CTdsElevatorModesEnumVariables + use CHoistingVariables + use TD_DrillStemComponents + use UnityModule + use CWarnings + use UnitySignalVariables + use UnitySignalsModule + + IMPLICIT NONE + integer :: i + + + + data%State%RTable%AssignmentSwitch = data%Equipments%DrillingConsole%AssignmentSwitch + data%State%RTable%Switch = data%Equipments%DrillingConsole%RTSwitch +!data%State%RTable%GearsAbuse = RotaryGearsAbuse + data%State%RTable%Throttle = data%Equipments%DrillingConsole%RTThrottle ![RPM] + data%State%RTable%String_Torque = data%State%TD_String%StringTorque*12.d0 ![lb.ft]*12 ---> [lb.in] ????????? +!data%State%RTable%RpmGaugeMalf !:dar module haye C meghdardehi mishe + + + + + data%State%RTable%N_new = data%State%RTable%Throttle + if ( data%State%RTable%MotorFaileMalf==1 ) then + data%State%RTable%N_new = 0.d0 + end if + data%State%RTable%String_Torque = 0.112984d0*data%State%RTable%String_Torque ![N.m] + + + +!===> String_JCoef Calculation + if ( data%Configuration%Hoisting%DriveType==0 ) then + if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%RTable%RotaryMode = 1 + data%State%RTable%String_JCoef = 0.d0 + Do i = 1,data%State%TD_String%StringConfigurationCount + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef+( (data%State%TD_DrillStem(i)%TotalWeight*((data%State%TD_DrillStem(i)%Id**2.d0)+(data%State%TD_DrillStem(i)%Od**2.d0)))/8.d0 ) ![lb.ft^2] , Jz=(1/2)*m*(r1^2+r2^2) + End Do + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef*0.0421401d0 ![kg.m^2] + else if ( Get_Slips() /= SLIPS_SET_END ) then + data%State%RTable%RotaryMode = 2 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + else + data%State%RTable%RotaryMode = 3 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + end if + else if ( data%Configuration%Hoisting%DriveType==1 ) then + if ( Get_IsKellyBushingSetInTable() .or. Get_Slips() == SLIPS_SET_END ) then !if rotary connected to string + data%State%RTable%RotaryMode = 4 + data%State%RTable%String_JCoef = 0.d0 + Do i = 1,data%State%TD_String%StringConfigurationCount + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef+( (data%State%TD_DrillStem(i)%TotalWeight*((data%State%TD_DrillStem(i)%Id**2.d0)+(data%State%TD_DrillStem(i)%Od**2.d0)))/8.d0 ) ![lb.ft^2] , Jz=(1/2)*m*(r1^2+r2^2) + End Do + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef*0.0421401e0 ![kg.m^2] + else + data%State%RTable%RotaryMode = 5 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + end if + end if + + +!===> Transmission Mode + data%State%RTable%Conv_Ratio = data%State%RTable%High_Conv_Ratio + + + +end subroutine RTable_INPUTS diff --git a/Equipments/RotaryTable/RTable_Inputs.f90 b/Equipments/RotaryTable/RTable_Inputs.f90 new file mode 100644 index 0000000..d0abaa5 --- /dev/null +++ b/Equipments/RotaryTable/RTable_Inputs.f90 @@ -0,0 +1,77 @@ +subroutine RTable_INPUTS + + use CDrillingConsoleVariables + use SimulationVariables + ! use CSimulationVariables + use UnitySignalsModule + ! use CTdsElevatorModesEnumVariables + use CHoistingVariables + use TD_DrillStemComponents + use UnityModule + use CWarnings + use UnitySignalVariables + use UnitySignalsModule + + IMPLICIT NONE + integer :: i + + + + data%State%RTable%AssignmentSwitch = data%Equipments%DrillingConsole%AssignmentSwitch + data%State%RTable%Switch = data%Equipments%DrillingConsole%RTSwitch + !data%State%RTable%GearsAbuse = RotaryGearsAbuse + data%State%RTable%Throttle = data%Equipments%DrillingConsole%RTThrottle ![RPM] + data%State%RTable%String_Torque = data%State%TD_String%StringTorque*12.d0 ![lb.ft]*12 ---> [lb.in] ????????? + !data%State%RTable%RpmGaugeMalf !:dar module haye C meghdardehi mishe + + + + + data%State%RTable%N_new = data%State%RTable%Throttle + if ( data%State%RTable%MotorFaileMalf==1 ) then + data%State%RTable%N_new = 0.d0 + end if + data%State%RTable%String_Torque = 0.112984d0*data%State%RTable%String_Torque ![N.m] + + + + !===> String_JCoef Calculation + if ( data%Configuration%Hoisting%DriveType==0 ) then + if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%RTable%RotaryMode = 1 + data%State%RTable%String_JCoef = 0.d0 + Do i = 1,data%State%TD_String%StringConfigurationCount + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef+( (data%State%TD_DrillStem(i)%TotalWeight*((data%State%TD_DrillStem(i)%Id**2.d0)+(data%State%TD_DrillStem(i)%Od**2.d0)))/8.d0 ) ![lb.ft^2] , Jz=(1/2)*m*(r1^2+r2^2) + End Do + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef*0.0421401d0 ![kg.m^2] + else if ( Get_Slips() /= SLIPS_SET_END ) then + data%State%RTable%RotaryMode = 2 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + else + data%State%RTable%RotaryMode = 3 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + end if + else if ( data%Configuration%Hoisting%DriveType==1 ) then + if ( Get_IsKellyBushingSetInTable() .or. Get_Slips() == SLIPS_SET_END ) then !if rotary connected to string + data%State%RTable%RotaryMode = 4 + data%State%RTable%String_JCoef = 0.d0 + Do i = 1,data%State%TD_String%StringConfigurationCount + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef+( (data%State%TD_DrillStem(i)%TotalWeight*((data%State%TD_DrillStem(i)%Id**2.d0)+(data%State%TD_DrillStem(i)%Od**2.d0)))/8.d0 ) ![lb.ft^2] , Jz=(1/2)*m*(r1^2+r2^2) + End Do + data%State%RTable%String_JCoef = data%State%RTable%String_JCoef*0.0421401e0 ![kg.m^2] + else + data%State%RTable%RotaryMode = 5 + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%String_Torque = 0.d0 + end if + end if + + + !===> Transmission Mode + data%State%RTable%Conv_Ratio = data%State%RTable%High_Conv_Ratio + + + +end subroutine RTable_INPUTS \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_MainSolver.f90 b/Equipments/RotaryTable/RTable_MainSolver.f90 new file mode 100644 index 0000000..11267a5 --- /dev/null +++ b/Equipments/RotaryTable/RTable_MainSolver.f90 @@ -0,0 +1,67 @@ +subroutine RTable_MainSolver + + + use SimulationVariables !@ + + IMPLICIT NONE + + + Call RTable_Inputs + + if (data%State%RTable%Throttle<=0.d0) then + data%State%RTable%K_throttle = 1 + end if + + + if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==-1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 + !======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if + !======================================================================= + CALL RTable_OnModeSolver + + else if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==1) .and. (data%State%RTable%K_throttle==1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 + !======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if + !======================================================================= + CALL RTable_OnModeSolver + + else + + if((any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch/=0)) then + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 + else + data%State%RTable%SoundBlower = .false. + data%State%RTable%BLWR = 0 + end if + Call RTable_OffMode + data%State%RTable%K_throttle = 0 + + end if + + + Call RTable_Outputs + + data%State%RTable%N_old = data%State%RTable%N_ref + + + +end subroutine RTable_MainSolver \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_MainSolver.i90 b/Equipments/RotaryTable/RTable_MainSolver.i90 new file mode 100644 index 0000000..b0777c3 --- /dev/null +++ b/Equipments/RotaryTable/RTable_MainSolver.i90 @@ -0,0 +1,68 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/RTable_MainSolver.f90" +subroutine RTable_MainSolver + + + use SimulationVariables !@ + + IMPLICIT NONE + + + Call RTable_Inputs + + if (data%State%RTable%Throttle<=0.d0) then + data%State%RTable%K_throttle = 1 + end if + + + if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==-1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 +!======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if +!======================================================================= + CALL RTable_OnModeSolver + + else if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==1) .and. (data%State%RTable%K_throttle==1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 +!======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if +!======================================================================= + CALL RTable_OnModeSolver + + else + + if((any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch/=0)) then + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 + else + data%State%RTable%SoundBlower = .false. + data%State%RTable%BLWR = 0 + end if + Call RTable_OffMode + data%State%RTable%K_throttle = 0 + + end if + + + Call RTable_Outputs + + data%State%RTable%N_old = data%State%RTable%N_ref + + + +end subroutine RTable_MainSolver diff --git a/Equipments/RotaryTable/RTable_OffModeSolver.i90 b/Equipments/RotaryTable/RTable_OffModeSolver.i90 new file mode 100644 index 0000000..efab4dc --- /dev/null +++ b/Equipments/RotaryTable/RTable_OffModeSolver.i90 @@ -0,0 +1,63 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/RTable_OffModeSolver.f90" +subroutine RTable_OffMode + + use SimulationVariables !@ + + IMPLICIT NONE + + REAL :: RT_OldSpeed, RT_OldRpmGauge + + + + RT_OldSpeed = data%State%RTable%Speed + RT_OldRpmGauge = data%State%RTable%RpmGaugeOutput + data%State%RTable%N_new = 0.d0 + +!======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if +!======================================================================= + + + if ( any(data%State%RTable%RotaryMode==(/1,4/)) ) then !if rotary connected to string +!==> RPM + data%State%RTable%Speed = data%State%RTable%N_ref/data%State%RTable%Conv_Ratio + data%State%RTable%Speed = min(data%State%RTable%Speed,data%State%RTable%MaxRPM) !Speed [RPM] + data%State%RTable%RpmGaugeOutput = data%State%RTable%Speed +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%Speed) +!==> Torque + data%State%RTable%Torque = ( ((data%State%RTable%J_coef+data%State%RTable%String_JCoef)*((((pi*data%State%RTable%Speed)/30.d0)-((pi*RT_OldSpeed)/30.d0))/data%State%RTable%time_step))+(data%State%RTable%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] ![kg.m^2]*[radians/s^2]+[N.m]=[N.m] + data%State%RTable%Torque = min(data%State%RTable%Torque,data%State%RTable%MaxTorque) + data%State%RTable%TorqueGaugeOutput = data%State%RTable%Torque + else if ( any(data%State%RTable%RotaryMode==(/2,5/)) ) then +!==> RPM + data%State%RTable%Speed = 0.d0 + data%State%RTable%RpmGaugeOutput = data%State%RTable%N_ref/data%State%RTable%Conv_Ratio + data%State%RTable%RpmGaugeOutput = min(data%State%RTable%RpmGaugeOutput,data%State%RTable%MaxRPM) +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%RpmGaugeOutput) +!==> Torque + data%State%RTable%Torque = 0.d0 + data%State%RTable%TorqueGaugeOutput = ( ((data%State%RTable%J_coef+data%State%RTable%String_JCoef)*((((pi*data%State%RTable%RpmGaugeOutput)/30.d0)-((pi*RT_OldRpmGauge)/30.d0))/data%State%RTable%time_step))+(data%State%RTable%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] ![kg.m^2]*[radians/s^2]+[N.m]=[N.m] + data%State%RTable%TorqueGaugeOutput = min(data%State%RTable%TorqueGaugeOutput,data%State%RTable%MaxTorque) + else if ( data%State%RTable%RotaryMode==3 ) then +!==> RPM + data%State%RTable%Speed = 0.d0 + data%State%RTable%RpmGaugeOutput = 0.d0 +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%RpmGaugeOutput) +!==> Torque + data%State%RTable%Torque = 0.d0 + data%State%RTable%TorqueGaugeOutput = 0.d0 + end if + + + + +end subroutine RTable_OffMode diff --git a/Equipments/RotaryTable/RTable_OnModeSolver.i90 b/Equipments/RotaryTable/RTable_OnModeSolver.i90 new file mode 100644 index 0000000..24fafec --- /dev/null +++ b/Equipments/RotaryTable/RTable_OnModeSolver.i90 @@ -0,0 +1,52 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/RTable_OnModeSolver.f90" +subroutine RTable_OnModeSolver + + use SimulationVariables !@ + + IMPLICIT NONE + + REAL :: RT_OldSpeed, RT_OldRpmGauge + + + + RT_OldSpeed = data%State%RTable%Speed + RT_OldRpmGauge = data%State%RTable%RpmGaugeOutput + + + + if ( any(data%State%RTable%RotaryMode==(/1,4/)) ) then !if rotary connected to string +!==> RPM + data%State%RTable%Speed = data%State%RTable%N_ref/data%State%RTable%Conv_Ratio + data%State%RTable%Speed = min(data%State%RTable%Speed,data%State%RTable%MaxRPM) !Speed [RPM] + data%State%RTable%RpmGaugeOutput = data%State%RTable%Speed +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%Speed) +!==> Torque + data%State%RTable%Torque = ( ((data%State%RTable%J_coef+data%State%RTable%String_JCoef)*((((pi*data%State%RTable%Speed)/30.d0)-((pi*RT_OldSpeed)/30.d0))/data%State%RTable%time_step))+(data%State%RTable%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] ![kg.m^2]*[radians/s^2]+[N.m]=[N.m] + data%State%RTable%Torque = min(data%State%RTable%Torque,data%State%RTable%MaxTorque) + data%State%RTable%TorqueGaugeOutput = data%State%RTable%Torque + else if ( any(data%State%RTable%RotaryMode==(/2,5/)) ) then +!==> RPM + data%State%RTable%Speed = 0.d0 + data%State%RTable%RpmGaugeOutput = data%State%RTable%N_ref/data%State%RTable%Conv_Ratio + data%State%RTable%RpmGaugeOutput = min(data%State%RTable%RpmGaugeOutput,data%State%RTable%MaxRPM) !inja bayad bashe ya na??? +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%RpmGaugeOutput) +!==> Torque + data%State%RTable%Torque = 0.d0 + data%State%RTable%TorqueGaugeOutput = ( ((data%State%RTable%J_coef+data%State%RTable%String_JCoef)*((((pi*data%State%RTable%RpmGaugeOutput)/30.d0)-((pi*RT_OldRpmGauge)/30.d0))/data%State%RTable%time_step))+(data%State%RTable%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] ![kg.m^2]*[radians/s^2]+[N.m]=[N.m] + data%State%RTable%TorqueGaugeOutput = min(data%State%RTable%TorqueGaugeOutput,data%State%RTable%MaxTorque) + else if ( data%State%RTable%RotaryMode==3 ) then +!==> RPM + data%State%RTable%Speed = 0.d0 + data%State%RTable%RpmGaugeOutput = 0.d0 +!==> Sound + data%State%RTable%SoundRPM = INT(data%State%RTable%RpmGaugeOutput) +!==> Torque + data%State%RTable%Torque = 0.d0 + data%State%RTable%TorqueGaugeOutput = 0.d0 + end if + + + +END subroutine RTable_OnModeSolver diff --git a/Equipments/RotaryTable/RTable_VARIABLES.i90 b/Equipments/RotaryTable/RTable_VARIABLES.i90 new file mode 100644 index 0000000..d9c047e --- /dev/null +++ b/Equipments/RotaryTable/RTable_VARIABLES.i90 @@ -0,0 +1,41 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/RTable_VARIABLES.f90" +MODULE RTable_VARIABLES + + IMPLICIT NONE + PUBLIC + + +! REAL, PARAMETER :: pi=3.14159265 + + + +!**************************************************************************************************** +!**************** Define Rotary Table Array **************************************************** + TYPE, PUBLIC :: RTable_Var + +!********* RTable_VARIABLES ************************* + INTEGER :: AssignmentSwitch , Switch , K_throttle , RotaryMode + INTEGER :: MotorFaileMalf , OverideTorqueLimitMalf , RpmGaugeMalf , TorqueGaugeMalf , TorqueLimitGaugeMalf + REAL(8) :: RpmGaugeOutput , TorqueGaugeOutput + REAL :: Throttle, RateChange + REAL :: Speed, Inertia_Moment, Mech_Efficiency, Torque, MaxRPM, MaxTorque + REAL :: Conv_Ratio, High_Conv_Ratio, Low_Conv_Ratio + REAL :: String_Torque, String_JCoef + REAL :: time_step, J_coef + REAL :: N_new, N_old, N_ref ! N(rpm) , w(rad/s) + +!********* Traction Motor_VARIABLES ***************** + + +!****************************************************** + INTEGER :: BLWR ! On=1 , Off=0 + +!************* Sound_VARIABLES ********************** + INTEGER :: SoundRPM + Logical :: SoundBlower + END TYPE RTable_Var + +!*********************************************************************************************** +!**************************************************************************************************** + +END MODULE RTable_VARIABLES diff --git a/Equipments/RotaryTable/Rtable_MainSolver.i90 b/Equipments/RotaryTable/Rtable_MainSolver.i90 new file mode 100644 index 0000000..14327bf --- /dev/null +++ b/Equipments/RotaryTable/Rtable_MainSolver.i90 @@ -0,0 +1,68 @@ +# 1 "/home/admin/SimulationCore2/Equipments/RotaryTable/Rtable_MainSolver.f90" +subroutine RTable_MainSolver + + + use SimulationVariables !@ + + IMPLICIT NONE + + + Call RTable_Inputs + + if (data%State%RTable%Throttle<=0.d0) then + data%State%RTable%K_throttle = 1 + end if + + + if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==-1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 +!======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if +!======================================================================= + CALL RTable_OnModeSolver + + else if ( (any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch==1) .and. (data%State%RTable%K_throttle==1) ) then + + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 +!======================= Rotary Table Rate_limit ======================= + if (((data%State%RTable%N_new-data%State%RTable%N_old)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else if (((data%State%RTable%N_old-data%State%RTable%N_new)/data%State%RTable%time_step)>data%State%RTable%RateChange) then + data%State%RTable%N_ref = (-data%State%RTable%RateChange*data%State%RTable%time_step)+data%State%RTable%N_old + else + data%State%RTable%N_ref = data%State%RTable%N_new + end if +!======================================================================= + CALL RTable_OnModeSolver + + else + + if((any(data%State%RTable%AssignmentSwitch==(/1,2,3,4,5,8,9,10,11/))) .and. (data%State%RTable%Switch/=0)) then + data%State%RTable%SoundBlower = .true. + data%State%RTable%BLWR = 1 + else + data%State%RTable%SoundBlower = .false. + data%State%RTable%BLWR = 0 + end if + Call RTable_OffMode + data%State%RTable%K_throttle = 0 + + end if + + + Call RTable_Outputs + + data%State%RTable%N_old = data%State%RTable%N_ref + + + +end subroutine RTable_MainSolver diff --git a/Equipments/TopDrive/TopDrive_Inputs.f90 b/Equipments/TopDrive/TopDrive_Inputs.f90 new file mode 100644 index 0000000..72f3665 --- /dev/null +++ b/Equipments/TopDrive/TopDrive_Inputs.f90 @@ -0,0 +1,45 @@ +subroutine TopDrive_Inputs + + ! Use CSimulationVariables + use CTopDrivePanelVariables + use SimulationVariables + use UnitySignalsModule + use SimulationVariables + Use TD_DrillStemComponents + + IMPLICIT NONE + + integer :: i + + + + data%State%TDS%String_Torque = data%State%TD_String%StringTorque*12.d0 ![lb.ft]*12 ---> [lb.in] ????????? + !data%State%TDS%String_Torque = 20000. + data%State%TDS%String_Torque = 0.112984829d0*data%State%TDS%String_Torque ![N.m] + data%State%TDS%PowerState = data%Equipments%TopDrivePanel%TopDriveTdsPowerState + data%State%TDS%RpmKnob = data%Equipments%TopDrivePanel%RpmKnob + !data%State%TDS%MotorFaileMalf ! jayi meghdardehi nashode ?????????????????? + data%State%TDS%RateChange = 193.d0 ![RPM/s] motaghayere voroudi ??? + data%State%TDS%DrillTorqueState = data%Equipments%TopDrivePanel%TopDriveDrillTorqueState + data%State%TDS%TorqueLimitKnob = data%Equipments%TopDrivePanel%TopDriveTorqueLimitKnob ! bayad hazf shavad??????????????/ + + + + !===> data%State%TDS%String_JCoef Calculation + if ( (data%State%TDS%DrillTorqueState==-1) .and. ((Get_TdsConnectionModes()==TDS_CONNECTION_STRING).or.(Get_TdsConnectionModes()==TDS_CONNECTION_SPINE)) ) then !if TopDrive connected to string + data%State%TDS%String_JCoef = 0.d0 + Do i = 1,data%State%TD_String%StringConfigurationCount + data%State%TDS%String_JCoef = data%State%TDS%String_JCoef+( (data%State%TD_DrillStem(i)%TotalWeight*((data%State%TD_DrillStem(i)%Id**2.d0)+(data%State%TD_DrillStem(i)%Od**2.d0)))/8.d0 ) ![lb.ft^2] , Jz=(1/2)*m*(r1^2+r2^2) + End Do + data%State%TDS%String_JCoef = data%State%TDS%String_JCoef*0.0421401d0 ![kg.m^2] + else + data%State%TDS%String_JCoef = 0.d0 + data%State%TDS%String_Torque = 0.d0 + end if + data%State%TDS%String_JCoef = data%State%TDS%String_JCoef/10.d0 !???????? /10: bi dalil, check it + + + + + +end subroutine \ No newline at end of file diff --git a/FluidFlow/kick/Gas_Kick_Calculator.i90 b/FluidFlow/kick/Gas_Kick_Calculator.i90 new file mode 100644 index 0000000..3bf65c9 --- /dev/null +++ b/FluidFlow/kick/Gas_Kick_Calculator.i90 @@ -0,0 +1,492 @@ +# 1 "/home/admin/SimulationCore2/FluidFlow/kick/Gas_Kick_Calculator.f90" +SUBROUTINE GasKickCalculator + use SimulationVariables + use KickVARIABLESModule + use SimulationVariables !@ + Use CReservoirVariables + Use CFormationVariables + USE Fluid_Flow_Startup_Vars + use PressureDisplayVARIABLESModule + USE FricPressDropVarsModule + USE MudSystemVARIABLES +use SimulationVariables !@@@ + USE CMudPropertiesVariables + USE CError + USE , INTRINSIC :: IEEE_ARITHMETIC + + +!! Note: a subject that may be confusing is that when we use gauge pressure and when're using absolute pressure?! +!! all stated pressure are gauge pressure, so I do like this. +!! only when we want to use a state equation (like ideal gas equation), we should use absolute equation and so I do this. +!! Thus gas pocket pressure are all absolute pressure. + + IMPLICIT NONE + + INTEGER :: i , j , k , l + + KickVARIABLES%SolvingEquationError = .FALSE. + KickVARIABLES%KickVandPFunction(:) = 0.d0 + KickVARIABLES%KickJacobian(: , :) = 0.d0 + +!==================================================== +! Gas Properties (Methane Gas) +!==================================================== +!GasPocketNewTemp%Array(1) = 600 + KickVARIABLES%BottomHoleTemperature = 600 + KickVARIABLES%KickFluxAvgPressure = (KickVARIABLES%BottomHolePress + KickVARIABLES%FormPressure) / 2 + StandardPress + KickVARIABLES%KickFluxAvgTemperature = (KickVARIABLES%FormTemperature + KickVARIABLES%BottomHoleTemperature) / 2 + KickVARIABLES%KickFluxAvgCompressibility = 0.98d0 + + KickVARIABLES%K_Aa = (5.8742362 * 10.**(-3) * KickVARIABLES%KickFluxAvgTemperature**1.2288) / (511.1728532 + KickVARIABLES%KickFluxAvgTemperature) + KickVARIABLES%K_Bb = 5.5565586 + (1000.01 / KickVARIABLES%KickFluxAvgTemperature) + KickVARIABLES%K_Cc = 2.47862 - 0.12294 * KickVARIABLES%K_Bb + KickVARIABLES%GasKickSIDensity = KickVARIABLES%KickFluxAvgPressure / (KickVARIABLES%KickFluxAvgCompressibility * & + KickVARIABLES%KickFluxAvgTemperature * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant) * Convpcftogpcm3 + + KickVARIABLES%GasKickViscosity = KickVARIABLES%K_Aa * EXP(KickVARIABLES%K_Bb * KickVARIABLES%GasKickSIDensity**KickVARIABLES%K_Cc) +!!!!!!!!!!!!!!!!!!!!!!!!! + +!!!!!!!!!!!!!! Calculating compressibility for bottom hole condition + + + KickVARIABLES%BottomHoleCompressibility = 0.98d0 +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + KickVARIABLES%GasKickBg = 0.00504 * KickVARIABLES%KickFluxAvgCompressibility * KickVARIABLES%KickFluxAvgTemperature / KickVARIABLES%KickFluxAvgPressure ![bbl/SCF] + + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +!WRITE (*,*) 'Gas Kick Top' +!===> Kick Flow Rate Calculation + IF (KickVARIABLES%FormPressure > KickVARIABLES%BottomHolePress) THEN + KickVARIABLES%KickmdotACoef = 10.0**(-8) * 1.15741d0 * 7.080 * KickVARIABLES%FormPermeability * REAL(KickVARIABLES%KickFormLength) * data%State%GasType(KickVARIABLES%KickGasType)%StDensity / & + (KickVARIABLES%GasKickViscosity * KickVARIABLES%GasKickBg * LOG(10000.0)) +!IF (WellHeadOpen .AND. NoGasPocket == 1) KickVARIABLES%KickmdotACoef = (1.d0 + 2.d0) * KickmdotACoef + ELSE + KickVARIABLES%KickmdotACoef = 0.0 + END IF + + i = data%State%FricPressDrop%StringLastEl + j = data%State%FricPressDrop%OpenholeFirstEl - 1 + k = KickVARIABLES%GasPocketFlowEl(1 , 1) + KickVARIABLES%KickmdotBCoef = KickVARIABLES%FormPressure + StandardPress !! - Sum(static and friction pressure loss) of flow elements below gas pocket, see below + IF (KickVARIABLES%FormPressure > KickVARIABLES%BottomHolePress) THEN + +!WRITE (*,*) 'k , i, j' , k , i, j + IF (k >= data%State%FricPressDrop%OpenholeFirstEl) THEN ! Bottom of active kick is in openhole + KickVARIABLES%KickmdotBCoef = KickVARIABLES%KickmdotBCoef - (SUM(FlowEl(data%State%FricPressDrop%OpenholeFirstEl : k)%StaticPressDiff)) !+ SUM(FlowEl(j + 1 : GasPocketFlowEl(1 , 1) - 1)%FricPressLoss +!WRITE (*,*) '1 SUM(FlowEl(j + 1 : k)%FricPressLoss', k, SUM(FlowEl(j + 1 : k)%FricPressLoss) + ELSE IF (k < data%State%FricPressDrop%OpenholeFirstEl) THEN ! bottom of 1st gas pocket (active kick) is in annulus ond/or choke line only + KickVARIABLES%KickmdotBCoef = KickVARIABLES%KickmdotBCoef - SUM(FlowEl(data%State%FricPressDrop%OpenholeFirstEl : data%State%FricPressDrop%NumbEl)%StaticPressDiff) & + - (SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : k)%StaticPressDiff) + SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : k)%FricPressLoss)) + END IF + END IF + + DO l = 1 , KickVARIABLES%NoGasPocket + KickVARIABLES%KickUnknownVector(2 * l - 1) = GasPocketNewVol%Array(l) + KickVARIABLES%KickUnknownVector(2 * l) = GasPocketNewPress%Array(l) + END DO + + IF (KickVARIABLES%WellHeadOpen) THEN +!!!!!!!!!! Calculation of functions of pocket Pressure and gas Volumes +!IF (GasPocketElementNo(1) > 0) WRITE (*,*) ' GasPocketElementNo(1) ' , GasPocketElementNo(1) +!WRITE (*,*) ' Kick Unknown Vector' , KickUnknownVector!(1) , KickUnknownVector(2) + IF (KickIteration == 1) THEN ! updating initial guess based on previous time step data + DO l = 1 , KickVARIABLES%NoGasPocket + KickVARIABLES%KickUnknownVector(2 * l - 1) = KickVARIABLES%KickUnknownVector(2 * l - 1) + GasPocketDeltaVol%Array(l) + END DO + END IF + + KickVARIABLES%KickVandPFunction(1) = KickVARIABLES%KickUnknownVector(1) - GasPocketCompressibility%Array(1) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * & ! VandP(1) = V(1) + GasPocketNewTemp%Array(1) * (GasPocketWeight%Array(1) + KickVARIABLES%KickmdotACoef * MAX(((KickVARIABLES%KickmdotBCoef - KickVARIABLES%KickUnknownVector(2)) * dt) , 0.0)) / KickVARIABLES%KickUnknownVector(2) +!WRITE (*,*) 'KickVandPFunction(1)',KickVandPFunction(1) + l = 2 * KickVARIABLES%NoGasPocket + CALL KickFunctionsCalculator(KickVARIABLES%KickVandPFunction(l) , KickVARIABLES%NoGasPocket , 2) ! VandP(last) = P(last) +!WRITE (*,*) 'KickVandPFunction(l)', l, KickVandPFunction(l) + DO l = 2 , KickVARIABLES%NoGasPocket ! VandP(Odd) = V(l, l > 1) + KickVARIABLES%KickVandPFunction(2 * l - 1) = KickVARIABLES%KickUnknownVector(2 * l - 1) - GasPocketCompressibility%Array(l) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * & + GasPocketNewTemp%Array(l) * GasPocketWeight%Array(l) / KickVARIABLES%KickUnknownVector(2 * l) +!WRITE(*,*) 'KickVandPFunction(V)', l, KickVandPFunction(2 * l - 1) + END DO + + DO l = KickVARIABLES%NoGasPocket - 1 , 1 , -1 + CALL KickFunctionsCalculator(KickVARIABLES%KickVandPFunction(2 * l) , l , 1) ! VandP(Even) = P(l, l < KickVARIABLES%NoGasPocket) +!WRITE(*,*) 'KickVandPFunction(P)', l , KickVandPFunction(2 * l) + END DO +!!!!!!!!!! END - Calculation of functions of pocket Pressure and gas Volumes + +!!!!!!!!!! Calculation of Jacobian + DO k = 1 , 2 * KickVARIABLES%NoGasPocket ! Main Diagonal + KickVARIABLES%KickJacobian(k , k) = 1.d0 + END DO + + KickVARIABLES%KickJacobian(1,2) = (GasPocketCompressibility%Array(1) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * GasPocketNewTemp%Array(1) & + * (GasPocketWeight%Array(1) + KickVARIABLES%KickmdotACoef * KickVARIABLES%KickmdotBCoef * dt) / KickVARIABLES%KickUnknownVector(2)**2) ! Row 1 Finished + IF (KickVARIABLES%KickJacobian(1,2) == 0.d0) THEN + CALL Error('KickJacobian(1,2) = 0.0') + KickVARIABLES%KickJacobian(1,2) = KickVARIABLES%OldKickJacobian(1,2) + END IF + +!WRITE(*,*) 'KickJacobian(1,2)', KickJacobian(1,2) + + l = KickVARIABLES%NoGasPocket + CALL KickFunctionsCalculator(KickVARIABLES%KickJacobian(2 * l , 2 * l - 1) , KickVARIABLES%NoGasPocket , 4) ! for last Row + IF (KickVARIABLES%KickJacobian(2 * l , 2 * l - 1) == 0.d0) THEN + CALL Error ('KickJacobian(Last,Odd) = 0.0') + KickVARIABLES%KickJacobian(2 * l , 2 * l - 1) = KickVARIABLES%OldKickJacobian(2 * l , 2 * l - 1) + END IF + + DO k = KickVARIABLES%NoGasPocket - 1 , 1 , -1 + KickVARIABLES%KickJacobian(2 * l , 2 * k - 1) = KickVARIABLES%KickJacobian(2 * l , 2 * l - 1) + END DO ! Last Row Finished +!WRITE(*,*) 'KickJacobian(2,1)', KickJacobian(2,1) + + + DO k = 2 , KickVARIABLES%NoGasPocket + KickVARIABLES%KickJacobian(2 * k - 1 , 2 * k) = GasPocketCompressibility%Array(k) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * GasPocketNewTemp%Array(k) & + * GasPocketWeight%Array(k) / KickVARIABLES%KickUnknownVector(2 * k)**2 + + END DO ! Odd Rows (V equations) Finished + + DO k = 1 , KickVARIABLES%NoGasPocket - 1 + KickVARIABLES%KickJacobian(2 * k , 2 * k + 2) = -1.d0 + END DO ! Even Rows (P equations) effect of upper pocket + + DO k = 2 , 2 * (KickVARIABLES%NoGasPocket - 1) , 2 + DO l = 1 , k - 1 , 2 + CALL KickFunctionsCalculator(KickVARIABLES%KickJacobian(k , l) , k / 2 , 3) + IF (KickVARIABLES%KickJacobian(k , l) == 0.d0) THEN + WRITE (*,*) 'Jacobian Array = 0.0', k , l + CALL Error ('KickJacobian(k , l) = 0.0') + KickVARIABLES%KickJacobian(k , l) = KickVARIABLES%OldKickJacobian(k , l) + END IF + END DO + END DO + + IF (ANY(IEEE_IS_NaN(KickVARIABLES%KickJacobian))) CALL ErrorStop ('NaN in calculating Kick Jacobian, Call your Service Provider') + +!!!!!!!!!! Solving linear equation in order to finding correction vector for correcting pocket pressure and gas induced flowrates + KickVARIABLES%KickVandPFunction = -1.d0 * KickVARIABLES%KickVandPFunction + CALL SOLVE_LINEAR_EQUATIONS(KickVARIABLES%KickJacobian , KickVARIABLES%KickCorrectionVector , KickVARIABLES%KickVandPFunction , KickVARIABLES%SolvingEquationError, SIZE(KickVARIABLES%KickCorrectionVector)) + IF (KickVARIABLES%SolvingEquationError) CALL ErrorStop( ' Error in solving kick equation ' ) + + KickVARIABLES%KickUnknownVector = KickVARIABLES%KickUnknownVector + KickVARIABLES%KickCorrectionUnderRelaxation * KickVARIABLES%KickCorrectionVector + + DO l = 1 , KickVARIABLES%NoGasPocket + GasPocketNewVol%Array(l) = KickVARIABLES%KickUnknownVector(2 * l - 1) + IF (IEEE_IS_NaN(GasPocketNewVol%Array(l))) CALL ErrorStop('Volume of this pocket is Not a Number:', l) + IF (GasPocketNewVol%Array(l) <= 0.d0) CALL Error('Volume of this pocket is Negative or Zero:', l) + GasPocketNewPress%Array(l) = KickVARIABLES%KickUnknownVector(2 * l) + IF (IEEE_IS_NaN(GasPocketNewPress%Array(l))) CALL ErrorStop('Pressure of this Pocket is Not a Number:', l) + IF (GasPocketNewPress%Array(l) <= 0.d0) CALL ErrorStop('Pressure of this Pocket is Negative or Zero:', l) + END DO + + + + ELSE ! well haed is closed, so build up process or migration occurs + +!WRITE (*,*) 'GasPocketOldPress (before)' , GasPocketOldPress(1) + GasPocketNewPress%Array(1) = GasPocketOldPress%Array(1) * & + (REAL((GasPocketWeight%Array(1) + KickVARIABLES%KickmdotACoef * KickVARIABLES%KickmdotBCoef * dt) / (GasPocketWeight%Array(1) + KickVARIABLES%KickmdotACoef * GasPocketOldPress%Array(1) * dt))) + + + + END IF + +!DO l = 1 , KickVARIABLES%NoGasPocket + GasPocketDeltaVol%Array(:) = GasPocketNewVol%Array(:) - GasPocketOldVol%Array(:) + GasPocketFlowInduced%Array(:) = (GasPocketDeltaVol%Array(:)) / dt * 448.8 ! gpm +!END DO + + KickVARIABLES%GasKickPumpFlowRate = 0.0 + IF (NOT(KickVARIABLES%KickOffBottom) .AND. KickVARIABLES%WellHeadOpen) KickVARIABLES%GasKickPumpFlowRate = GasPocketFlowInduced%Array(1) + + + + END SUBROUTINE + + + SUBROUTINE KickFunctionsCalculator(ExitValue , GasPocketNo , CalcMode) + + use SimulationVariables + use KickVARIABLESModule + USE FricPressDropVarsModule + USE Fluid_Flow_Startup_Vars + USE CError + USE , INTRINSIC :: IEEE_Arithmetic + + + IMPLICIT NONE + + REAL(8) :: ExitValue + INTEGER :: GasPocketNo , CalcMode + INTEGER :: x + INTEGER :: y + INTEGER :: z , i , j + + x = KickVARIABLES%GasPocketFlowEl(GasPocketNo , 1) + IF (GasPocketNo < KickVARIABLES%NoGasPocket) y = KickVARIABLES%GasPocketFlowEl(GasPocketNo + 1 , 1) + i = data%State%FricPressDrop%StringLastEl + j = data%State%FricPressDrop%OpenholeFirstEl - 1 + +! Case 1: gas pocket is completely in OP and STARTX of upper gas pocket is also +! Case 2: gas pocket is completely in OP and STARTX of upper gas pocket is above Bit +! Case 3: gas pocket is AROUNDBIT and so upper gas pocket is in ANN (or Choke line) +! Case 4: gas pocket is completely in ANN and upper gas pocket is also + +! CalcMode 1: KickVandPFunction between 2 pocket +! CalcMode 2: KickVandPFunction for top gas pocket +! CalcMode 3: KickJacobian between 2 Pocket +! CalcMode 4: KickJacobian for top (last) gas pocket +! CalcMode 5: Calculating pressure of bottom pocket based on upper pocket + + + IF (CalcMode == 1) THEN ! calculating pressure difference between two pocket, include static pressure difference and frictional +! pressure difference, use in calculating 'KickVandPFunction' + ExitValue = KickVARIABLES%KickUnknownVector(2 * GasPocketNo) - KickVARIABLES%KickUnknownVector(2 * GasPocketNo + 2) + IF (x >= data%State%FricPressDrop%OpenholeFirstEl .AND. y < data%State%FricPressDrop%OpenholeFirstEl) THEN ! Case 2 , Case 3 + ExitValue = ExitValue - SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%StaticPressDiff) - SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%FricPressLoss) & + - SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : y)%StaticPressDiff) - SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : y)%FricPressLoss) + ELSE ! Case 1 , Case 4 + ExitValue = ExitValue - SUM(FlowEl(x : y)%StaticPressDiff) - SUM(FlowEl(x : y)%FricPressLoss) + END IF + + + ELSE IF (CalcMode == 2) THEN + ExitValue = KickVARIABLES%KickUnknownVector(2 * GasPocketNo) - StandardPress - data%State%FricPressDrop%Kchoke * FlowEl(data%State%FricPressDrop%OpenholeFirstEl - 1)%Flowrate**2 + IF (x >= data%State%FricPressDrop%OpenholeFirstEl) THEN ! Gas Pocket is in Openhole + ExitValue = ExitValue - SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%StaticPressDiff) - SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%FricPressLoss) & + - SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : data%State%FricPressDrop%OpenholeFirstEl - 1)%StaticPressDiff) - SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : data%State%FricPressDrop%OpenholeFirstEl - 1)%FricPressLoss) + ELSE ! Gas Pocket is in Annulus + ExitValue = ExitValue - SUM(FlowEl(x : data%State%FricPressDrop%OpenholeFirstEl - 1)%StaticPressDiff) - SUM(FlowEl(x : data%State%FricPressDrop%OpenholeFirstEl - 1)%FricPressLoss) + END IF + + + ELSE IF (CalcMode == 3) THEN ! calculating derivative of pressure difference between two pocket, relative to change in flowrate +! use in calculating 'KickJacobian' + IF (x >= data%State%FricPressDrop%OpenholeFirstEl .AND. y < data%State%FricPressDrop%OpenholeFirstEl) THEN ! Top kick STARTX is in Annulus + DO z = x , data%State%FricPressDrop%NumbEl ! open hole elements + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + DO z = data%State%FricPressDrop%AnnulusFirstEl , y ! Annulus elements + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + ExitValue = ExitValue - (SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%FricToQPartialDiff) + SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : y)%FricToQPartialDiff)) * 448.8 / dt + ELSE ! both pockets are one side of bit + DO z = x , y + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + ExitValue = ExitValue - SUM(FlowEl(x : y)%FricToQPartialDiff) * 448.8 / dt + END IF + + + ELSE IF (CalcMode == 4) THEN ! partial derivative of frictional pressure drop relative to flowrate for top gas pocket + ExitValue = - 2.d0 * data%State%FricPressDrop%Kchoke * FlowEl(data%State%FricPressDrop%OpenholeFirstEl - 1)%Flowrate * 448.8 / dt + IF (x >= data%State%FricPressDrop%OpenholeFirstEl) THEN ! kick STARTX is in openhole + DO z = x , data%State%FricPressDrop%NumbEl ! open hole elements + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + DO z = data%State%FricPressDrop%AnnulusFirstEl , data%State%FricPressDrop%OpenholeFirstEl - 1 ! Annulus elements + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + ExitValue = ExitValue - (SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%FricToQPartialDiff) + SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : data%State%FricPressDrop%OpenholeFirstEl - 1)%FricToQPartialDiff)) * 448.8 / dt + ELSE + DO z = x , data%State%FricPressDrop%OpenholeFirstEl - 1 ! Annulus elements + CALL PartialDerivativeFricToFlowRate(z) + IF (IEEE_IS_NaN(FlowEl(z)%FricToQPartialDiff)) THEN + WRITE (*,*) ' FricToQPartialDiff , GenRe ' , x , FlowEl(z)%FricToQPartialDiff , FlowEl(z)%GenRe + WRITE (*,*) ' Op start, end, density, Q, mu' , FlowEl(z)%StartX, FlowEl(z)%EndX, FlowEl(z)%Density, FlowEl(z)%FlowRate, FlowEl(z)%mueff + CALL ErrorStop('NaN in calculating partial derivative') + END IF + END DO + ExitValue = ExitValue - SUM(FlowEl(x : data%State%FricPressDrop%OpenholeFirstEl - 1)%FricToQPartialDiff) * 448.8 / dt + END IF + + + ELSE IF (CalcMode == 5) THEN + IF (x >= data%State%FricPressDrop%OpenholeFirstEl .AND. y < data%State%FricPressDrop%OpenholeFirstEl) THEN ! Gas Pocket is in Openhole and upper pocket is in annulus +!WRITE (*,*) 'x , y 1' , x, y + ExitValue = GasPocketNewPress%Array(GasPocketNo + 1) + SUM(FlowEl(x : data%State%FricPressDrop%NumbEl)%StaticPressDiff) + SUM(FlowEl(data%State%FricPressDrop%AnnulusFirstEl : y)%StaticPressDiff) + ELSE ! Both gas pockets are in Annulus or openhole +!WRITE (*,*) 'x , y 2' , x, y + ExitValue = GasPocketNewPress%Array(GasPocketNo + 1) + SUM(FlowEl(x : y)%StaticPressDiff) + END IF + END IF + + + + END SUBROUTINE + + + +SUBROUTINE NewGasKick + use SimulationVariables + use KickVARIABLESModule + use SimulationVariables !@ + Use CReservoirVariables + Use CFormationVariables + USE Fluid_Flow_Startup_Vars + use PressureDisplayVARIABLESModule + USE FricPressDropVarsModule + USE MudSystemVARIABLES +use SimulationVariables !@@@ + USE CMudPropertiesVariables + USE CError + USE , INTRINSIC :: IEEE_ARITHMETIC + + +!! Note: a subject that may be confusing is that when we use gauge pressure and when using absolute pressure?! +!! all stated pressure are gauge pressure, so I do like this. +!! only when we want to use a state equation (like ideal gas equation), we should use absolute equation and so I do this. +!! Thus gas pocket pressure are all absolute pressure. + + IMPLICIT NONE + + INTEGER :: i , j , k , l + + IF (NOT(ALLOCATED(GasPocketWeight%Array))) THEN ! 1st kick + WRITE (*,*) ' New Influx 1' + + KickVARIABLES%NoGasPocket = 1 + data%State%MudSystem%NewInfluxNumber = data%State%MudSystem%NewInfluxNumber + 1 + + data%State%MudSystem%NewInfluxElementCreated = 0 + KickVARIABLES%KickOffBottom = .FALSE. + + + CALL GasPocketOldPress%AddToFirst((KickVARIABLES%BottomHolePress + StandardPress) * 1.d0) + CALL GasPocketNewPress%AddToFirst((KickVARIABLES%BottomHolePress + StandardPress) * 1.d0) + CALL GasPocketOldTemp%AddToFirst(600.0) + CALL GasPocketNewTemp%AddToFirst(600.0) + CALL GasPocketOldVol%AddToFirst(0.d0) + CALL GasPocketNewVol%AddToFirst(0.d0) + CALL GasPocketdeltaVol%AddToFirst(0.0) + CALL GasPocketFlowInduced%AddToFirst(0.0) + CALL GasPocketModifiedVol%AddToFirst(0.0) + CALL GasPocketWeight%AddToFirst(0.0) + CALL GasPocketDensity%AddToFirst(2.0) + CALL GasPocketCompressibility%AddToFirst(0.98) + + ALLOCATE(KickVARIABLES%KickJacobian(2 , 2) , KickVARIABLES%OldKickJacobian(2 , 2) , KickVARIABLES%KickVandPFunction(2) , KickVARIABLES%KickUnknownVector(2) , KickVARIABLES%KickCorrectionVector(2)) + + KickVARIABLES%BottomHoleTemperature = 600 + KickVARIABLES%KickFluxAvgPressure = (KickVARIABLES%BottomHolePress + KickVARIABLES%FormPressure) / 2 + StandardPress + KickVARIABLES%KickFluxAvgTemperature = (KickVARIABLES%FormTemperature + KickVARIABLES%BottomHoleTemperature) / 2 + KickVARIABLES%KickFluxAvgCompressibility = 0.98 + + + KickVARIABLES%GasKickSIDensity = KickVARIABLES%KickFluxAvgPressure / (KickVARIABLES%KickFluxAvgCompressibility * & + KickVARIABLES%KickFluxAvgTemperature * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant) * Convpcftogpcm3 + KickVARIABLES%GasKickDensity = KickVARIABLES%GasKickSIDensity * 8.3523 + GasPocketWeight%Array(1) = KickVARIABLES%GasKickDensity * KickVARIABLES%MinKickVol !1.0:seyyed gofte !KickmdotACoef * (KickmdotBCoef - GasPocketNewPress%Array(1)) * dt + + GasPocketNewVol%Array(1) = GasPocketCompressibility%Array(1) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * & + GasPocketNewTemp%Array(1) * GasPocketWeight%Array(1) / GasPocketNewPress%Array(1) + + GasPocketDeltaVol%Array(1) = 0.05 !GasPocketNewVol%Array(1) + GasPocketFlowInduced%Array(1) = (GasPocketDeltaVol%Array(1)) / dt * 448.8 ! gpm + KickVARIABLES%GasKickPumpFlowRate = GasPocketFlowInduced%Array(1) + + WRITE (*,*) ' FormPressure , BottomHolePress' , KickVARIABLES%FormPressure , KickVARIABLES%BottomHolePress, KickVARIABLES%GasKickDensity + WRITE (*,*) ' No Press(psia) Vol(gal) Weight(lbm) Flow Induced(gpm)' + DO i = 1 , KickVARIABLES%NoGasPocket + WRITE (*,102) i , GasPocketNewPress%Array(i), GasPocketNewVol%Array(i) * Convft3toUSgal, GasPocketWeight%Array(i), GasPocketFlowInduced%Array(i) + END DO + +!ELSE IF (NoGasPocket < MaxGasPocket .AND. KickVARIABLES%KickOffBottom .AND. (GasPocketNewVol%Array(1) > KickVARIABLES%MinAllowableKickVol .OR. KickWasExitingThroughChoke)) THEN + ELSE IF (KickVARIABLES%NoGasPocket < KickVARIABLES%MaxGasPocket .AND. KickVARIABLES%KickOffBottom .AND. (GasPocketNewVol%Array(1) > KickVARIABLES%MinAllowableKickVol .OR. ANY(KickVARIABLES%GasPocketFlowEl(1 , :) == data%State%FricPressDrop%OpenholeFirstEl - 1))) THEN + WRITE (*,*) ' New Influx', KickVARIABLES%NoGasPocket + 1 + +102 FORMAT (I2, 4X, (F8.1), 3X, (F8.3), 2X, (F8.3), 8X, (F8.3)) + + + KickVARIABLES%NoGasPocket = KickVARIABLES%NoGasPocket + 1 + data%State%MudSystem%NewInfluxNumber = data%State%MudSystem%NewInfluxNumber + 1 + + data%State%MudSystem%NewInfluxElementCreated = 0 + KickVARIABLES%KickOffBottom = .FALSE. + + CALL GasPocketOldPress%AddToFirst((KickVARIABLES%BottomHolePress + StandardPress) * 1.d0) + CALL GasPocketNewPress%AddToFirst((KickVARIABLES%BottomHolePress + StandardPress) * 1.d0) + CALL GasPocketOldTemp%AddToFirst(600.0) + CALL GasPocketNewTemp%AddToFirst(600.0) + CALL GasPocketOldVol%AddToFirst(0.d0) + CALL GasPocketNewVol%AddToFirst(0.d0) + CALL GasPocketdeltaVol%AddToFirst(0.0) + CALL GasPocketFlowInduced%AddToFirst(0.0) + CALL GasPocketModifiedVol%AddToFirst(0.0) + CALL GasPocketWeight%AddToFirst(0.0) + CALL GasPocketDensity%AddToFirst(2.0) + CALL GasPocketCompressibility%AddToFirst(0.98) + + DEALLOCATE(KickVARIABLES%KickJacobian , KickVARIABLES%OldKickJacobian , KickVARIABLES%KickVandPFunction , KickVARIABLES%KickUnknownVector , KickVARIABLES%KickCorrectionVector) + + ALLOCATE(KickVARIABLES%KickJacobian(2 * KickVARIABLES%NoGasPocket , 2 * KickVARIABLES%NoGasPocket) , KickVARIABLES%OldKickJacobian(2 * KickVARIABLES%NoGasPocket , 2 * KickVARIABLES%NoGasPocket)) + ALLOCATE(KickVARIABLES%KickUnknownVector(2 * KickVARIABLES%NoGasPocket) , KickVARIABLES%KickCorrectionVector(2 * KickVARIABLES%NoGasPocket) , KickVARIABLES%KickVandPFunction(2 * KickVARIABLES%NoGasPocket)) + + + KickVARIABLES%BottomHoleTemperature = 600 + KickVARIABLES%KickFluxAvgPressure = (KickVARIABLES%BottomHolePress + KickVARIABLES%FormPressure) / 2 + StandardPress + KickVARIABLES%KickFluxAvgTemperature = (KickVARIABLES%FormTemperature + KickVARIABLES%BottomHoleTemperature) / 2 + KickVARIABLES%KickFluxAvgCompressibility = 0.98 + + + KickVARIABLES%GasKickSIDensity = KickVARIABLES%KickFluxAvgPressure / (KickVARIABLES%KickFluxAvgCompressibility * & + KickVARIABLES%KickFluxAvgTemperature * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant) * Convpcftogpcm3 + KickVARIABLES%GasKickDensity = KickVARIABLES%GasKickSIDensity * 8.3523 + +!GasPocketWeight%Array(1) = KickVARIABLES%GasKickDensity * 0.05 !KickmdotACoef * (KickmdotBCoef - GasPocketNewPress%Array(1)) * dt + GasPocketWeight%Array(1) = KickVARIABLES%GasKickDensity * KickVARIABLES%MinKickVol !1.0:seyyed gofte !KickmdotACoef * (KickmdotBCoef - GasPocketNewPress%Array(1)) * dt + + GasPocketNewVol%Array(1) = GasPocketCompressibility%Array(1) * data%State%GasType(KickVARIABLES%KickGasType)%GasConstant * & + GasPocketNewTemp%Array(1) * GasPocketWeight%Array(1) / GasPocketNewPress%Array(1) + + GasPocketDeltaVol%Array(1) = 0.05 !GasPocketNewVol%Array(1) + GasPocketFlowInduced%Array(1) = (GasPocketDeltaVol%Array(1)) / dt * 448.8 ! gpm + KickVARIABLES%GasKickPumpFlowRate = GasPocketFlowInduced%Array(1) + + WRITE (*,*) ' FormPressure , BottomHolePress' , KickVARIABLES%FormPressure , KickVARIABLES%BottomHolePress, KickVARIABLES%GasKickDensity + WRITE (*,*) ' No Press(psia) Vol(gal) Weight(lbm) Flow Induced(gpm)' + DO i = 1 , KickVARIABLES%NoGasPocket + WRITE (*,102) i , GasPocketNewPress%Array(i), GasPocketNewVol%Array(i) * Convft3toUSgal, GasPocketWeight%Array(i), GasPocketFlowInduced%Array(i) + END DO + + ELSE ! no new kick, so mass of 1st kick should increase + GasPocketWeight%Array(1) = GasPocketweight%Array(1) + KickVARIABLES%KickmdotACoef * (KickVARIABLES%KickmdotBCoef - GasPocketNewPress%Array(1)) * dt + KickVARIABLES%GasKickPumpFlowRate = GasPocketFlowInduced%Array(1) + + IF (KickVARIABLES%NoGasPocket > 1 .OR. KickVARIABLES%SecondaryKickWeight > 0.0) THEN + KickVARIABLES%SecondaryKickWeight = KickVARIABLES%SecondaryKickWeight + KickVARIABLES%KickmdotACoef * (KickVARIABLES%KickmdotBCoef - GasPocketNewPress%Array(1)) * dt + KickVARIABLES%SecondaryKickVol = KickVARIABLES%SecondaryKickWeight / KickVARIABLES%GasReservoirDensity / 42.0 ! 42 USGal = 1bbl + END IF + + END IF + + +END SUBROUTINE + diff --git a/Makefile b/Makefile index b29d9ff..a1ca09d 100644 --- a/Makefile +++ b/Makefile @@ -390,6 +390,9 @@ OBJS_F = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS_T2)) all: $(TARGET) +c: + cc Redis/redis_io.c -c -o obj/redis_io.o + $(TARGET): $(OBJS_F) @echo "make TARGET" cc Redis/redis_io.c -c -o obj/redis_io.o diff --git a/Redis/Redis_Interface.f90 b/Redis/Redis_Interface.f90 index 392d383..54997cb 100644 --- a/Redis/Redis_Interface.f90 +++ b/Redis/Redis_Interface.f90 @@ -1,5 +1,10 @@ Module RedisInterface - ! use iso_c_binding, only: c_char + use iso_c_binding, only: c_char + ! USE Kinds, ONLY: rk, ck + TYPE FString + CHARACTER(KIND=c_char,LEN=:),allocatable :: item + END TYPE FString + character(len=20000)::buffer Interface SUBROUTINE addnums(a, b) BIND(C,name='addnums') USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT @@ -26,6 +31,14 @@ Module RedisInterface type(c_ptr) :: getData_C END FUNCTION getData_C + SUBROUTINE getData_C_bystr(str) BIND(C,name='getData_bystr') + use iso_c_binding, only: c_ptr,c_int,c_char + type(c_ptr) :: str + END SUBROUTINE getData_C_bystr + + SUBROUTINE getData_C_byfile() BIND(C,name='getData_byfile') + END SUBROUTINE getData_C_byfile + SUBROUTINE deallocateData() BIND(C, name='deallocData') END SUBROUTINE deallocateData @@ -39,25 +52,6 @@ Module RedisInterface character(len=*) :: password,address,datakey integer::port,status character(len=:),allocatable::c_address,c_password,c_datakey - ! type(json_file) :: jsonfile - ! type(json_value),pointer :: jsonvalue,jsonvalue2 - ! type(json_core) :: jsoncore - - ! call jsonfile%initialize() - ! print *,"Initilized: simulation with ",configFilename - ! call jsonfile%load_file(configFilename); - ! if (jsonfile%failed()) then - ! print *,"can not open config file: ",configFilename ; - ! stop - ! endif - ! ! print *,"file read" - ! call jsonfile%json_file_get_root(jsonvalue) - ! call jsoncore%get(jsonvalue,'redis',jsonvalue2) - ! call jsoncore%get(jsonvalue2,"address",address); - ! call jsoncore%get(jsonvalue2,"port",port); - ! call jsoncore%get(jsonvalue2,"password",password); - ! call jsoncore%get(jsonvalue2,"datakey",datakey); - c_datakey = datakey//c_null_char c_password = password//c_null_char c_address = address//c_null_char @@ -89,49 +83,105 @@ Module RedisInterface call setData_C(part,c_str) END SUBROUTINE setInput - SUBROUTINE getData(string) - use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr + SUBROUTINE getData(string,len) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_int ! character(:),allocatable :: getData2 character(:),allocatable :: string integer :: string_shape(1) + integer(c_int):: len type(c_ptr) :: c_string integer::l l = 30000 - ! print *,"reading data l=",l - c_string = getData_C(l) - ! print *,"data read. l=",l - ! len = int(c_len,kind=kind(len)) string_shape(1) = l!int(l,kind=kind(Integer)) + print *,"reading data l=",l if(.not. allocated(string)) then print *,"allocate string" allocate(character(l) :: string) endif + len = l + c_string = getData_C(len) + ! print *,"data read. l=",l + ! len = int(c_len,kind=kind(len)) call c_f_pointer(c_string, string, string_shape) c_string=c_null_ptr - string = trim(string) + ! string = trim(string) ! print *,len_trim(string), "chars read." ! print *,string(1:l) ! getData2=string END SUBROUTINE getData - ! SUBROUTINE getData2(string) !result(string) - ! use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr - ! ! character(:),allocatable :: getData2 - ! character(:),allocatable :: string - ! integer :: string_shape(1) - ! type(c_ptr) :: c_string - ! integer::l - ! ! print *,"reading data (getData2)" - ! c_string = getData_C(l) - ! ! string = c_str - ! ! len = int(c_len,kind=kind(len)) - ! string_shape(1) = l! int(l,kind=kind(integer)) - ! if(.not. allocated(string)) allocate(character(l) :: string) - ! call c_f_pointer(c_string, string, string_shape) - ! c_string=c_null_ptr - ! ! print *,len_trim(string), "chars read." - ! ! print *,string(1:l) - ! ! getData2=string - ! END SUBROUTINE getData2 + SUBROUTINE getData2(string) !result(string) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_loc + ! character(:),allocatable :: getData2 + character(len=:,kind=c_char),allocatable :: string + integer :: string_shape(1) + type(c_ptr) :: c_string + TYPE(FString), TARGET :: f_str + integer::l + ! print *,"reading data (getData2)" + call getData_C_bystr(c_loc(f_str)) + ! CALL MOVE_ALLOC(f_str%item, string) + string = trim(buffer) + ! string = c_str + ! len = int(c_len,kind=kind(len)) + ! string_shape(1) = l! int(l,kind=kind(integer)) + ! if(.not. allocated(string)) allocate(character(l) :: string) + ! call c_f_pointer(c_string, string, string_shape) + ! c_string=c_null_ptr + ! print *,len_trim(string), "chars read." + ! print *,string(1:l) + END SUBROUTINE getData2 + + SUBROUTINE getData3(key,string) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_loc + ! character(:),allocatable :: getData2 + character(len=*) :: key + character(len=:),allocatable :: string + character(len=100) :: filename + integer::iostat + ! print *,"reading data (getData2)" + filename = "/var/tmp/"//key + call getData_C_byfile() + open(unit=10, file=trim(filename)//".txt", status='old', action='read', iostat=iostat) + if (iostat /= 0) then + write(*, '(A)', advance='no') "Failed to open the file." + stop + end if + ! Read the content of the file into the string + read(10, '(A)', iostat=iostat) string + if (iostat /= 0) then + write(*, '(A)', advance='no') "Failed to read the file." + stop + end if + + ! Close the file + close(10) + END SUBROUTINE getData3 + + SUBROUTINE set_fortran_string(fstring_ptr, length, str) BIND(C, NAME='set_fortran_string') + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_CHAR, C_INT, C_F_POINTER + TYPE(C_PTR), INTENT(IN), VALUE :: fstring_ptr + INTEGER(C_INT), INTENT(IN), VALUE :: length + CHARACTER(KIND=C_CHAR), INTENT(IN) :: str(length) + ! Fortran pointer to the object referenced by fstring_ptr that + ! holds the deferred length character component. + TYPE(FString), POINTER :: f_str + character(:),allocatable :: string + INTEGER :: i + integer :: string_shape(1) + !**** + ! Associate the Fortran pointer with the object referenced by the + ! C address. + string_shape(1) = length + allocate(character(length) :: string) + CALL C_F_POINTER(fstring_ptr, string,string_shape) + ! Allocate the deferred length component to the given length. + ! deallocate(f_str%item) + ! ALLOCATE(CHARACTER(length) :: f_str%item) + ! Copy over the data. + ! FORALL (i=1:length) f_str%item(i:i) = str(i) + buffer(1:length) = string(1:length) + buffer(length+1:20000) = ' ' + END SUBROUTINE set_fortran_string END Module RedisInterface \ No newline at end of file diff --git a/Redis/Redis_Interface.i90 b/Redis/Redis_Interface.i90 index 32f8fae..048f4bb 100644 --- a/Redis/Redis_Interface.i90 +++ b/Redis/Redis_Interface.i90 @@ -1,6 +1,11 @@ # 1 "/home/admin/SimulationCore2/Redis/Redis_Interface.f90" Module RedisInterface -! use iso_c_binding, only: c_char + use iso_c_binding, only: c_char +! USE Kinds, ONLY: rk, ck + TYPE FString + CHARACTER(KIND=c_char,LEN=:),allocatable :: item + END TYPE FString + character(len=20000)::buffer Interface SUBROUTINE addnums(a, b) BIND(C,name='addnums') USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT @@ -27,6 +32,14 @@ Module RedisInterface type(c_ptr) :: getData_C END FUNCTION getData_C + SUBROUTINE getData_C_bystr(str) BIND(C,name='getData_bystr') + use iso_c_binding, only: c_ptr,c_int,c_char + type(c_ptr) :: str + END SUBROUTINE getData_C_bystr + + SUBROUTINE getData_C_byfile() BIND(C,name='getData_byfile') + END SUBROUTINE getData_C_byfile + SUBROUTINE deallocateData() BIND(C, name='deallocData') END SUBROUTINE deallocateData @@ -40,25 +53,6 @@ Module RedisInterface character(len=*) :: password,address,datakey integer::port,status character(len=:),allocatable::c_address,c_password,c_datakey -! type(json_file) :: jsonfile -! type(json_value),pointer :: jsonvalue,jsonvalue2 -! type(json_core) :: jsoncore - -! call jsonfile%initialize() -! print *,"Initilized: simulation with ",configFilename -! call jsonfile%load_file(configFilename); -! if (jsonfile%failed()) then -! print *,"can not open config file: ",configFilename ; -! stop -! endif -! ! print *,"file read" -! call jsonfile%json_file_get_root(jsonvalue) -! call jsoncore%get(jsonvalue,'redis',jsonvalue2) -! call jsoncore%get(jsonvalue2,"address",address); -! call jsoncore%get(jsonvalue2,"port",port); -! call jsoncore%get(jsonvalue2,"password",password); -! call jsoncore%get(jsonvalue2,"datakey",datakey); - c_datakey = datakey//c_null_char c_password = password//c_null_char c_address = address//c_null_char @@ -90,49 +84,105 @@ Module RedisInterface call setData_C(part,c_str) END SUBROUTINE setInput - SUBROUTINE getData(string) - use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr + SUBROUTINE getData(string,len) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_int ! character(:),allocatable :: getData2 character(:),allocatable :: string integer :: string_shape(1) + integer(c_int):: len type(c_ptr) :: c_string integer::l l = 30000 -! print *,"reading data l=",l - c_string = getData_C(l) -! print *,"data read. l=",l -! len = int(c_len,kind=kind(len)) string_shape(1) = l!int(l,kind=kind(Integer)) + print *,"reading data l=",l if(.not. allocated(string)) then print *,"allocate string" allocate(character(l) :: string) endif + len = l + c_string = getData_C(len) +! print *,"data read. l=",l +! len = int(c_len,kind=kind(len)) call c_f_pointer(c_string, string, string_shape) c_string=c_null_ptr - string = trim(string) +! string = trim(string) ! print *,len_trim(string), "chars read." ! print *,string(1:l) ! getData2=string END SUBROUTINE getData -! SUBROUTINE getData2(string) !result(string) -! use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr -! ! character(:),allocatable :: getData2 -! character(:),allocatable :: string -! integer :: string_shape(1) -! type(c_ptr) :: c_string -! integer::l -! ! print *,"reading data (getData2)" -! c_string = getData_C(l) -! ! string = c_str -! ! len = int(c_len,kind=kind(len)) -! string_shape(1) = l! int(l,kind=kind(integer)) -! if(.not. allocated(string)) allocate(character(l) :: string) -! call c_f_pointer(c_string, string, string_shape) -! c_string=c_null_ptr -! ! print *,len_trim(string), "chars read." -! ! print *,string(1:l) -! ! getData2=string -! END SUBROUTINE getData2 + SUBROUTINE getData2(string) !result(string) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_loc +! character(:),allocatable :: getData2 + character(len=:,kind=c_char),allocatable :: string + integer :: string_shape(1) + type(c_ptr) :: c_string + TYPE(FString), TARGET :: f_str + integer::l +! print *,"reading data (getData2)" + call getData_C_bystr(c_loc(f_str)) +! CALL MOVE_ALLOC(f_str%item, string) + string = trim(buffer) +! string = c_str +! len = int(c_len,kind=kind(len)) +! string_shape(1) = l! int(l,kind=kind(integer)) +! if(.not. allocated(string)) allocate(character(l) :: string) +! call c_f_pointer(c_string, string, string_shape) +! c_string=c_null_ptr +! print *,len_trim(string), "chars read." +! print *,string(1:l) + END SUBROUTINE getData2 + + SUBROUTINE getData3(key,string) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr,c_loc +! character(:),allocatable :: getData2 + character(len=*) :: key + character(len=:),allocatable :: string + character(len=100) :: filename + integer::iostat +! print *,"reading data (getData2)" + filename = "/var/tmp/"//key + call getData_C_byfile() + open(unit=10, file=trim(filename)//".txt", status='old', action='read', iostat=iostat) + if (iostat /= 0) then + write(*, '(A)', advance='no') "Failed to open the file." + stop + end if +! Read the content of the file into the string + read(10, '(A)', iostat=iostat) string + if (iostat /= 0) then + write(*, '(A)', advance='no') "Failed to read the file." + stop + end if + +! Close the file + close(10) + END SUBROUTINE getData3 + + SUBROUTINE set_fortran_string(fstring_ptr, length, str) BIND(C, NAME='set_fortran_string') + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_PTR, C_CHAR, C_INT, C_F_POINTER + TYPE(C_PTR), INTENT(IN), VALUE :: fstring_ptr + INTEGER(C_INT), INTENT(IN), VALUE :: length + CHARACTER(KIND=C_CHAR), INTENT(IN) :: str(length) +! Fortran pointer to the object referenced by fstring_ptr that +! holds the deferred length character component. + TYPE(FString), POINTER :: f_str + character(:),allocatable :: string + INTEGER :: i + integer :: string_shape(1) +!**** +! Associate the Fortran pointer with the object referenced by the +! C address. + string_shape(1) = length + allocate(character(length) :: string) + CALL C_F_POINTER(fstring_ptr, string,string_shape) +! Allocate the deferred length component to the given length. +! deallocate(f_str%item) +! ALLOCATE(CHARACTER(length) :: f_str%item) +! Copy over the data. +! FORALL (i=1:length) f_str%item(i:i) = str(i) + buffer(1:length) = string(1:length) + buffer(length+1:20000) = ' ' + END SUBROUTINE set_fortran_string END Module RedisInterface diff --git a/Redis/redis_io.c b/Redis/redis_io.c index 74fc56f..3f846c6 100644 --- a/Redis/redis_io.c +++ b/Redis/redis_io.c @@ -5,6 +5,9 @@ redisContext *context; char *result,*key; + +extern void set_fortran_string(void* fstring_ptr, int length, const char* str); + void addnums( int* a, int* b ) { int c = (*a) + (*b); /* convert pointers to values, then add them */ @@ -54,18 +57,60 @@ void setData(char *part, char *data) freeReplyObject(reply); } +void getData_bystr(void *s) +{ + redisReply *reply; + reply = redisCommand(context, "GET %s.in",key); + // printf("strlen read from redis: %ld", strlen(reply->str)); + // strncpy(s,reply->str,strlen(reply->str)); + // printf("strlen read from redis: %ld", strlen(result)); + // printf("before free"); + freeReplyObject(reply); + // printf("after free"); + set_fortran_string(s, strlen(reply->str), reply->str); + return; +} + +void getData_byfile() +{ + redisReply *reply; + reply = redisCommand(context, "GET %s.in",key); + char filename[100]; + sprintf(filename,"/var/tmp/%s.txt",key); + printf("filename=%s\n",filename); + FILE* file = fopen(filename, "w"); + if (file == NULL) { + printf("Failed to open the file.\n"); + return; + } + // Write a string to the file + const char* message = "Hello, world!"; + fprintf(file, "%s", message); + // Close the file + fclose(file); + freeReplyObject(reply); + printf("String written to file successfully.\n"); + return; +} + char *getData(int *len) { redisReply *reply; // printf("reading data from redis (key=%s)\n",key); reply = redisCommand(context, "GET %s.in",key); - // printf("data read from redis: %ld chars\n",strlen(reply->str)); + printf("data read from redis: %ld chars\n",strlen(reply->str)); // printf("len(reply->str): %ld\n",strlen(reply->str)); // result = (char*) malloc(strlen(reply->str)); result = (char*) malloc(*len); // printf("after malloc"); strcpy(result,reply->str); - *len = strlen(result); + int paddingLength = (*len) - strlen(reply->str); + printf("len, padding length = %d, %d\n",*len,paddingLength); + if (paddingLength > 0) { + memset(result + strlen(reply->str), ' ', paddingLength-1); + // result[*len-1] = '\0'; + } + *len = strlen(reply->str); // printf("before free"); freeReplyObject(reply); // printf("after free"); diff --git a/Rop/Bit_Database.TXT b/Rop/Bit_Database.TXT new file mode 100644 index 0000000..0820a8d --- /dev/null +++ b/Rop/Bit_Database.TXT @@ -0,0 +1,15 @@ +Bit Class H1 H2 H3 (w/d)max +11 , 1.9 , 7. , 1. , 7. +12 , 1.9 , 7. , 1. , 7. +13 , 1.84 , 6. , 0.8 , 8. +14 , 1.84 , 6. , 0.8 , 8. +21 , 1.8 , 5. , 0.6 , 8.5 +22 , 1.8 , 5. , 0.6 , 8.5 +23 , 1.76 , 4. , 0.48 , 9. +24 , 1.76 , 4. , 0.48 , 9. +31 , 1.7 , 3. , 0.36 , 10. +32 , 1.65 , 2. , 0.26 , 10. +33 , 1.6 , 2. , 0.2 , 10. +34 , 1.6 , 2. , 0.2 , 10. +41 , 1.5 , 2. , 0.18 , 10. +10 , 1.5 , 1. , 0.02 , 10. \ No newline at end of file diff --git a/Rop/Bit_Specification.i90 b/Rop/Bit_Specification.i90 new file mode 100644 index 0000000..3b605ae --- /dev/null +++ b/Rop/Bit_Specification.i90 @@ -0,0 +1,78 @@ +# 1 "/home/admin/SimulationCore2/Rop/Bit_Specification.f90" +subroutine Bit_Specification + + use sROP_Other_Variables + use sROP_Variables + use CStringConfigurationVariables + use SimulationVariables + implicit none + + INTEGER :: io + integer :: i , BitClass_name + real(8) :: rd + +!data%State%ROP_Spec%H1=1.9 +!data%State%ROP_Spec%H2=7. +!data%State%ROP_Spec%H3=1. +!data%State%ROP_Spec%wdmax=7. + + + + data%State%ROP_Spec%BitClass = (data%Configuration%StringConfiguration%BitDefinition%BitCodeHundreds*100)+(data%Configuration%StringConfiguration%BitDefinition%BitCodeTens*10)+data%Configuration%StringConfiguration%BitDefinition%BitCodeOnes + rd = SNGL(data%State%ROP_Spec%BitClass)/10.d0 + data%State%ROP_Spec%BrCoef = ( (SNGL(data%State%ROP_Spec%BitClass)/10.d0)-(DINT(rd)) )*10.d0 + + BitClass_name = (data%State%ROP_Spec%BitClass)/10 + + + + + + if ( (any(BitClass_name==(/11,12,13,14,21,22,23,24,31,32,33,34,41/))) ) then + open(unit=233,file="Bit_Database.TXT") + READ (233,*) + DO i=1,13!(14-1(/=10)) + READ (233,*) data%State%ROP_Spec%name, data%State%ROP_Spec%H1, data%State%ROP_Spec%H2, data%State%ROP_Spec%H3, data%State%ROP_Spec%wdmax + if ( data%State%ROP_Spec%name==BitClass_name ) then + exit + end if + END DO + close (233) + else + data%State%ROP_Spec%H1=1.50d0 + data%State%ROP_Spec%H2=1.0d0 + data%State%ROP_Spec%H3=.020d0 + data%State%ROP_Spec%wdmax=10.0d0 + end if + + + + + +!print*, 'data%State%ROP_Spec%H1=' , data%State%ROP_Spec%H1 +!print*, 'data%State%ROP_Spec%H2=' , data%State%ROP_Spec%H2 +!print*, 'data%State%ROP_Spec%H3=' , data%State%ROP_Spec%H3 +!print*, 'data%State%ROP_Spec%wdmax=' , data%State%ROP_Spec%wdmax +!print*, 'data%State%ROP_Spec%name=' , data%State%ROP_Spec%name + + + + + + +! filename = 'Bit_Database.TXT' +!open (UNIT=3, FILE=filename ) +!!print*, 'data%State%ROP_Spec%wdmax1=' , data%State%ROP_Spec%wdmax +! !print*, 'data%State%ROP_Spec%name1=' , data%State%ROP_Spec%name +!!openif: if ( data%State%ROP_Spec%status == 0 ) then +! read (3,*,IOSTAT=data%State%ROP_Spec%status) ! Get next value +! readloop: do i=1,14 +! read (3,*,IOSTAT=data%State%ROP_Spec%status) data%State%ROP_Spec%name, data%State%ROP_Spec%H1, data%State%ROP_Spec%H2, data%State%ROP_Spec%H3, data%State%ROP_Spec%wdmax ! Get next value +! !print*, 'data%State%ROP_Spec%wdmax=' , data%State%ROP_Spec%wdmax +! !print*, 'data%State%ROP_Spec%name=' , data%State%ROP_Spec%name +! if ( data%State%ROP_Spec%status /= 0 ) exit ! EXIT if not valid. +! if ( data%State%ROP_Spec%name == data%State%ROP_Spec%BitClass/10) exit +! end do readloop +!!endif openif + +end subroutine diff --git a/Simulation/Constants.i90 b/Simulation/Constants.i90 new file mode 100644 index 0000000..13a22f6 --- /dev/null +++ b/Simulation/Constants.i90 @@ -0,0 +1,6 @@ +# 1 "/home/admin/SimulationCore2/Simulation/Constants.f90" +module Constants + real,parameter::PI=3.14159265 + REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000,NU=9e-6 + +end module Constants diff --git a/Simulation/logging.f90 b/Simulation/logging.f90 new file mode 100644 index 0000000..659a9e3 --- /dev/null +++ b/Simulation/logging.f90 @@ -0,0 +1,12 @@ +module logging + integer::log_level=0 + contains + subroutine logg(level,message) + integer::level + character(len=*)::message + + if(log_level>=level) then + print *,message + endif + end subroutine +end module \ No newline at end of file diff --git a/Simulation/logging.i90 b/Simulation/logging.i90 new file mode 100644 index 0000000..610b0c1 --- /dev/null +++ b/Simulation/logging.i90 @@ -0,0 +1,13 @@ +# 1 "/home/admin/SimulationCore2/Simulation/logging.f90" +module logging + integer::log_level=0 + contains + subroutine logg(level,message) + integer::level + character(len=*)::message + + if(log_level>=level) then + print *,message + endif + end subroutine +end module diff --git a/SimulationCore2 b/SimulationCore2 index c5aeaf6..7ae1c2c 100755 Binary files a/SimulationCore2 and b/SimulationCore2 differ diff --git a/Simulator.f90 b/Simulator.f90 index b636938..47104f7 100644 --- a/Simulator.f90 +++ b/Simulator.f90 @@ -67,7 +67,9 @@ module Simulator implicit none type(json_core):: jsoncore integer :: simulationStatus,simulationSpeed,msPerStep,simulationEnd,simulationStep - character(len=:),allocatable::redisInput,redisOutput + character(len=:),allocatable::redisInput + character(len=:),allocatable::redisOutput + character(len=100)::simulationId enum, bind(c) enumerator :: PLAY = 1 enumerator :: PAUSE = 2 @@ -76,7 +78,6 @@ module Simulator end enum contains - FUNCTION time_ms() INTEGER(8) :: time_ms integer,dimension(8)::timearray @@ -90,7 +91,7 @@ module Simulator integer::t0,t1,t2,t3,t_read=0,t_write=0,t_exec=0,i,status,redis_port,stepTime integer(8),dimension(12)::t,t_modules !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + simulationId = sim_id do i=1,size(t_modules) t_modules(i)=0 end do @@ -246,10 +247,11 @@ module Simulator ! end subroutine subroutine write_variables() - use CAccumulator + ! use CAccumulator use json_module implicit none type(json_value),pointer :: jsonroot + ! character(len=:),allocatable::redisInput character(len=10)::str call jsoncore%initialize() @@ -283,7 +285,10 @@ module Simulator type(json_value),pointer :: jsonroot,pval type(json_file) :: jsonfile type(json_core)::json - call getData(redisOutput) + integer::len + ! character(len=:),allocatable::redisOutput + ! call getData3(simulationId,redisOutput) + call getData(redisOutput,len) ! print *,len(redisOutput)," bytes read from redis" open(1,file="redisContent.json",status="REPLACE") write(1,"(A)") redisOutput @@ -291,7 +296,7 @@ module Simulator call jsonfile%initialize() call jsonfile%get_core(json) - call jsonfile%deserialize(redisOutput) + call jsonfile%deserialize(redisOutput(1:len)) call jsonfile%json_file_get_root(jsonroot) ! call json%info(jsonvalue, n_children=n_children) ! print *,"n_children =",n_children @@ -306,21 +311,23 @@ module Simulator call ConfigurationFromJson(jsonfile) call jsonfile%destroy() end subroutine - + subroutine read_variables() type(json_value),pointer :: jsonroot,pval type(json_file) :: jsonfile type(json_core)::json - integer::stat - call getData(redisOutput) - + ! character(len=:),allocatable::redisOutput + integer::stat,leng + ! call getData3(simulationId,redisOutput) + call getData(redisOutput,leng) print *,len(redisOutput)," bytes read from redis" open(1,file="redisContent.json",status="REPLACE") write(1,"(A)") redisOutput close(1) call jsonfile%initialize() call jsonfile%get_core(json) - call jsonfile%deserialize(redisOutput) + print *,"len_trim(redidOutput)=",len_trim(redisOutput) + call jsonfile%deserialize(redisOutput(1:leng)) call jsonfile%json_file_get_root(jsonroot) ! call json%info(jsonvalue, n_children=n_children) ! print *,"n_children =",n_children diff --git a/Simulator.i90 b/Simulator.i90 index afc4e1d..35adf5f 100644 --- a/Simulator.i90 +++ b/Simulator.i90 @@ -68,7 +68,9 @@ module Simulator implicit none type(json_core):: jsoncore integer :: simulationStatus,simulationSpeed,msPerStep,simulationEnd,simulationStep - character(len=:),allocatable::redisInput,redisOutput + character(len=:),allocatable::redisInput + character(len=:),allocatable::redisOutput + character(len=100)::simulationId enum, bind(c) enumerator :: PLAY = 1 enumerator :: PAUSE = 2 @@ -77,7 +79,6 @@ module Simulator end enum contains - FUNCTION time_ms() INTEGER(8) :: time_ms integer,dimension(8)::timearray @@ -91,7 +92,7 @@ module Simulator integer::t0,t1,t2,t3,t_read=0,t_write=0,t_exec=0,i,status,redis_port,stepTime integer(8),dimension(12)::t,t_modules !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - + simulationId = sim_id do i=1,size(t_modules) t_modules(i)=0 end do @@ -247,10 +248,11 @@ module Simulator ! end subroutine subroutine write_variables() - use CAccumulator +! use CAccumulator use json_module implicit none type(json_value),pointer :: jsonroot +! character(len=:),allocatable::redisInput character(len=10)::str call jsoncore%initialize() @@ -284,7 +286,10 @@ module Simulator type(json_value),pointer :: jsonroot,pval type(json_file) :: jsonfile type(json_core)::json - call getData(redisOutput) + integer::len +! character(len=:),allocatable::redisOutput +! call getData3(simulationId,redisOutput) + call getData(redisOutput,len) ! print *,len(redisOutput)," bytes read from redis" open(1,file="redisContent.json",status="REPLACE") write(1,"(A)") redisOutput @@ -292,7 +297,7 @@ module Simulator call jsonfile%initialize() call jsonfile%get_core(json) - call jsonfile%deserialize(redisOutput) + call jsonfile%deserialize(redisOutput(1:len)) call jsonfile%json_file_get_root(jsonroot) ! call json%info(jsonvalue, n_children=n_children) ! print *,"n_children =",n_children @@ -307,21 +312,23 @@ module Simulator call ConfigurationFromJson(jsonfile) call jsonfile%destroy() end subroutine - + subroutine read_variables() type(json_value),pointer :: jsonroot,pval type(json_file) :: jsonfile type(json_core)::json - integer::stat - call getData(redisOutput) - +! character(len=:),allocatable::redisOutput + integer::stat,leng +! call getData3(simulationId,redisOutput) + call getData(redisOutput,leng) print *,len(redisOutput)," bytes read from redis" open(1,file="redisContent.json",status="REPLACE") write(1,"(A)") redisOutput close(1) call jsonfile%initialize() call jsonfile%get_core(json) - call jsonfile%deserialize(redisOutput) + print *,"len_trim(redidOutput)=",len_trim(redisOutput) + call jsonfile%deserialize(redisOutput(1:leng)) call jsonfile%json_file_get_root(jsonroot) ! call json%info(jsonvalue, n_children=n_children) ! print *,"n_children =",n_children diff --git a/TorqueDrag/TD_MainCalculations.i90 b/TorqueDrag/TD_MainCalculations.i90 new file mode 100644 index 0000000..a295aa4 --- /dev/null +++ b/TorqueDrag/TD_MainCalculations.i90 @@ -0,0 +1,122 @@ +# 1 "/home/admin/SimulationCore2/TorqueDrag/TD_MainCalculations.f90" +subroutine TD_MainCalculations + + Use CCasingLinerChokeVariables + Use CStringConfigurationVariables +! Use CSimulationVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + USE FricPressDropVarsModule + USE MudSystemVARIABLES +use SimulationVariables !@@@ + + + implicit none + + Integer :: i +!Integer :: TD_SolDuration +!integer,dimension(8) :: TD_StartTime , TD_EndTime + + + + data%State%TD_General%TimeStep = 0.1d0 ! Unit: [s] +!Call TD_StartUp +!Call TD_WellReadData +!Call TD_WellElementsReadData +!Call TD_DrillStemReadData +!Call TD_PipePropertiesReadData +!!Call TD_WellGeoConfiguration +!!Call TD_WellElementsConfiguration +!!Call TD_StringConnectionModes +!!Call TD_DrillStemConfiguration + + + + +!loop1: do + + + + Call TD_WellGeoConfiguration + Call TD_WellElementsConfiguration + Call TD_StringConnectionModes + Call TD_DrillStemConfiguration + Call TD_ForceReadData + + +!===> Mud properties Read_Data from Fluid Module +!!TD_StringNoHorizontalMudElements = TDNoHorizontalMudElements +!!data%State%TD_String%NoStringMudElements = TDNoStringMudElements +!!data%State%TD_String%NoCasingMudElements = TDNoCasingMudElements +!! +!!if (allocated(TDDensity_MudElementArray) .and. (TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements)/=0) then +!! if (Allocated(data%State%TD_String%FluidMudDensity)) Deallocate(data%State%TD_String%FluidMudDensity) +!! Allocate(data%State%TD_String%FluidMudDensity(TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements)) +!! data%State%TD_String%FluidMudDensity(:) = TDDensity_MudElementArray(:) +!!end if +!! +!!if (allocated(TDXend_MudElementArray)) then +!! if (Allocated(data%State%TD_String%FluidMudEndX)) Deallocate(data%State%TD_String%FluidMudEndX) +!! Allocate(data%State%TD_String%FluidMudEndX(TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements)) +!! data%State%TD_String%FluidMudEndX(:) = TDXend_MudElementArray(:) +!!end if +!! +!!if (allocated(TDXstart_MudElementArray)) then +!! if (Allocated(data%State%TD_String%FluidMudStartX)) Deallocate(data%State%TD_String%FluidMudStartX) +!! Allocate(data%State%TD_String%FluidMudStartX(TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements)) +!! data%State%TD_String%FluidMudStartX(:) = TDXstart_MudElementArray(:) +!!end if + + if (data%State%TD_DrillStem(1)%ComponentType==0) then + Do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + Call TD_MudPropertiesReadData(i) + Call TD_BouyancyFactor(i) + Call TD_CombinedMotionData(i) + End Do + data%State%TD_DrillStems(1)%MudDensityIn = data%State%TD_DrillStems(2)%MudDensityIn !(1): bit mud properties + data%State%TD_DrillStems(1)%MudDensityOut = data%State%TD_DrillStems(2)%MudDensityOut + data%State%TD_DrillStems(1)%MudWeight = data%State%TD_DrillStems(2)%MudWeight + data%State%TD_DrillStems(1)%MudPlasticVis = 5.d0+(5.d0*(data%State%TD_DrillStems(1)%MudWeight-8.3d0)) + data%State%TD_DrillStems(1)%MudViscosity = 0.2d0 !data%State%TD_DrillStems(i)%MudPlasticVis + data%State%TD_DrillStems(1)%MudYieldPoint = 10.d0+(data%State%TD_DrillStems(1)%MudWeight-8.3d0) + Call TD_BouyancyFactor(1) + Call TD_CombinedMotionData(1) + else + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + Call TD_MudPropertiesReadData(i) + Call TD_BouyancyFactor(i) + Call TD_CombinedMotionData(i) + End Do + end if +!================================================ + + + + Call TD_BOPDiamCalculation + + + Call TD_StaticHookLoadCalculation + Call TD_WeightOnBitCalculation + if (abs(data%State%TD_String%DrillStemAxialVelocity)>3.2808d0) then !1[m/s]=3.2808[ft/s] + Call TD_ViscousDragForce + else + data%State%TD_DrillStems%Drag = 0.d0 + data%State%TD_String%DrillStemForceType = 5 + end if + Call TD_ForceCalculation + Call TD_HookLoadCalculation + + + + + + data%State%TD_StConn%HookHeightOld = data%State%TD_StConn%HookHeight + + + + + +end subroutine TD_MainCalculations diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.i90 b/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.i90 new file mode 100644 index 0000000..702aab5 --- /dev/null +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.i90 @@ -0,0 +1,146 @@ +# 1 "/home/admin/SimulationCore2/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90" +subroutine TD_DrillStemReadData + use SimulationVariables + Use CStringConfigurationVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData +! use ConfigurationVariables !@, only: Drawworks + + + implicit none + + + + + Integer :: i + Integer :: TD_FirstIndex , TD_LastIndex + + + + +!==================================================== +! Set Drill Stem Components Data +!==================================================== + data%State%TD_String%StringConfigurationCount = data%Configuration%StringConfiguration%StringConfigurationCount + data%State%TD_String%DrillStemComponentsNumbs = 0 + + +!########## data%State%TD_DrillStem%ComponentType :: +!#Bit_ComponentType = 0 +!#Stabilizer_ComponentType = 1 +!#Collar_ComponentType = 2 +!#DrillPipe_ComponentType = 3 +!#Heavyweight_ComponentType = 4 +!#IBOP = 5 +!#Kelly & SafetyValve (DrillMode) = 6 +!#SafetyValve (TripMode) = 7 + + + if (Allocated(data%State%TD_DrillStem)) deAllocate (data%State%TD_DrillStem) + Allocate (data%State%TD_DrillStem(data%State%TD_String%StringConfigurationCount+100)) + + + Do i=1, data%State%TD_String%StringConfigurationCount + data%State%TD_DrillStem(i)%ComponentType = data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentType + data%State%TD_DrillStem(i)%Numbs = data%Configuration%StringConfiguration%StringConfigurations(i)%NumberOfJoint + data%State%TD_DrillStem(i)%Id = data%Configuration%StringConfiguration%StringConfigurations(i)%NominalId/12.d0 ![ft] + data%State%TD_DrillStem(i)%Od = data%Configuration%StringConfiguration%StringConfigurations(i)%NominalOd/12.d0 ![ft] + data%State%TD_DrillStem(i)%Length = data%Configuration%StringConfiguration%StringConfigurations(i)%LengthPerJoint ![ft] + data%State%TD_DrillStem(i)%WeightperLength = data%Configuration%StringConfiguration%StringConfigurations(i)%WeightPerLength ![lb/ft] + data%State%TD_DrillStem(i)%TotalLength = data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentLength + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+data%Configuration%StringConfiguration%StringConfigurations(i)%NumberOfJoint + +!!=========> Set Separated Drill Stem Components Data +! TD_LastIndex = TD_LastIndex+StringConfigurations(i)%NumberOfJoint +! +! data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%ComponentType = data%State%TD_DrillStem(i)%ComponentType +! data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Id = data%State%TD_DrillStem(i)%Id +! data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Od = data%State%TD_DrillStem(i)%Od +! data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Length = data%State%TD_DrillStem(i)%Length +! data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Weight = data%State%TD_DrillStem(i)%Weight +! +! TD_FirstIndex = TD_LastIndex+1 + End Do + + + + + + +!===> Initial Values of Removed-Volume Variables + if (data%State%TD_DrillStem(1)%ComponentType==0) then + data%State%TD_Vol%PreCount = data%State%TD_String%StringConfigurationCount-1 + else + data%State%TD_Vol%PreCount = data%State%TD_String%StringConfigurationCount + end if + data%State%TD_Vol%PreElementVolume = data%State%TD_DrillStem(data%State%TD_String%StringConfigurationCount)%TotalLength*(((pi*((data%State%TD_DrillStem(data%State%TD_String%StringConfigurationCount)%Id)**2))/4.d0)) ![ft^3] + data%State%TD_Vol%PreElementLength = data%State%TD_DrillStem(data%State%TD_String%StringConfigurationCount)%TotalLength + + + + + + + +!==================================================== +! Set Separated Drill Stem Components Data +!==================================================== + + TD_FirstIndex = 1 + TD_LastIndex = 0 + if (Allocated(data%State%TD_DrillStems)) deAllocate (data%State%TD_DrillStems) + Allocate (data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs+300)) ! +300: because of: Add or Remove DrillStem Components + Call TD_DrillStemStartUp + + + Do i=1, data%State%TD_String%StringConfigurationCount + + TD_LastIndex = TD_LastIndex+data%Configuration%StringConfiguration%StringConfigurations(i)%NumberOfJoint + + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%ComponentType = data%State%TD_DrillStem(i)%ComponentType + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Id = data%State%TD_DrillStem(i)%Id + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Od = data%State%TD_DrillStem(i)%Od + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Area = (pi*((data%State%TD_DrillStem(i)%Od**2)-(data%State%TD_DrillStem(i)%Id**2)))/4.0d0 + + if (data%State%TD_DrillStem(i)%ComponentType == 3 .or. data%State%TD_DrillStem(i)%ComponentType == 4) then + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%RtoolJoint = data%State%TD_DrillStem(i)%Od*1.30d0/2.0d0 + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%ToolJointRange = data%State%TD_String%ToolJointRange + else if (data%State%TD_DrillStem(i)%ComponentType == 1 .or. data%State%TD_DrillStem(i)%ComponentType == 2) then + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%RtoolJoint = data%State%TD_DrillStem(i)%Od/2.0d0 + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%ToolJointRange = data%State%TD_String%ToolJointRange + else if (data%State%TD_DrillStem(i)%ComponentType == 0) then + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%RtoolJoint = data%State%TD_DrillStem(i)%Od + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%ToolJointRange = 0.0d0 + end if + + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Length = data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%LengthIni = data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%WeightperLength= data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStems(TD_FirstIndex:TD_LastIndex)%Weight = data%State%TD_DrillStem(i)%WeightperLength*data%State%TD_DrillStem(i)%Length + + TD_FirstIndex = TD_LastIndex+1 + + End Do + + + + + + + +!==================================================== +! Set Hook Height Data +!==================================================== + data%State%TD_StConn%HookHeightOld = data%State%Drawworks%Hook_Height_ini + data%State%TD_StConn%HookHeight = data%State%TD_StConn%HookHeightOld + + + + + + +end subroutine diff --git a/first_demo.sh b/first_demo.sh new file mode 100755 index 0000000..e5231fb --- /dev/null +++ b/first_demo.sh @@ -0,0 +1 @@ +./SimulationCore2 aberama.iran.liara.ir 32815 4YKFnubfFFjfh4yTK7b0Rg9X 60f8144a-c1b7-4d1a-5d99-08db9e4e35f5 5 \ No newline at end of file diff --git a/redisContent.json b/redisContent.json index 3cd533e..b60d9a0 100644 --- a/redisContent.json +++ b/redisContent.json @@ -1 +1 @@ -{"status":1,"speed":0,"endstep":0,"Configuration":{"StringConfiguration":{"StringConfigurationItems":[{"ComponentLength":1.0,"ComponentType":0,"Grade":null,"LengthPerJoint":1.0,"NominalId":203.0,"NominalOd":0.0,"NominalToolJointOd":0.0,"NumberOfJoint":1.0,"WeightPerLength":74.41},{"ComponentLength":600.0,"ComponentType":2,"Grade":null,"LengthPerJoint":30.0,"NominalId":203.0,"NominalOd":0.0,"NominalToolJointOd":0.0,"NumberOfJoint":20.0,"WeightPerLength":74.41},{"ComponentLength":600.0,"ComponentType":3,"Grade":null,"LengthPerJoint":30.0,"NominalId":228.0,"NominalOd":0.0,"NominalToolJointOd":0.0,"NumberOfJoint":20.0,"WeightPerLength":74.41}],"BitDefenition":{"BitCodeHundreds":1,"BitCodeOnes":3,"BitCodeTens":2,"BitLength":1.0,"BitNozzleNo":3,"BitNozzleSize":355.6,"BitSize":215.9,"BitType":0,"BitWeightPerLength":74.41,"FloatValve":true}},"Formations":[{"Abrasiveness":80.0,"Drillablity":5.0,"PorePressureGradient":10.43,"Thickness":990.0,"ThresholdWeight":0.5,"Top":10.0},{"Abrasiveness":85.0,"Drillablity":30.0,"PorePressureGradient":11.31,"Thickness":600.0,"ThresholdWeight":0.7,"Top":1000.0},{"Abrasiveness":85.0,"Drillablity":30.0,"PorePressureGradient":12.44,"Thickness":1.0,"ThresholdWeight":0.8,"Top":1600.0},{"Abrasiveness":90.0,"Drillablity":15.0,"PorePressureGradient":14.7,"Thickness":200.0,"ThresholdWeight":0.8,"Top":1601.0}],"Reservoir":{"AutoMigrationRate":100.0,"FluidGradient":0.0,"FluidType":0,"FluidViscosity":0.0,"FormationNo":3,"FormationPermeability":500.0,"FormationTop":1601.0,"GeothermalGradient":0.0,"InactiveInflux":false,"IsAutoMigrationRateSelected":false,"MakeKickSinglePacket":false,"PressureGradient":14.7},"Shoe":{"Breakdown":6.21,"FormationNo":0,"FracturePropagation":5.86,"InactiveFracture":false,"LeakOff":6.21,"ShoeDepth":5200.0},"Accumulator":{"AccumulatorMinimumOperatingPressure":8273.0,"AccumulatorSystemSize":1.0,"AirPlungerPumpOutput":1.0,"ElectricPumpOutput":0.0,"NumberOfBottels":20,"OilTankVolume":1.0,"PrechargePressure":6901.0,"StartPressure":19305.0,"StartPressure2":17926.0,"StopPressure":20684.0,"StopPressure2":20070.0},"BopStack":{"AboveAnnularHeight":10.0,"AnnularPreventerClose":2.86,"AnnularPreventerHeight":10.0,"AnnularPreventerOpen":2.25,"AnnularStringDrag":100.0,"BlindRamClose":0.92,"BlindRamHeight":16.24,"BlindRamOpen":0.87,"ChokeClose":0.24,"ChokeLineId":2800.0,"ChokeLineLength":12.0,"ChokeOpen":0.24,"GroundLevel":30.0,"KillClose":0.24,"KillHeight":18.8,"KillOpen":0.24,"LowerRamClose":0.59,"LowerRamHeight":21.35,"LowerRamOpen":0.56,"RamStringDrag":102800.6484375,"UpperRamClose":0.59,"UpperRamHeight":14.632,"UpperRamOpen":0.56},"Hoisting":{"DrillingLineBreakingLoad":0.0,"DriveType":0,"KellyWeight":0.0,"NumberOfLine":0,"TopDriveWeight":0.0,"TravelingBlockWeight":0.0},"Power":{"CementPump":298.0,"Drawworks":604.0,"GeneratorPowerRating":1200.0,"MudPump1":1194.0,"MudPump2":1194.0,"NumberOfgenerators":4,"RotaryTable":604.0,"TopDrive":775.0},"Pumps":{"MudPump1LinerDiameter":6.4,"MudPump1Stroke":120.0,"MudPump1MechanicalEfficiency":0.9,"MudPump1VolumetricEfficiency":6.4,"MudPump1Output":0.12,"MudPump1OutputBblStroke":0.0,"MudPump1Maximum":120.0,"MudPump1ReliefValvePressure":0.9,"MudPump2LinerDiameter":6.4,"MudPump2Stroke":120.0,"MudPump2MechanicalEfficiency":0.9,"MudPump2VolumetricEfficiency":6.4,"MudPump2Output":0.12,"MudPump2OutputBblStroke":0.0,"MudPump2Maximum":120.0,"MudPump2ReliefValvePressure":0.9,"CementPumpLinerDiameter":6.4,"CementPumpStroke":120.0,"CementPumpMechanicalEfficiency":1.0,"CementPumpVolumetricEfficiency":6.4,"CementPumpOutput":0.12,"CementPumpOutputBblStroke":0.0,"CementPumpMaximum":120.0,"CementPumpReliefValvePressure":0.9,"MudPump1ReliefValveIsSet":false,"MudPump2ReliefValveIsSet":false,"CementPumpReliefValveIsSet":false,"ManualPumpPower":false,"Valve1":false,"Valve2":false,"Valve3":false,"Valve4":false,"Valve5":false},"RigSize":{"RigType":0,"CrownHeight":0.0,"MonkeyBoandHeight":0.0,"RigFloorHeight":0.0},"CasingLinerChoke":{"CasingDepth":4100.0,"CasingId":220.5,"CasingOd":243.84,"CasingWeight":69.94,"CasingCollapsePressure":17236.86,"CasingTensileStrength":1270.06,"LinerTopDepth":0.0,"LinerLength":0.0,"LinerId":0.0,"LinerOd":0.0,"LinerWeight":0.0,"LinerCollapsePressure":0.0,"LinerTensileStrength":0.0,"OpenHoleId":215.9,"OpenHoleLength":1776.49},"Path":{"Items":[{"HoleType":0,"Angle":0.0,"Length":2000.0,"FinalAngle":0.0,"TotalLength":2000.0,"MeasuredDepth":2000.0,"TotalVerticalDepth":0.0}]},"Mud":{"ActiveMudType":0,"ActiveRheologyModel":0,"ActiveMudVolume":68.68,"ActiveMudVolumeGal":2884.5600000000004,"ActiveDensity":1269.461181640625,"ActivePlasticViscosity":23.0,"ActiveYieldPoint":18.3,"ActiveThetaThreeHundred":0.0,"ActiveThetaSixHundred":0.0,"ReserveMudType":0,"ReserveMudVolume":63.59,"ReserveMudVolumeGal":0.0,"ReserveDensity":1497.0059814453125,"ReservePlasticViscosity":23.0,"ReserveYieldPoint":21.13,"ReserveThetaThreeHundred":0.0,"ReserveThetaSixHundred":0.0,"ActiveTotalTankCapacity":190.78,"ActiveTotalTankCapacityGal":8012.76,"ActiveSettledContents":0.0,"ActiveSettledContentsGal":0.0,"ActiveTotalContents":0.0,"ActiveTotalContentsGal":0.0,"ActiveAutoDensity":false,"InitialTripTankMudVolume":8.18,"InitialTripTankMudVolumeGal":133.56,"PedalFlowMeter":1600.0}},"Problems":{"BitProblems":{"JetWashout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PlugJets":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"JetWashoutCount":0,"PlugJetsCount":0},"BopProblems":{"AnnularWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPumpFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPumpLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorSystemFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorSystemLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"ChokeProblems":{"HydraulicChoke1Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke1Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke1Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ChokePanelAirFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1PluggedPercent":0,"HydraulicChoke2PluggedPercent":0,"HydraulicChoke1PluggedPercent":0,"ManualChoke2PluggedPercent":0},"DrillStemsProblems":{"StringDragIncrease":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringTorqueIncrease":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringTorqueFluctuation":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringDragIncreaseTime":0.0,"StringTorqueIncreaseTime":0.0},"GaugesProblems":{"WeightIndicator":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RotaryRpm":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RotaryTorque":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipePressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CasingPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump1Strokes":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2Strokes":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ReturnLineTemperature":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"TripTank":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PitGainLoss":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MudTankVolume":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ReturnMudFlow":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"TorqueLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PowerLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManifoldPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigAirPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipe1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipe2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"DrillPipePressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ChokePosition":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CasingPressure2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"HoistingProblems":{"MotorFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ClutchEngage":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ClutchDisengage":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"KickProblems":{"Kick":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"FluidType":0,"FlowRate":0,"OverBalancePressure":0,"IsAutoMigrationRateSelected":false,"AutoMigrationRate":0.0},"LostProblems":{"LostCirculation":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"FlowRate":0.0},"MudTreatmentProblems":{"Degasser":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ShaleShaker":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Desander":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Desilter":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"OtherProblems":{"RigAlarm":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigWaterSupply":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigAir":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen3":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen4":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr3":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr4":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"PumpProblems":{"Pump1PowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump1BlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2PowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2BlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CementPumpPowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CementPumpBlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"RotaryProblems":{"MotorFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"OverideTorqueLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}}},"Equipments":{"BopControl":{"ManifoldPressureGauge":0.0,"AirSupplyPressureGauge":0.0,"AccumulatorPressureGauge":0.0,"AnnularPressureGauge":0.0,"AnnularOpenLED":0,"AnnularCloseLED":0,"UpperRamsOpenLED":0,"UpperRamsCloseLED":0,"MiddleRamsOpenLED":0,"MiddleRamsCloseLED":0,"KillLineOpenLED":0,"KillLineCloseLED":0,"ChokeLineOpenLED":0,"ChokeLineCloseLED":0,"LowerRamsOpenLED":0,"LowerRamsCloseLED":0,"AnnularStatus":0.0,"UpperRamsStatus":0.0,"MiddleRamsStatus":0.0,"LowerRamsStatus":0.0,"AirMasterValve":0.0,"KillLineValve":0.0,"ChokeLineValve":0.0,"UpperRamsValve":0.0,"LowerRamsValve":0.0,"AnnularValve":0.0},"ChokeControl":{"StandPipePressure":0.0,"CasingPressure":0.0,"ChokePosition":0.0,"ChokePanelSPMCounter":0.0,"ChokePanelTotalStrokeCounter":0.0,"Choke1LED":0,"Choke2LED":0,"ChokePanelRigAirSwitch":false,"ChokePanelStrokeResetSwitch":false,"ChokeControlLever":0.0,"ChokePanelPumpSelectorSwitch":0.0},"ChokeManifold":{"HydraulicChock1":0,"HydraulicChock2":0,"HyChock1OnProblem":false,"HyChock2OnProblem":false,"LeftManChokeOnProblem":false,"RightManChokeOnProblem":false,"ChokeManifoldValve1":false,"ChokeManifoldValve2":false,"ChokeManifoldValve3":false,"ChokeManifoldValve4":false,"ChokeManifoldValve5":false,"ChokeManifoldValve6":false,"ChokeManifoldValve7":false,"ChokeManifoldValve8":false,"ChokeManifoldValve9":false,"ChokeManifoldValve10":false,"ChokeManifoldValve11":false,"ChokeManifoldValve12":false,"ChokeManifoldValve13":false,"LeftManualChoke":0.0,"RightManualChoke":0.0},"DataDisplay":{"WOBPointer":0.0,"HookLoadPointer":0.0,"TripTankGauge":0.0,"TripTankAlarmLED":0,"TripTankPumpLED":0,"StandPipePressureGauge":0.0,"CasingPressureGauge":0.0,"MP1SPMGauge":0.0,"MP2SPMGauge":0.0,"ReturnLineTempGauge":0.0,"RotaryTorqueGauge":0.0,"RotaryRPMGauge":0.0,"AcidGasDetectionLED":0,"TotalStrokeCounter":0.0,"PitGainLossGauge":0.0,"MudTanksVolumeGauge":0.0,"MVTAlarmLED":0,"ReturnMudFlowGauge":0.0,"FillStrokeCounter":0.0,"MFFITotalStrokeCounter":0.0,"MFFIAlarmLED":0,"MFFIPumpLED":0,"TotalWellDepth":0.0,"BitDepth":0.0,"HookLoad":0.0,"StandPipePressure":0.0,"CasingPressure":0.0,"MP1SPM":0.0,"MP2SPM":0.0,"RTTorque":0.0,"RTRPM":0.0,"WOP":0.0,"ROP":0.0,"MudWeightIn":0.0,"MudWeightOut":0.0,"Buzzer1":false,"Buzzer2":false,"Buzzer3":false,"Buzzer4":false},"Drilling":{"MP1Throttle":8.0,"MP2Throttle":9.0,"RTThrottle":8.0,"DWThrottle":5.0,"ParkingBrakeLed":false,"GEN1LED":0,"GEN2LED":0,"GEN3LED":0,"GEN4LED":0,"SCR1LED":0,"SCR2LED":0,"SCR3LED":0,"SCR4LED":0,"MP1BLWR":0,"MP2BLWR":0,"DWBLWR":0,"RTBLWR":0,"PWRLIM":0,"PWRLIMMTR":0.0,"RTTorqueLimitGauge":0.0,"AutoDWLED":0,"GEN1BTNLED":0,"GEN2BTNLED":0,"GEN3BTNLED":0,"GEN4BTNLED":0,"OpenKellyCockLed":0,"CloseKellyCockLed":0,"OpenSafetyValveLed":0,"CloseSafetyValveLed":0,"IRSafetyValveLed":0,"IRIBopLed":0,"LatchPipeLED":0,"UnlatchPipeLED":0,"SwingLed":0,"FillMouseHoleLed":0},"Hook":{"HookHeight_S":0.0,"HookHeight":0.0},"StandPipeManifold":{"StandPipeGauge1":0.0,"StandPipeGauge2":0.0,"StandPipeManifoldValve1":false,"StandPipeManifoldValve2":false,"StandPipeManifoldValve3":false,"StandPipeManifoldValve4":false,"StandPipeManifoldValve5":false,"StandPipeManifoldValve6":false,"StandPipeManifoldValve7":false,"StandPipeManifoldValve8":false,"StandPipeManifoldValve9":false,"StandPipeManifoldValve10":false,"StandPipeManifoldValve11":false,"StandPipeManifoldValve12":false,"StandPipeManifoldValve13":false,"StandPipeManifoldValve14":false,"StandPipeManifoldValve15":false},"DrillingWatch":{"Depth":0.0,"BitPosition":0.0,"HookLoad":0.0,"WeightOnBit":0.0,"RPM":0.0,"ROP":0.0,"Torque":0.0,"PumpPressure":0.0,"SPM1":0.0,"SPM2":0.0,"CasingPressure":0.0,"PercentFlow":0.0,"PitGainLose":0.0,"PitVolume":0.0,"KillMudVolume":0.0,"TripTankVolume":0.0,"MudWeightIn":0.0,"FillVolume":0.0,"MudWeightOut":0.0}}} +{"status":1,"speed":0,"endstep":0,"Configuration":{"StringConfiguration":{"StringConfigurationItems":[],"BitDefenition":{"BitCodeHundreds":0,"BitCodeOnes":0,"BitCodeTens":0,"BitLength":0.0,"BitNozzleNo":0,"BitNozzleSize":0.0,"BitSize":0.0,"BitType":0,"BitWeightPerLength":0.0,"FloatValve":false}},"Formations":[],"Reservoir":{"AutoMigrationRate":0.0,"FluidGradient":0.0,"FluidType":0,"FluidViscosity":0.0,"FormationNo":0,"FormationPermeability":0.0,"FormationTop":0.0,"GeothermalGradient":0.0,"InactiveInflux":false,"IsAutoMigrationRateSelected":false,"MakeKickSinglePacket":false,"PressureGradient":0.0},"Shoe":{"Breakdown":0.0,"FormationNo":0,"FracturePropagation":0.0,"InactiveFracture":false,"LeakOff":0.0,"ShoeDepth":0.0},"Accumulator":{"AccumulatorMinimumOperatingPressure":0.0,"AccumulatorSystemSize":0.0,"AirPlungerPumpOutput":0.0,"ElectricPumpOutput":0.0,"NumberOfBottels":0,"OilTankVolume":0.0,"PrechargePressure":0.0,"StartPressure":0.0,"StartPressure2":0.0,"StopPressure":0.0,"StopPressure2":0.0},"BopStack":{"AboveAnnularHeight":0.0,"AnnularPreventerClose":0.0,"AnnularPreventerHeight":0.0,"AnnularPreventerOpen":0.0,"AnnularStringDrag":0.0,"BlindRamClose":0.0,"BlindRamHeight":0.0,"BlindRamOpen":0.0,"ChokeClose":0.0,"ChokeLineId":0.0,"ChokeLineLength":0.0,"ChokeOpen":0.0,"GroundLevel":0.0,"KillClose":0.0,"KillHeight":0.0,"KillOpen":0.0,"LowerRamClose":0.0,"LowerRamHeight":0.0,"LowerRamOpen":0.0,"RamStringDrag":0.0,"UpperRamClose":0.0,"UpperRamHeight":0.0,"UpperRamOpen":0.0},"Hoisting":{"DrillingLineBreakingLoad":0.0,"DriveType":0,"KellyWeight":0.0,"NumberOfLine":0,"TopDriveWeight":0.0,"TravelingBlockWeight":0.0},"Power":{"CementPump":0.0,"Drawworks":0.0,"GeneratorPowerRating":0.0,"MudPump1":0.0,"MudPump2":0.0,"NumberOfgenerators":0,"RotaryTable":0.0,"TopDrive":0.0},"Pumps":{"MudPump1LinerDiameter":0.0,"MudPump1Stroke":0.0,"MudPump1MechanicalEfficiency":0.0,"MudPump1VolumetricEfficiency":0.0,"MudPump1Output":0.0,"MudPump1OutputBblStroke":0.0,"MudPump1Maximum":0.0,"MudPump1ReliefValvePressure":0.0,"MudPump2LinerDiameter":0.0,"MudPump2Stroke":0.0,"MudPump2MechanicalEfficiency":0.0,"MudPump2VolumetricEfficiency":0.0,"MudPump2Output":0.0,"MudPump2OutputBblStroke":0.0,"MudPump2Maximum":0.0,"MudPump2ReliefValvePressure":0.0,"CementPumpLinerDiameter":0.0,"CementPumpStroke":0.0,"CementPumpMechanicalEfficiency":0.0,"CementPumpVolumetricEfficiency":0.0,"CementPumpOutput":0.0,"CementPumpOutputBblStroke":0.0,"CementPumpMaximum":0.0,"CementPumpReliefValvePressure":0.0,"MudPump1ReliefValveIsSet":false,"MudPump2ReliefValveIsSet":false,"CementPumpReliefValveIsSet":false,"ManualPumpPower":false,"Valve1":false,"Valve2":false,"Valve3":false,"Valve4":false,"Valve5":false,"MudPump1MaximumPressure":0.0,"MudPump1PumpRateChange":0.0,"MudPump1SurfaceLineLength":0.0,"MudPump1DelayToShutdown":0.0,"MudPump2MaximumPressure":0.0,"MudPump2PumpRateChange":0.0,"MudPump2SurfaceLineLength":0.0,"MudPump2DelayToShutdown":0.0,"CementPumpMaximumPressure":0.0,"CementPumpPumpRateChange":0.0,"CementPumpSurfaceLineLength":0.0,"CementPumpDelayToShutdown":0.0,"MudPump1VolumetricOutput":0.0,"MudPump2VolumetricOutput":0.0,"CementPumpVolumetricOutput":0.0},"RigSize":{"RigType":0,"CrownHeight":0.0,"MonkeyBoandHeight":0.0,"RigFloorHeight":0.0},"CasingLinerChoke":{"CasingDepth":0.0,"CasingId":0.0,"CasingOd":0.0,"CasingWeight":0.0,"CasingCollapsePressure":0.0,"CasingTensileStrength":0.0,"LinerTopDepth":0.0,"LinerLength":0.0,"LinerId":0.0,"LinerOd":0.0,"LinerWeight":0.0,"LinerCollapsePressure":0.0,"LinerTensileStrength":0.0,"OpenHoleId":0.0,"OpenHoleLength":0.0},"Path":{"Items":[]},"Mud":{"ActiveMudType":0,"ActiveRheologyModel":0,"ActiveMudVolume":0.0,"ActiveMudVolumeGal":0.0,"ActiveDensity":0.0,"ActivePlasticViscosity":0.0,"ActiveYieldPoint":0.0,"ActiveThetaThreeHundred":0.0,"ActiveThetaSixHundred":0.0,"ReserveMudType":0,"ReserveMudVolume":0.0,"ReserveMudVolumeGal":0.0,"ReserveDensity":0.0,"ReservePlasticViscosity":0.0,"ReserveYieldPoint":0.0,"ReserveThetaThreeHundred":0.0,"ReserveThetaSixHundred":0.0,"ActiveTotalTankCapacity":0.0,"ActiveTotalTankCapacityGal":0.0,"ActiveSettledContents":0.0,"ActiveSettledContentsGal":0.0,"ActiveTotalContents":0.0,"ActiveTotalContentsGal":0.0,"ActiveAutoDensity":false,"InitialTripTankMudVolume":0.0,"InitialTripTankMudVolumeGal":0.0,"PedalFlowMeter":0.0}},"Problems":{"BitProblems":{"JetWashout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PlugJets":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"JetWashoutCount":0,"PlugJetsCount":0},"BopProblems":{"AnnularWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"UpperRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MiddleRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamWash":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"LowerRamLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPumpFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPumpLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorSystemFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorSystemLeak":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"ChokeProblems":{"HydraulicChoke1Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke1Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke1Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"HydraulicChoke2Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Plugged":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Fail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke2Washout":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ChokePanelAirFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManualChoke1PluggedPercent":0,"HydraulicChoke2PluggedPercent":0,"HydraulicChoke1PluggedPercent":0,"ManualChoke2PluggedPercent":0},"DrillStemsProblems":{"StringDragIncrease":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringTorqueIncrease":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringTorqueFluctuation":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StringDragIncreaseTime":0.0,"StringTorqueIncreaseTime":0.0},"GaugesProblems":{"WeightIndicator":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RotaryRpm":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RotaryTorque":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipePressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CasingPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump1Strokes":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2Strokes":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ReturnLineTemperature":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"TripTank":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PitGainLoss":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"MudTankVolume":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ReturnMudFlow":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"TorqueLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"PowerLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AccumulatorPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ManifoldPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"AnnularPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigAirPressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipe1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"StandPipe2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"DrillPipePressure":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ChokePosition":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CasingPressure2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"HoistingProblems":{"MotorFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ClutchEngage":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ClutchDisengage":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"KickProblems":{"Kick":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"FluidType":0,"FlowRate":0,"OverBalancePressure":0,"IsAutoMigrationRateSelected":false,"AutoMigrationRate":0.0},"LostProblems":{"LostCirculation":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"FlowRate":0.0},"MudTreatmentProblems":{"Degasser":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"ShaleShaker":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Desander":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Desilter":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"OtherProblems":{"RigAlarm":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigWaterSupply":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"RigAir":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen3":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Gen4":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr1":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr2":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr3":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Scr4":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"PumpProblems":{"Pump1PowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump1BlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2PowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"Pump2BlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CementPumpPowerFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"CementPumpBlowPopOffValve":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}},"RotaryProblems":{"MotorFail":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0},"OverideTorqueLimit":{"ProblemType":0,"StatusType":0,"Value":0.0,"DueValue":0.0}}},"Equipments":{"BopControl":{"ManifoldPressureGauge":0.0,"AirSupplyPressureGauge":0.0,"AccumulatorPressureGauge":0.0,"AnnularPressureGauge":0.0,"AnnularOpenLED":0,"AnnularCloseLED":0,"UpperRamsOpenLED":0,"UpperRamsCloseLED":0,"MiddleRamsOpenLED":0,"MiddleRamsCloseLED":0,"KillLineOpenLED":0,"KillLineCloseLED":0,"ChokeLineOpenLED":0,"ChokeLineCloseLED":0,"LowerRamsOpenLED":0,"LowerRamsCloseLED":0,"AnnularStatus":0.0,"UpperRamsStatus":0.0,"MiddleRamsStatus":0.0,"LowerRamsStatus":0.0,"AirMasterValve":0.0,"KillLineValve":0.0,"ChokeLineValve":0.0,"UpperRamsValve":0.0,"LowerRamsValve":0.0,"AnnularValve":0.0},"ChokeControl":{"StandPipePressure":0.0,"CasingPressure":0.0,"ChokePosition":0.0,"ChokePanelSPMCounter":0.0,"ChokePanelTotalStrokeCounter":0.0,"Choke1LED":0,"Choke2LED":0,"ChokePanelRigAirSwitch":false,"ChokePanelStrokeResetSwitch":false,"ChokeControlLever":0.0,"ChokePanelPumpSelectorSwitch":0.0},"ChokeManifold":{"HydraulicChock1":0,"HydraulicChock2":0,"HyChock1OnProblem":false,"HyChock2OnProblem":false,"LeftManChokeOnProblem":false,"RightManChokeOnProblem":false,"ChokeManifoldValve1":false,"ChokeManifoldValve2":false,"ChokeManifoldValve3":false,"ChokeManifoldValve4":false,"ChokeManifoldValve5":false,"ChokeManifoldValve6":false,"ChokeManifoldValve7":false,"ChokeManifoldValve8":false,"ChokeManifoldValve9":false,"ChokeManifoldValve10":false,"ChokeManifoldValve11":false,"ChokeManifoldValve12":false,"ChokeManifoldValve13":false,"LeftManualChoke":0.0,"RightManualChoke":0.0},"DataDisplay":{"WOBPointer":0.0,"HookLoadPointer":0.0,"TripTankGauge":0.0,"TripTankAlarmLED":0,"TripTankPumpLED":0,"StandPipePressureGauge":0.0,"CasingPressureGauge":0.0,"MP1SPMGauge":0.0,"MP2SPMGauge":0.0,"ReturnLineTempGauge":0.0,"RotaryTorqueGauge":0.0,"RotaryRPMGauge":0.0,"AcidGasDetectionLED":0,"TotalStrokeCounter":0.0,"PitGainLossGauge":0.0,"MudTanksVolumeGauge":0.0,"MVTAlarmLED":0,"MVTSetAlarmSwitch":-1,"ReturnMudFlowGauge":0.0,"FillStrokeCounter":0.0,"MFFITotalStrokeCounter":0.0,"MFFIAlarmLED":0,"MFFISetAlarmSwitch":-1,"MFFIPumpLED":0,"TotalWellDepth":0.0,"BitDepth":0.0,"HookLoad":0.0,"StandPipePressure":0.0,"CasingPressure":0.0,"MP1SPM":0.0,"MP2SPM":0.0,"RTTorque":0.0,"RTRPM":8.0,"WOP":0.0,"ROP":0.0,"MudWeightIn":0.0,"MudWeightOut":0.0,"Buzzer1":false,"Buzzer2":false,"Buzzer3":false,"Buzzer4":false},"Drilling":{"MP1Throttle":0.0,"MP2Throttle":0.0,"RTThrottle":0.0,"DWThrottle":-262.3404255319149,"ParkingBrakeLed":false,"GEN1LED":0,"GEN2LED":0,"GEN3LED":0,"GEN4LED":0,"SCR1LED":0,"SCR2LED":0,"SCR3LED":0,"SCR4LED":0,"MP1BLWR":0,"MP2BLWR":0,"DWBLWR":0,"RTBLWR":0,"PWRLIM":0,"PWRLIMMTR":0.0,"RTTorqueLimitGauge":0.0,"AutoDWLED":0,"GEN1BTNLED":0,"GEN2BTNLED":0,"GEN3BTNLED":0,"GEN4BTNLED":0,"OpenKellyCockLed":0,"CloseKellyCockLed":0,"OpenSafetyValveLed":0,"CloseSafetyValveLed":0,"IRSafetyValveLed":0,"IRIBopLed":0,"LatchPipeLED":0,"UnlatchPipeLED":0,"SwingLed":0,"FillMouseHoleLed":0,"MP1CPSwitch":-1,"MP2CPSwitch":-1,"DWSwitch":-1,"RTSwitch":-1},"Hook":{"HookHeight_S":0.0,"HookHeight":0.0},"StandPipeManifold":{"StandPipeGauge1":0.0,"StandPipeGauge2":0.0,"StandPipeManifoldValve1":false,"StandPipeManifoldValve2":false,"StandPipeManifoldValve3":false,"StandPipeManifoldValve4":false,"StandPipeManifoldValve5":false,"StandPipeManifoldValve6":false,"StandPipeManifoldValve7":false,"StandPipeManifoldValve8":false,"StandPipeManifoldValve9":false,"StandPipeManifoldValve10":false,"StandPipeManifoldValve11":false,"StandPipeManifoldValve12":false,"StandPipeManifoldValve13":false,"StandPipeManifoldValve14":false,"StandPipeManifoldValve15":false},"DrillingWatch":{"Depth":0.0,"BitPosition":0.0,"HookLoad":0.0,"WeightOnBit":0.0,"RPM":0.0,"ROP":0.0,"Torque":0.0,"PumpPressure":0.0,"SPM1":0.0,"SPM2":0.0,"CasingPressure":0.0,"PercentFlow":0.0,"PitGainLose":0.0,"PitVolume":0.0,"KillMudVolume":0.0,"TripTankVolume":0.0,"MudWeightIn":0.0,"FillVolume":0.0,"MudWeightOut":0.0}}}