From 847a018906d2290a0485b8884a5c58598247d15b Mon Sep 17 00:00:00 2001 From: mahmood19227 Date: Sat, 1 Jul 2023 09:46:12 +0330 Subject: [PATCH] Now can read and write on redis --- .gitignore | 23 +- .../BasicInputs/Bha/CStringConfiguration.f90 | 104 +- .../Bha/CStringConfigurationVariables.f90 | 104 +- .../BasicInputs/CMudPropertiesVariables.f90 | 162 +- CSharp/BasicInputs/Geology/CFormation.f90 | 64 +- .../Geology/CFormationVariables.f90 | 40 +- CSharp/BasicInputs/Geology/CReservoir.f90 | 70 +- .../Geology/CReservoirVariables.f90 | 48 +- CSharp/BasicInputs/Geology/CShoe.f90 | 58 +- CSharp/BasicInputs/Geology/CShoeVariables.f90 | 26 +- .../Geology/creservoirvariables.mod | Bin 605 -> 0 bytes CSharp/BasicInputs/MudProperties.f90 | 180 +- .../RigSpecifications/CAccumulator.f90 | 60 +- .../CAccumulatorVariables.f90 | 34 +- .../RigSpecifications/CBopStack.f90 | 88 +- .../RigSpecifications/CBopStackVariables.f90 | 58 +- .../RigSpecifications/CHoisting.f90 | 58 +- .../RigSpecifications/CHoistingVariables.f90 | 34 +- .../BasicInputs/RigSpecifications/CPower.f90 | 64 +- .../RigSpecifications/CPowerVariables.f90 | 30 +- .../BasicInputs/RigSpecifications/CPumps.f90 | 396 +-- .../RigSpecifications/CPumpsVariables.f90 | 118 +- .../RigSpecifications/CRigSize.f90 | 54 +- .../RigSpecifications/CRigSizeVariables.f90 | 28 +- .../WellProfile/CCasingLinerChoke.f90 | 78 +- .../CCasingLinerChokeVariables.f90 | 50 +- .../WellProfile/CPathGeneration.f90 | 88 +- .../WellProfile/CPathGenerationVariables.f90 | 58 +- .../WellProfile/CWellSurveyData.f90 | 66 +- .../WellProfile/CWellSurveyDataVariables.f90 | 44 +- CSharp/Common/CCommon.f90 | 98 +- CSharp/Common/CCommonVariables.f90 | 30 +- CSharp/Common/CIActionReference.f90 | 108 +- CSharp/Common/CQuery.f90 | 32 +- CSharp/Common/CScaleRange.f90 | 32 +- CSharp/Common/CTimer.f90 | 106 +- CSharp/Common/CTimerLegacy.f90 | 54 +- CSharp/DownHole/CDownHoleActions.f90 | 208 +- CSharp/DownHole/CDownHoleTypes.f90 | 102 +- CSharp/DownHole/CDownHoleVariables.f90 | 84 +- CSharp/DownHole/DownHole.f90 | 406 +-- .../ControlPanels/CBopControlPanel.f90 | 170 +- .../CBopControlPanelVariables.f90 | 80 +- .../ControlPanels/CChokeControlPanel.f90 | 322 +- .../CChokeControlPanelVariables.f90 | 44 +- .../ControlPanels/CChokeManifold.f90 | 80 +- .../ControlPanels/CChokeManifoldVariables.f90 | 70 +- .../ControlPanels/CDataDisplayConsole.f90 | 304 +- .../CDataDisplayConsoleVariables.f90 | 210 +- .../ControlPanels/CDrillingConsole.f90 | 1744 +++++------ .../CDrillingConsoleVariables.f90 | 264 +- .../ControlPanels/CEquipmentsConstants.f90 | 20 +- CSharp/Equipments/ControlPanels/CHook.f90 | 128 +- .../Equipments/ControlPanels/CHookActions.f90 | 30 +- .../ControlPanels/CHookVariables.f90 | 30 +- .../ControlPanels/CStandPipeManifold.f90 | 412 +-- .../CStandPipeManifoldVariables.f90 | 54 +- .../ControlPanels/CTopDrivePanel.f90 | 432 +-- .../ControlPanels/CTopDrivePanelVariables.f90 | 86 +- .../DrillWatch/CDrillWatchVariables.f90 | 66 +- .../MudPathFinding/CArrangement.f90 | 272 +- .../Equipments/MudPathFinding/CManifolds.f90 | 2790 ++++++++--------- CSharp/Equipments/MudPathFinding/CPath.f90 | 460 +-- .../MudPathFinding/CPathChangeEvents.f90 | 22 +- CSharp/Equipments/MudPathFinding/CStack.f90 | 82 +- CSharp/Equipments/Tanks/CTanks.f90 | 38 +- CSharp/Equipments/Tanks/CTanksVariables.f90 | 56 +- CSharp/ErrorLog/CError.f90 | 604 ++-- CSharp/ErrorLog/CLog1.f90 | 224 +- CSharp/ErrorLog/CLog2.f90 | 224 +- CSharp/ErrorLog/CLog3.f90 | 224 +- CSharp/ErrorLog/CLog4.f90 | 224 +- CSharp/ErrorLog/CLog5.f90 | 224 +- .../Common/COperationScenariosMain.f90 | 922 +++--- .../Common/COperationScenariosSettings.f90 | 976 +++--- .../Common/COperationScenariosVariables.f90 | 89 +- .../Common/OperationScenarios.f90 | 508 +-- .../Enums/CElevatorConnectionEnum.f90 | 1242 ++++---- .../Enums/CTdsElevatorModesEnum.f90 | 662 ++-- .../CCloseKellyCockLedNotification.f90 | 150 +- .../CCloseSafetyValveLedNotification.f90 | 220 +- .../CFillMouseHoleLedNotification.f90 | 120 +- .../Notifications/CIrIBopLedNotification.f90 | 238 +- .../CIrSafetyValveLedNotification.f90 | 326 +- .../Notifications/CLatchLedNotification.f90 | 500 +-- .../COpenKellyCockLedNotification.f90 | 126 +- .../COpenSafetyValveLedNotification.f90 | 214 +- .../Notifications/CSlipsNotification.f90 | 266 +- .../Notifications/CSwingLedNotification.f90 | 242 +- .../Notifications/CTdsIbopLedNotification.f90 | 142 +- .../CTdsPowerLedNotification.f90 | 96 +- .../CTdsTorqueWrenchLedNotification.f90 | 116 +- .../Notifications/CTongNotification.f90 | 572 ++-- .../Notifications/CUnlatchLedNotification.f90 | 430 +-- .../Notifications/NotificationVariables.f90 | 48 +- .../{Notofications.f90 => Notifications.f90} | 816 ++--- .../Permissions/CFillupHeadPermission.f90 | 106 +- .../CInstallFillupHeadPermission.f90 | 150 +- .../CInstallMudBucketPermission.f90 | 70 +- .../Permissions/CIrIbopPermission.f90 | 184 +- .../Permissions/CIrSafetyValvePermission.f90 | 172 +- .../CRemoveFillupHeadPermission.f90 | 70 +- .../CRemoveMudBucketPermission.f90 | 66 +- .../Permissions/CSwingDrillPermission.f90 | 120 +- .../Permissions/CSwingOffPermission.f90 | 132 +- .../Permissions/CSwingTiltPermission.f90 | 106 +- .../Permissions/Permissions.f90 | 374 +-- .../Permissions/PermissionsVariables.f90 | 30 +- CSharp/OperationScenarios/SoftwareInputs.f90 | 173 + .../SoftwareInputsVariables.f90 | 18 + .../SoftwareOutputsVariables.f90 | 0 .../OperationScenarios/Unity/CUnityInputs.f90 | 1040 +++--- .../Unity/CUnityOutputs.f90 | 1188 +++---- .../UnitySignals/CBucketEnum.f90 | 146 +- .../UnitySignals/CElevatorEnum.f90 | 94 +- .../UnitySignals/CFlowKellyDisconnectEnum.f90 | 56 +- .../UnitySignals/CFlowPipeDisconnectEnum.f90 | 56 +- .../UnitySignals/CHeadEnum.f90 | 358 +-- .../UnitySignals/CIbopEnum.f90 | 64 +- .../UnitySignals/CKellyEnum.f90 | 136 +- .../UnitySignals/CMouseHoleEnum.f90 | 80 +- .../UnitySignals/COperationConditionEnum.f90 | 360 +-- .../UnitySignals/CSafetyValveEnum.f90 | 62 +- .../UnitySignals/CSlipsEnum.f90 | 314 +- .../UnitySignals/CSlipsEnumVariables.f90 | 78 +- .../UnitySignals/CSwingEnum.f90 | 468 +-- .../UnitySignals/CTdsBackupClamp.f90 | 116 +- .../UnitySignals/CTdsSpineEnum.f90 | 126 +- .../UnitySignals/CTdsSwingEnum.f90 | 286 +- .../UnitySignals/CTdsTongEnum.f90 | 130 +- .../UnitySignals/CTongEnum.f90 | 306 +- .../UnitySignals/UnitySignals.f90 | 978 +++--- .../UnitySignals/UnitySignalsVariables.f90 | 282 +- CSharp/Problems/CBitProblems.f90 | 139 +- CSharp/Problems/CBitProblemsVariables.f90 | 28 +- CSharp/Problems/CBopProblems.f90 | 497 +-- CSharp/Problems/CBopProblemsVariables.f90 | 348 +- CSharp/Problems/CChokeProblems.f90 | 473 +-- CSharp/Problems/CChokeProblemsVariables.f90 | 58 +- CSharp/Problems/CDrillStemProblems.f90 | 144 +- .../Problems/CDrillStemProblemsVariables.f90 | 32 +- CSharp/Problems/CGaugesProblems.f90 | 709 +++-- CSharp/Problems/CGaugesProblemsVariables.f90 | 64 +- CSharp/Problems/CHoistingProblems.f90 | 157 +- .../Problems/CHoistingProblemsVariables.f90 | 32 +- CSharp/Problems/CKickProblems.f90 | 125 +- CSharp/Problems/CKickProblemsVariables.f90 | 34 +- CSharp/Problems/CLostProblems.f90 | 111 +- CSharp/Problems/CLostProblemsVariables.f90 | 32 +- CSharp/Problems/CMudTreatmentProblems.f90 | 197 +- .../CMudTreatmentProblemsVariables.f90 | 32 +- CSharp/Problems/COtherProblems.f90 | 362 ++- CSharp/Problems/COtherProblemsVariables.f90 | 68 +- CSharp/Problems/CProblemDifinition.f90 | 174 +- CSharp/Problems/CPumpProblems.f90 | 265 +- CSharp/Problems/CPumpProblemsVariables.f90 | 36 +- CSharp/Problems/CRotaryProblems.f90 | 147 +- CSharp/Problems/CRotaryProblemsVariables.f90 | 26 +- .../CStudentStationVariables.f90 | 28 +- CSharp/Warnings/CWarnings.f90 | 1134 +++---- CSharp/Warnings/CWarningsVariables.f90 | 64 +- Common/DynamicDoubleArray.f90 | 312 +- Common/DynamicIntegerArray.f90 | 316 +- Common/DynamicLogicalArray.f90 | 314 +- Common/DynamicRealArray.f90 | 314 +- Data Structures.txt | 268 +- Equipments/BopStack/ANNULAR.f90 | 856 ++--- Equipments/BopStack/AnnularMain.f90 | 70 +- Equipments/BopStack/BOP.f90 | 606 ++-- Equipments/BopStack/BOPstartup.f90 | 648 ++-- Equipments/BopStack/BlindRamsMain.f90 | 174 +- Equipments/BopStack/BopStackMain.f90 | 16 +- Equipments/BopStack/CHOKE_LINE.f90 | 618 ++-- Equipments/BopStack/ChokeLineMain.f90 | 162 +- Equipments/BopStack/KILL_LINE.f90 | 618 ++-- Equipments/BopStack/KillLineMain.f90 | 70 +- Equipments/BopStack/LOSS_INPUTS.f90 | 2532 +++++++-------- Equipments/BopStack/PIPE_RAM1.f90 | 762 ++--- Equipments/BopStack/PIPE_RAM2.f90 | 794 ++--- Equipments/BopStack/PipeRams1Main.f90 | 156 +- Equipments/BopStack/PipeRams2Main.f90 | 156 +- Equipments/BopStack/SHEAR_RAM.f90 | 550 ++-- Equipments/BopStack/VARIABLES.f90 | 358 +-- .../ChokeControl/AirPump_Choke_Subs.f90 | 674 ++-- Equipments/ChokeControl/CHOKE.f90 | 278 +- Equipments/ChokeControl/CHOKE_VARIABLES.f90 | 154 +- Equipments/ChokeControl/ChokeControlMain.f90 | 174 +- Equipments/ChokeControl/ChokeStartup.f90 | 252 +- Equipments/Drawworks/DWFixModeMotion.f90 | 34 +- .../Drawworks/DWMalfunction_MotorFailure.f90 | 46 +- Equipments/Drawworks/DrawworksMain.f90 | 62 +- Equipments/Drawworks/Drawworks_Direction.f90 | 302 +- Equipments/Drawworks/Drawworks_INPUTS.f90 | 416 +-- Equipments/Drawworks/Drawworks_MainSolver.f90 | 122 +- Equipments/Drawworks/Drawworks_Outputs.f90 | 78 +- Equipments/Drawworks/Drawworks_Solver.f90 | 566 ++-- .../Drawworks/Drawworks_Solver_OffMode.f90 | 494 +-- Equipments/Drawworks/Drawworks_StartUp.f90 | 112 +- Equipments/Drawworks/Drawworks_VARIABLES.f90 | 108 +- Equipments/DrillingConsole_ScrLEDs.f90 | 100 +- Equipments/MudSystem/MudSystem.f90 | 8 +- Equipments/Pumps/Pump1_MainSolver.f90 | 112 +- Equipments/Pumps/Pump2_MainSolver.f90 | 112 +- Equipments/Pumps/Pump3_MainSolver.f90 | 80 +- Equipments/Pumps/Pump_OffMode_Solver.f90 | 90 +- Equipments/Pumps/Pump_OnMode_Solver.f90 | 64 +- Equipments/Pumps/PumpsMain.f90 | 442 +-- Equipments/Pumps/Pumps_Inputs.f90 | 222 +- Equipments/Pumps/Pumps_MainSolver.f90 | 50 +- Equipments/Pumps/Pumps_Outputs.f90 | 190 +- Equipments/Pumps/Pumps_StartUp.f90 | 96 +- Equipments/Pumps/Pumps_TotalSolver.f90 | 26 +- Equipments/Pumps/Pumps_VARIABLES.f90 | 94 +- Equipments/RotaryTable/RTable_INPUTS.f90 | 158 +- .../RotaryTable/RTable_OffModeSolver.f90 | 122 +- .../RotaryTable/RTable_OnModeSolver.f90 | 100 +- Equipments/RotaryTable/RTable_Outputs.f90 | 62 +- Equipments/RotaryTable/RTable_StartUp.f90 | 62 +- Equipments/RotaryTable/RTable_VARIABLES.f90 | 78 +- Equipments/RotaryTable/RotaryTableMain.f90 | 94 +- Equipments/RotaryTable/Rtable_MainSolver.f90 | 132 +- Equipments/TopDrive/TopDriveMain.f90 | 128 +- Equipments/TopDrive/TopDrive_INPUTS.f90 | 88 +- Equipments/TopDrive/TopDrive_MainSolver.f90 | 164 +- Equipments/TopDrive/TopDrive_OffMode.f90 | 76 +- Equipments/TopDrive/TopDrive_Outputs.f90 | 46 +- Equipments/TopDrive/TopDrive_Solver.f90 | 494 +-- Equipments/TopDrive/TopDrive_StartUp.f90 | 62 +- Equipments/TopDrive/TopDrive_VARIABLES.f90 | 80 +- FluidFlow/Pressure_Distribution_VARIABLES.f90 | 364 +-- Geo/GeoMain.f90 | 148 +- Makefile | 419 +++ README.md | 6 +- ReadMe.txt | 50 +- Redis/Redis_Interface.f90 | 58 + Redis/example_redis.c | 145 + Redis/redis_io.c | 57 + Redis_Interface.o | Bin 0 -> 1120 bytes Rop/Bit_Database.txt | 28 +- Rop/Bit_Specification.f90 | 152 +- Rop/JetImpactForce.f90 | 62 +- Rop/ROP_MainCalculation.f90 | 486 +-- Rop/RopMain.f90 | 38 +- Rop/sROP_Other_Variables.f90 | 80 +- Rop/sROP_Variables.f90 | 28 +- Simulation/CSounds.f90 | 1368 ++++---- Simulation/Constants.f90 | 8 +- Simulation/SimulationVariables.f90 | 424 +-- SimulationCore2 | Bin 0 -> 3162856 bytes SimulationCore2.f90 | 64 +- SimulationCore2.sln | 72 +- SimulationCore2.vfproj | 804 ++--- Simulator.f90 | 399 ++- Test/TestRedis.f90 | 56 +- Test/a.out | Bin 0 -> 590304 bytes Test/redis_io.c | 7 + Test/redis_io.o | Bin 0 -> 1568 bytes Test/redisinterface.mod | Bin 0 -> 599 bytes Test/test.cpp | 8 + Test/test.f90 | 18 + Test/test_redis.f90 | 38 + Text1.txt | 10 +- .../MeshGeneration_FluidModule.f90 | 1030 +++--- .../TD_DrillingSubs/TD_AddComponents.f90 | 630 ++-- .../TD_DrillingSubs/TD_BOPDiamCalculation.f90 | 360 +-- .../TD_DrillStemConfiguration.f90 | 640 ++-- .../TD_DrillingSubs/TD_RemoveComponents.f90 | 720 ++--- .../TD_StringConnectionModes.f90 | 1666 +++++----- .../TD_WellElementsConfiguration.f90 | 54 +- .../TD_WellGeoConfiguration.f90 | 102 +- TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 | 154 +- TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 | 62 +- .../TD_Forces/TD_BuildArea/TD_ForceDownB.f90 | 128 +- .../TD_BuildArea/TD_ForceDownBRot.f90 | 110 +- .../TD_Forces/TD_BuildArea/TD_ForceUpB.f90 | 148 +- .../TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 | 110 +- .../TD_Forces/TD_CombinedMotionData.f90 | 40 +- .../TD_Forces/TD_DropArea/TD_ForceDownD.f90 | 120 +- .../TD_DropArea/TD_ForceDownDRot.f90 | 110 +- .../TD_Forces/TD_DropArea/TD_ForceUpD.f90 | 136 +- .../TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 | 108 +- TorqueDrag/TD_Forces/TD_ForceCalculation.f90 | 274 +- .../TD_Forces/TD_HookLoadCalculation.f90 | 576 ++-- .../TD_StaticHookLoadCalculation.f90 | 140 +- .../TD_StraightArea/TD_ForceDownS.f90 | 126 +- .../TD_StraightArea/TD_ForceDownSRot.f90 | 118 +- .../TD_Forces/TD_StraightArea/TD_ForceUpS.f90 | 128 +- .../TD_StraightArea/TD_ForceUpSRot.f90 | 116 +- TorqueDrag/TD_Forces/TD_StrainCalculation.f90 | 106 +- TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 | 84 +- .../TD_ViscousDragForce.f90 | 350 +-- .../TD_Forces/TD_WeightOnBitCalculation.f90 | 80 +- TorqueDrag/TD_MainCalculations.f90 | 240 +- .../TD_Modules/GeoElements_FluidModule.f90 | 114 +- TorqueDrag/TD_Modules/TD_DrillStem.f90 | 220 +- TorqueDrag/TD_Modules/TD_GeneralData.f90 | 98 +- .../TD_Modules/TD_StringConnectionData.f90 | 84 +- TorqueDrag/TD_Modules/TD_WellElements.f90 | 134 +- TorqueDrag/TD_Modules/TD_WellGeometry.f90 | 64 +- .../TD_DrillStemReadData.f90 | 288 +- .../TD_ForceReadData.f90 | 116 +- .../TD_MudPropertiesReadData.f90 | 192 +- .../TD_PipePropertiesReadData.f90 | 50 +- .../TD_WellElementsReadData.f90 | 264 +- .../TD_WellReadData.f90 | 220 +- TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 | 160 +- TorqueDrag/TD_StartUp/TD_StartUp.f90 | 314 +- TorqueDrag/TorqueDragMain.f90 | 92 +- a.out | Bin 0 -> 311672 bytes config.json | 26 +- data.json | 643 +++- dependencies.txt | 1 + example_redis.c | 145 + helper.ipynb | 1041 +++++- hier.txt | 202 +- include/alloc.h | 96 + include/async.h | 152 + include/async_private.h | 75 + include/dict.h | 125 + include/fmacros.h | 14 + include/hiredis.h | 366 +++ include/hiredis_ssl.h | 163 + include/net.h | 56 + include/read.h | 129 + include/sds.h | 280 ++ include/sdsalloc.h | 44 + include/sockcompat.h | 95 + include/win32.h | 56 + lib/.json_module.F90.cflags.heritage | 1 + lib/json_file_module.mod | Bin 0 -> 223440 bytes lib/json_file_module.o | Bin 0 -> 651000 bytes lib/json_kinds.mod | Bin 0 -> 2229 bytes lib/json_kinds.o | Bin 0 -> 1408 bytes lib/json_module.mod | Bin 0 -> 3279 bytes lib/json_module.o | Bin 0 -> 2104 bytes lib/json_parameters.mod | Bin 0 -> 13236 bytes lib/json_parameters.o | Bin 0 -> 1560 bytes lib/json_string_utilities.mod | Bin 0 -> 9367 bytes lib/json_string_utilities.o | Bin 0 -> 45392 bytes lib/json_value_module.mod | Bin 0 -> 145155 bytes lib/json_value_module.o | Bin 0 -> 350640 bytes lib/libhiredis.a | Bin 0 -> 581706 bytes lib/libhiredis.so | Bin 0 -> 316040 bytes lib/libjsonfortran.a | Bin 0 -> 1069858 bytes redis_io.h | 1 + redis_io.o | Bin 0 -> 1568 bytes redisinterface.mod | Bin 0 -> 599 bytes runtest | Bin 0 -> 16056 bytes sredis/client.F90 | 1794 ----------- sredis/client/aggregation_interfaces.inc | 173 - sredis/client/client_dataset_interfaces.inc | 85 - sredis/client/client_interfaces.inc | 151 - sredis/client/ensemble_interfaces.inc | 56 - sredis/client/misc_tensor_interfaces.inc | 67 - sredis/client/model_interfaces.inc | 258 -- sredis/client/put_tensor_interfaces.inc | 43 - sredis/client/put_tensor_methods_common.inc | 50 - sredis/client/script_interfaces.inc | 187 -- sredis/client/unpack_tensor_interfaces.inc | 44 - .../client/unpack_tensor_methods_common.inc | 45 - sredis/dataset.F90 | 425 --- sredis/dataset/add_meta_scalar_common.inc | 40 - sredis/dataset/add_tensor_interfaces.inc | 43 - sredis/dataset/add_tensor_methods_common.inc | 50 - sredis/dataset/dataset_interfaces.inc | 36 - sredis/dataset/get_meta_scalars_common.inc | 39 - sredis/dataset/metadata_interfaces.inc | 71 - .../unpack_dataset_tensor_interfaces.inc | 44 - .../unpack_dataset_tensor_methods_common.inc | 45 - sredis/enum_fortran.inc | 79 - sredis/fortran_c_interop.F90 | 87 - test.json | 504 +-- test.mod | Bin 0 -> 589 bytes 373 files changed, 40126 insertions(+), 39315 deletions(-) delete mode 100644 CSharp/BasicInputs/Geology/creservoirvariables.mod rename CSharp/OperationScenarios/Notifications/{Notofications.f90 => Notifications.f90} (84%) create mode 100644 CSharp/OperationScenarios/SoftwareInputs.f90 create mode 100644 CSharp/OperationScenarios/SoftwareInputsVariables.f90 delete mode 100644 CSharp/OperationScenarios/SoftwareOutputsVariables.f90 create mode 100644 Makefile create mode 100644 Redis/Redis_Interface.f90 create mode 100644 Redis/example_redis.c create mode 100644 Redis/redis_io.c create mode 100644 Redis_Interface.o create mode 100644 SimulationCore2 create mode 100644 Test/a.out create mode 100644 Test/redis_io.c create mode 100644 Test/redis_io.o create mode 100644 Test/redisinterface.mod create mode 100644 Test/test.cpp create mode 100644 Test/test.f90 create mode 100644 Test/test_redis.f90 create mode 100644 a.out create mode 100644 dependencies.txt create mode 100644 example_redis.c create mode 100644 include/alloc.h create mode 100644 include/async.h create mode 100644 include/async_private.h create mode 100644 include/dict.h create mode 100644 include/fmacros.h create mode 100644 include/hiredis.h create mode 100644 include/hiredis_ssl.h create mode 100644 include/net.h create mode 100644 include/read.h create mode 100644 include/sds.h create mode 100644 include/sdsalloc.h create mode 100644 include/sockcompat.h create mode 100644 include/win32.h create mode 100644 lib/.json_module.F90.cflags.heritage create mode 100644 lib/json_file_module.mod create mode 100644 lib/json_file_module.o create mode 100644 lib/json_kinds.mod create mode 100644 lib/json_kinds.o create mode 100644 lib/json_module.mod create mode 100644 lib/json_module.o create mode 100644 lib/json_parameters.mod create mode 100644 lib/json_parameters.o create mode 100644 lib/json_string_utilities.mod create mode 100644 lib/json_string_utilities.o create mode 100644 lib/json_value_module.mod create mode 100644 lib/json_value_module.o create mode 100644 lib/libhiredis.a create mode 100644 lib/libhiredis.so create mode 100644 lib/libjsonfortran.a create mode 100644 redis_io.h create mode 100644 redis_io.o create mode 100644 redisinterface.mod create mode 100644 runtest delete mode 100644 sredis/client.F90 delete mode 100644 sredis/client/aggregation_interfaces.inc delete mode 100644 sredis/client/client_dataset_interfaces.inc delete mode 100644 sredis/client/client_interfaces.inc delete mode 100644 sredis/client/ensemble_interfaces.inc delete mode 100644 sredis/client/misc_tensor_interfaces.inc delete mode 100644 sredis/client/model_interfaces.inc delete mode 100644 sredis/client/put_tensor_interfaces.inc delete mode 100644 sredis/client/put_tensor_methods_common.inc delete mode 100644 sredis/client/script_interfaces.inc delete mode 100644 sredis/client/unpack_tensor_interfaces.inc delete mode 100644 sredis/client/unpack_tensor_methods_common.inc delete mode 100644 sredis/dataset.F90 delete mode 100644 sredis/dataset/add_meta_scalar_common.inc delete mode 100644 sredis/dataset/add_tensor_interfaces.inc delete mode 100644 sredis/dataset/add_tensor_methods_common.inc delete mode 100644 sredis/dataset/dataset_interfaces.inc delete mode 100644 sredis/dataset/get_meta_scalars_common.inc delete mode 100644 sredis/dataset/metadata_interfaces.inc delete mode 100644 sredis/dataset/unpack_dataset_tensor_interfaces.inc delete mode 100644 sredis/dataset/unpack_dataset_tensor_methods_common.inc delete mode 100644 sredis/enum_fortran.inc delete mode 100644 sredis/fortran_c_interop.F90 create mode 100644 test.mod diff --git a/.gitignore b/.gitignore index 89b12dd..f8d6f67 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,13 @@ -################################################################################ -# This .gitignore file was automatically created by Microsoft(R) Visual Studio. -################################################################################ - -/.vs/SimulationCore2/FileContentIndex -/.vs/SimulationCore2/v17 -/.vs -/x64 -/x64/Debug -*.rar +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/.vs/SimulationCore2/FileContentIndex +/.vs/SimulationCore2/v17 +/.vs +/x64 +/x64/Debug +*.rar +/mod +/obj +./*.mod \ No newline at end of file diff --git a/CSharp/BasicInputs/Bha/CStringConfiguration.f90 b/CSharp/BasicInputs/Bha/CStringConfiguration.f90 index f301dcd..215d557 100644 --- a/CSharp/BasicInputs/Bha/CStringConfiguration.f90 +++ b/CSharp/BasicInputs/Bha/CStringConfiguration.f90 @@ -1,53 +1,53 @@ -module CStringConfiguration - use CStringConfigurationVariables - use SimulationVariables - use json_module - - implicit none - public - contains - - subroutine StringConfigurationToJson(parent) - - type(json_value),pointer :: parent - type(json_core) :: json - type(json_value),pointer :: pitems,pitem,pbit,p - integer:: i - ! 1. create new node - call json%create_object(p,'StringConfiguration') - call json%create_array(pitems,'StringConfigurationItems') - - ! 2. add member of data type to new node - do i=1,data%Configuration%StringConfiguration%StringConfigurationCount - call json%create_object(pitem,'StringConfigurationItem') - call json%add(pitem,"ComponentLength",data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentLength) - call json%add(pitem,"ComponentType",data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentType) - call json%add(pitem,"Grade",data%Configuration%StringConfiguration%StringConfigurations(i)%Grade) - call json%add(pitem,"LengthPerJoint",data%Configuration%StringConfiguration%StringConfigurations(i)%LengthPerJoint) - call json%add(pitem,"NominalId",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalId) - call json%add(pitem,"NominalOd",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalOd) - call json%add(pitem,"NominalToolJointOd",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalToolJointOd) - call json%add(pitem,"NumberOfJoint",data%Configuration%StringConfiguration%StringConfigurations(i)%NumberOfJoint) - call json%add(pitem,"WeightPerLength",data%Configuration%StringConfiguration%StringConfigurations(i)%WeightPerLength) - call json%add(pitems,pitem) - end do - call json%create_object(pbit,"BitDefenition") - call json%add(pbit,"BitCodeHundreds",data%Configuration%StringConfiguration%BitDefinition%BitCodeHundreds) - call json%add(pbit,"BitCodeOnes",data%Configuration%StringConfiguration%BitDefinition%BitCodeOnes) - call json%add(pbit,"BitCodeTens",data%Configuration%StringConfiguration%BitDefinition%BitCodeTens) - call json%add(pbit,"BitLength",data%Configuration%StringConfiguration%BitDefinition%BitLength) - call json%add(pbit,"BitNozzleNo",data%Configuration%StringConfiguration%BitDefinition%BitNozzleNo) - call json%add(pbit,"BitNozzleSize",data%Configuration%StringConfiguration%BitDefinition%BitNozzleSize) - call json%add(pbit,"BitSize",data%Configuration%StringConfiguration%BitDefinition%BitSize) - call json%add(pbit,"BitType",data%Configuration%StringConfiguration%BitDefinition%BitType) - call json%add(pbit,"BitWeightPerLength",data%Configuration%StringConfiguration%BitDefinition%BitWeightPerLength) - call json%add(pbit,"FloatValve",data%Configuration%StringConfiguration%BitDefinition%FloatValve) - - ! call json%add(p,"StringConfigurationCount",dat%Configuration%StringConfiguration%StringConfigurationCount) - ! 3. add new node to parent - call json%add(p,pitems) - call json%add(p,pbit) - call json%add(parent,p) - end subroutine - +module CStringConfiguration + use CStringConfigurationVariables + use SimulationVariables + use json_module + + implicit none + public + contains + + subroutine StringConfigurationToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: pitems,pitem,pbit,p + integer:: i + ! 1. create new node + call json%create_object(p,'StringConfiguration') + call json%create_array(pitems,'StringConfigurationItems') + + ! 2. add member of data type to new node + do i=1,data%Configuration%StringConfiguration%StringConfigurationCount + call json%create_object(pitem,'StringConfigurationItem') + call json%add(pitem,"ComponentLength",data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentLength) + call json%add(pitem,"ComponentType",data%Configuration%StringConfiguration%StringConfigurations(i)%ComponentType) + call json%add(pitem,"Grade",data%Configuration%StringConfiguration%StringConfigurations(i)%Grade) + call json%add(pitem,"LengthPerJoint",data%Configuration%StringConfiguration%StringConfigurations(i)%LengthPerJoint) + call json%add(pitem,"NominalId",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalId) + call json%add(pitem,"NominalOd",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalOd) + call json%add(pitem,"NominalToolJointOd",data%Configuration%StringConfiguration%StringConfigurations(i)%NominalToolJointOd) + call json%add(pitem,"NumberOfJoint",data%Configuration%StringConfiguration%StringConfigurations(i)%NumberOfJoint) + call json%add(pitem,"WeightPerLength",data%Configuration%StringConfiguration%StringConfigurations(i)%WeightPerLength) + call json%add(pitems,pitem) + end do + call json%create_object(pbit,"BitDefenition") + call json%add(pbit,"BitCodeHundreds",data%Configuration%StringConfiguration%BitDefinition%BitCodeHundreds) + call json%add(pbit,"BitCodeOnes",data%Configuration%StringConfiguration%BitDefinition%BitCodeOnes) + call json%add(pbit,"BitCodeTens",data%Configuration%StringConfiguration%BitDefinition%BitCodeTens) + call json%add(pbit,"BitLength",data%Configuration%StringConfiguration%BitDefinition%BitLength) + call json%add(pbit,"BitNozzleNo",data%Configuration%StringConfiguration%BitDefinition%BitNozzleNo) + call json%add(pbit,"BitNozzleSize",data%Configuration%StringConfiguration%BitDefinition%BitNozzleSize) + call json%add(pbit,"BitSize",data%Configuration%StringConfiguration%BitDefinition%BitSize) + call json%add(pbit,"BitType",data%Configuration%StringConfiguration%BitDefinition%BitType) + call json%add(pbit,"BitWeightPerLength",data%Configuration%StringConfiguration%BitDefinition%BitWeightPerLength) + call json%add(pbit,"FloatValve",data%Configuration%StringConfiguration%BitDefinition%FloatValve) + + ! call json%add(p,"StringConfigurationCount",dat%Configuration%StringConfiguration%StringConfigurationCount) + ! 3. add new node to parent + call json%add(p,pitems) + call json%add(p,pbit) + call json%add(parent,p) + end subroutine + end module CStringConfiguration \ No newline at end of file diff --git a/CSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 b/CSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 index e38c074..d3106a4 100644 --- a/CSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 +++ b/CSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 @@ -1,53 +1,53 @@ -module CStringConfigurationVariables - ! !@use ConfigurationVariables, only: Configuration - implicit none - public - !constants - integer :: Bit_ComponentType = 0 - integer :: Stabilizer_ComponentType = 1 - integer :: Collar_ComponentType = 2 - integer :: DrillPipe_ComponentType = 3 - integer :: Heavyweight_ComponentType = 4 - - integer :: Cone_BitType = 0 - integer :: PDC_BitType = 1 - integer :: Rock_BitType = 2 - - - - ! types - ! Pipe Items in String Array - type, bind(c), public :: CStringItem - integer :: ComponentType - real(8) :: NumberOfJoint - real(8) :: LengthPerJoint - real(8) :: NominalOd - real(8) :: NominalId - real(8) :: WeightPerLength - real(8) :: ComponentLength - real(8) :: NominalToolJointOd - character(1) :: Grade - end type CStringItem - - ! types - ! Pipe Items in String Array - type, bind(c), public :: CBitInfo - integer :: BitType - real(8) :: BitSize - integer :: BitCodeHundreds - integer :: BitCodeTens - integer :: BitCodeOnes - real(8) :: BitNozzleSize - real(8) :: BitLength - real(8) :: BitWeightPerLength - integer :: BitNozzleNo - logical :: FloatValve - end type CBitInfo - - Type :: StringConfigurationType - integer :: StringConfigurationCount = 0 - type(CStringItem), allocatable :: StringConfigurations(:) - type(CBitInfo) :: BitDefinition - End type StringConfigurationType - contains +module CStringConfigurationVariables + ! !@use ConfigurationVariables, only: Configuration + implicit none + public + !constants + integer :: Bit_ComponentType = 0 + integer :: Stabilizer_ComponentType = 1 + integer :: Collar_ComponentType = 2 + integer :: DrillPipe_ComponentType = 3 + integer :: Heavyweight_ComponentType = 4 + + integer :: Cone_BitType = 0 + integer :: PDC_BitType = 1 + integer :: Rock_BitType = 2 + + + + ! types + ! Pipe Items in String Array + type, bind(c), public :: CStringItem + integer :: ComponentType + real(8) :: NumberOfJoint + real(8) :: LengthPerJoint + real(8) :: NominalOd + real(8) :: NominalId + real(8) :: WeightPerLength + real(8) :: ComponentLength + real(8) :: NominalToolJointOd + character(1) :: Grade + end type CStringItem + + ! types + ! Pipe Items in String Array + type, bind(c), public :: CBitInfo + integer :: BitType + real(8) :: BitSize + integer :: BitCodeHundreds + integer :: BitCodeTens + integer :: BitCodeOnes + real(8) :: BitNozzleSize + real(8) :: BitLength + real(8) :: BitWeightPerLength + integer :: BitNozzleNo + logical :: FloatValve + end type CBitInfo + + Type :: StringConfigurationType + integer :: StringConfigurationCount = 0 + type(CStringItem), allocatable :: StringConfigurations(:) + type(CBitInfo) :: BitDefinition + End type StringConfigurationType + contains end module CStringConfigurationVariables \ No newline at end of file diff --git a/CSharp/BasicInputs/CMudPropertiesVariables.f90 b/CSharp/BasicInputs/CMudPropertiesVariables.f90 index 8fd6727..75f6f76 100644 --- a/CSharp/BasicInputs/CMudPropertiesVariables.f90 +++ b/CSharp/BasicInputs/CMudPropertiesVariables.f90 @@ -1,82 +1,82 @@ -module CMudPropertiesVariables - use CIActionReference - !**use CDoubleEventHandlerCollection - implicit none - public - !constants - integer, parameter :: WaterBase_MudType = 0 - integer, parameter :: OilBase_MudType = 1 - integer, parameter :: PowerLaw_RheologyModel = 0 - integer, parameter :: Bingham_RheologyModel = 1 - integer, parameter :: Newtonian_RheologyModel = 2 - INTEGER, PARAMETER :: Herschel_Bulkley_RheologyModel = 3 - - ! variables - Type::MudPropertiesType - integer :: ActiveMudType - integer :: ActiveRheologyModel - real(8) :: ActiveMudVolume - real(8) :: ActiveMudVolumeGal - real(8) :: ActiveDensity - real(8) :: ActivePlasticViscosity - real(8) :: ActiveYieldPoint - real(8) :: ActiveThetaThreeHundred - real(8) :: ActiveThetaSixHundred - - integer :: ReserveMudType - real(8) :: ReserveMudVolume - real(8) :: ReserveMudVolumeGal - real(8) :: ReserveDensity - real(8) :: ReservePlasticViscosity - real(8) :: ReserveYieldPoint - real(8) :: ReserveThetaThreeHundred - real(8) :: ReserveThetaSixHundred - - real(8) :: ActiveTotalTankCapacity - real(8) :: ActiveTotalTankCapacityGal - real(8) :: ActiveSettledContents - real(8) :: ActiveSettledContentsGal - real(8) :: ActiveTotalContents - real(8) :: ActiveTotalContentsGal - logical :: ActiveAutoDensity - real(8) :: InitialTripTankMudVolume - real(8) :: InitialTripTankMudVolumeGal - real(8) :: PedalFlowMeter - End type MudPropertiesType -! Type(MudPropertiesType)::MudProperties - - - - ! subroutine SubscribeActiveMudVolume(a) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveMudVolume - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveMudVolume' :: SubscribeActiveMudVolume - ! implicit none - ! procedure (ActionDouble) :: a - ! ActiveMudVolumePtr => a - ! end subroutine - - ! subroutine SubscribeActiveDensity(a) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveDensity - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveDensity' :: SubscribeActiveDensity - ! implicit none - ! procedure (ActionDouble) :: a - ! ActiveDensityPtr => a - ! end subroutine - - ! subroutine SubscribeReserveMudVolume(a) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveMudVolume - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveMudVolume' :: SubscribeReserveMudVolume - ! implicit none - ! procedure (ActionDouble) :: a - ! ReserveMudVolumePtr => a - ! end subroutine - - ! subroutine SubscribeReserveDensity(a) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveDensity - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveDensity' :: SubscribeReserveDensity - ! implicit none - ! procedure (ActionDouble) :: a - ! ReserveDensityPtr => a - ! end subroutine - +module CMudPropertiesVariables + use CIActionReference + !**use CDoubleEventHandlerCollection + implicit none + public + !constants + integer, parameter :: WaterBase_MudType = 0 + integer, parameter :: OilBase_MudType = 1 + integer, parameter :: PowerLaw_RheologyModel = 0 + integer, parameter :: Bingham_RheologyModel = 1 + integer, parameter :: Newtonian_RheologyModel = 2 + INTEGER, PARAMETER :: Herschel_Bulkley_RheologyModel = 3 + + ! variables + Type::MudPropertiesType + integer :: ActiveMudType + integer :: ActiveRheologyModel + real(8) :: ActiveMudVolume + real(8) :: ActiveMudVolumeGal + real(8) :: ActiveDensity + real(8) :: ActivePlasticViscosity + real(8) :: ActiveYieldPoint + real(8) :: ActiveThetaThreeHundred + real(8) :: ActiveThetaSixHundred + + integer :: ReserveMudType + real(8) :: ReserveMudVolume + real(8) :: ReserveMudVolumeGal + real(8) :: ReserveDensity + real(8) :: ReservePlasticViscosity + real(8) :: ReserveYieldPoint + real(8) :: ReserveThetaThreeHundred + real(8) :: ReserveThetaSixHundred + + real(8) :: ActiveTotalTankCapacity + real(8) :: ActiveTotalTankCapacityGal + real(8) :: ActiveSettledContents + real(8) :: ActiveSettledContentsGal + real(8) :: ActiveTotalContents + real(8) :: ActiveTotalContentsGal + logical :: ActiveAutoDensity + real(8) :: InitialTripTankMudVolume + real(8) :: InitialTripTankMudVolumeGal + real(8) :: PedalFlowMeter + End type MudPropertiesType +! Type(MudPropertiesType)::MudProperties + + + + ! subroutine SubscribeActiveMudVolume(a) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveMudVolume + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveMudVolume' :: SubscribeActiveMudVolume + ! implicit none + ! procedure (ActionDouble) :: a + ! ActiveMudVolumePtr => a + ! end subroutine + + ! subroutine SubscribeActiveDensity(a) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeActiveDensity + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeActiveDensity' :: SubscribeActiveDensity + ! implicit none + ! procedure (ActionDouble) :: a + ! ActiveDensityPtr => a + ! end subroutine + + ! subroutine SubscribeReserveMudVolume(a) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveMudVolume + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveMudVolume' :: SubscribeReserveMudVolume + ! implicit none + ! procedure (ActionDouble) :: a + ! ReserveMudVolumePtr => a + ! end subroutine + + ! subroutine SubscribeReserveDensity(a) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeReserveDensity + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeReserveDensity' :: SubscribeReserveDensity + ! implicit none + ! procedure (ActionDouble) :: a + ! ReserveDensityPtr => a + ! end subroutine + end module CMudPropertiesVariables \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CFormation.f90 b/CSharp/BasicInputs/Geology/CFormation.f90 index 2595349..24bdc3a 100644 --- a/CSharp/BasicInputs/Geology/CFormation.f90 +++ b/CSharp/BasicInputs/Geology/CFormation.f90 @@ -1,33 +1,33 @@ -module CFormation - use CFormationVariables - use SimulationVariables - use json_module - implicit none - - contains - - subroutine FormationToJson(parent) - - type(json_value),pointer :: parent - type(json_core) :: json - type(json_value),pointer :: p,pform - integer :: i - - ! 1. create new node - call json%create_array(p,'Fromations') - - do i=1,data%Configuration%Formation%Count - call json%create_object(pform,'') - call json%add(pform,"Abrasiveness",data%Configuration%Formation%Formations(i)%Abrasiveness) - call json%add(pform,"Drillablity",data%Configuration%Formation%Formations(i)%Drillablity) - call json%add(pform,"PorePressureGradient",data%Configuration%Formation%Formations(i)%PorePressureGradient) - call json%add(pform,"Thickness",data%Configuration%Formation%Formations(i)%Thickness) - call json%add(pform,"ThresholdWeight",data%Configuration%Formation%Formations(i)%ThresholdWeight) - call json%add(pform,"Top",data%Configuration%Formation%Formations(i)%Top) - call json%add(p,pform) - end do - - call json%add(parent,p) - end subroutine - +module CFormation + use CFormationVariables + use SimulationVariables + use json_module + implicit none + + contains + + subroutine FormationToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p,pform + integer :: i + + ! 1. create new node + call json%create_array(p,'Formations') + + do i=1,data%Configuration%Formation%Count + call json%create_object(pform,'') + call json%add(pform,"Abrasiveness",data%Configuration%Formation%Formations(i)%Abrasiveness) + call json%add(pform,"Drillablity",data%Configuration%Formation%Formations(i)%Drillablity) + call json%add(pform,"PorePressureGradient",data%Configuration%Formation%Formations(i)%PorePressureGradient) + call json%add(pform,"Thickness",data%Configuration%Formation%Formations(i)%Thickness) + call json%add(pform,"ThresholdWeight",data%Configuration%Formation%Formations(i)%ThresholdWeight) + call json%add(pform,"Top",data%Configuration%Formation%Formations(i)%Top) + call json%add(p,pform) + end do + + call json%add(parent,p) + end subroutine + end module CFormation \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CFormationVariables.f90 b/CSharp/BasicInputs/Geology/CFormationVariables.f90 index abfb91f..dbcdfbf 100644 --- a/CSharp/BasicInputs/Geology/CFormationVariables.f90 +++ b/CSharp/BasicInputs/Geology/CFormationVariables.f90 @@ -1,21 +1,21 @@ -module CFormationVariables - ! !@use ConfigurationVariables, only: Configuration - implicit none - public - - ! types - ! Pipe Items in String Array - type, bind(c), public :: CFormationItem - real(8) :: Top - real(8) :: Thickness - real(8) :: Drillablity - real(8) :: Abrasiveness - real(8) :: ThresholdWeight - real(8) :: PorePressureGradient - end type CFormationItem - - Type::FormationType - integer :: Count = 0 - type(CFormationItem), allocatable :: Formations(:) - End type FormationType +module CFormationVariables + ! !@use ConfigurationVariables, only: Configuration + implicit none + public + + ! types + ! Pipe Items in String Array + type, bind(c), public :: CFormationItem + real(8) :: Top + real(8) :: Thickness + real(8) :: Drillablity + real(8) :: Abrasiveness + real(8) :: ThresholdWeight + real(8) :: PorePressureGradient + end type CFormationItem + + Type::FormationType + integer :: Count = 0 + type(CFormationItem), allocatable :: Formations(:) + End type FormationType end module CFormationVariables \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CReservoir.f90 b/CSharp/BasicInputs/Geology/CReservoir.f90 index 0f281d4..52b56d1 100644 --- a/CSharp/BasicInputs/Geology/CReservoir.f90 +++ b/CSharp/BasicInputs/Geology/CReservoir.f90 @@ -1,36 +1,36 @@ -module CReservoir - use SimulationVariables - use json_module - implicit none - - contains - - subroutine ReservoirToJson(parent) - - type(json_value),pointer :: parent - type(json_core) :: json - type(json_value),pointer :: p - - ! 1. create new node - call json%create_object(p,'Reservoir') - - ! 2. add member of data type to new node - ! call StringConfigurationToJson(p) - ! call FormationToJson(p) - call json%add(p,"AutoMigrationRate",data%Configuration%Reservoir%AutoMigrationRate) - call json%add(p,"FluidGradient",data%Configuration%Reservoir%FluidGradient) - call json%add(p,"FluidType",data%Configuration%Reservoir%FluidType) - call json%add(p,"FluidViscosity",data%Configuration%Reservoir%FluidViscosity) - call json%add(p,"FormationNo",data%Configuration%Reservoir%FormationNo) - call json%add(p,"FormationPermeability",data%Configuration%Reservoir%FormationPermeability) - call json%add(p,"FormationTop",data%Configuration%Reservoir%FormationTop) - call json%add(p,"GeothermalGradient",data%Configuration%Reservoir%GeothermalGradient) - call json%add(p,"InactiveInflux",data%Configuration%Reservoir%InactiveInflux) - call json%add(p,"IsAutoMigrationRateSelected",data%Configuration%Reservoir%IsAutoMigrationRateSelected) - call json%add(p,"MakeKickSinglePacket",data%Configuration%Reservoir%MakeKickSinglePacket) - call json%add(p,"PressureGradient",data%Configuration%Reservoir%PressureGradient) - - ! 3. add new node to parent - call json%add(parent,p) - end subroutine +module CReservoir + use SimulationVariables + use json_module + implicit none + + contains + + subroutine ReservoirToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'Reservoir') + + ! 2. add member of data type to new node + ! call StringConfigurationToJson(p) + ! call FormationToJson(p) + call json%add(p,"AutoMigrationRate",data%Configuration%Reservoir%AutoMigrationRate) + call json%add(p,"FluidGradient",data%Configuration%Reservoir%FluidGradient) + call json%add(p,"FluidType",data%Configuration%Reservoir%FluidType) + call json%add(p,"FluidViscosity",data%Configuration%Reservoir%FluidViscosity) + call json%add(p,"FormationNo",data%Configuration%Reservoir%FormationNo) + call json%add(p,"FormationPermeability",data%Configuration%Reservoir%FormationPermeability) + call json%add(p,"FormationTop",data%Configuration%Reservoir%FormationTop) + call json%add(p,"GeothermalGradient",data%Configuration%Reservoir%GeothermalGradient) + call json%add(p,"InactiveInflux",data%Configuration%Reservoir%InactiveInflux) + call json%add(p,"IsAutoMigrationRateSelected",data%Configuration%Reservoir%IsAutoMigrationRateSelected) + call json%add(p,"MakeKickSinglePacket",data%Configuration%Reservoir%MakeKickSinglePacket) + call json%add(p,"PressureGradient",data%Configuration%Reservoir%PressureGradient) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine end module CReservoir \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CReservoirVariables.f90 b/CSharp/BasicInputs/Geology/CReservoirVariables.f90 index bf200ed..fad94f7 100644 --- a/CSharp/BasicInputs/Geology/CReservoirVariables.f90 +++ b/CSharp/BasicInputs/Geology/CReservoirVariables.f90 @@ -1,25 +1,25 @@ -module CReservoirVariables - implicit none - public - !constants - integer :: Gas_FluidType = 0 - integer :: Oil_FluidType = 1 - integer :: Water_FluidType = 2 - - Type :: ReservoirType - ! variables - integer :: FormationNo - real(8) :: FormationTop - real(8) :: PressureGradient - real(8) :: FormationPermeability - real(8) :: GeothermalGradient - integer :: FluidType - real(8) :: FluidGradient - real(8) :: FluidViscosity - logical :: InactiveInflux - logical :: IsAutoMigrationRateSelected - real(8) :: AutoMigrationRate - logical :: MakeKickSinglePacket - End type ReservoirType - Type(ReservoirType)::Reservoir +module CReservoirVariables + implicit none + public + !constants + ! integer :: Gas_FluidType = 0 + ! integer :: Oil_FluidType = 1 + ! integer :: Water_FluidType = 2 + + Type :: ReservoirType + ! variables + integer :: FormationNo + real(8) :: FormationTop + real(8) :: PressureGradient + real(8) :: FormationPermeability + real(8) :: GeothermalGradient + integer :: FluidType + real(8) :: FluidGradient + real(8) :: FluidViscosity + logical :: InactiveInflux + logical :: IsAutoMigrationRateSelected + real(8) :: AutoMigrationRate + logical :: MakeKickSinglePacket + End type ReservoirType + Type(ReservoirType)::Reservoir end module CReservoirVariables \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CShoe.f90 b/CSharp/BasicInputs/Geology/CShoe.f90 index b0a3c66..32b47f6 100644 --- a/CSharp/BasicInputs/Geology/CShoe.f90 +++ b/CSharp/BasicInputs/Geology/CShoe.f90 @@ -1,30 +1,30 @@ -module CShoe - use SimulationVariables - use json_module - - implicit none - public - contains - - subroutine ShoeToJson(parent) - - type(json_value),pointer :: parent - type(json_core) :: json - type(json_value),pointer :: p - - ! 1. create new node - call json%create_object(p,'Shoe') - - ! 2. add member of data type to new node - call json%add(p,"Breakdown",data%Configuration%Shoe%Breakdown) - call json%add(p,"FormationNo",data%Configuration%Shoe%FormationNo) - call json%add(p,"FracturePropagation",data%Configuration%Shoe%FracturePropagation) - call json%add(p,"InactiveFracture",data%Configuration%Shoe%InactiveFracture) - call json%add(p,"LeakOff",data%Configuration%Shoe%LeakOff) - call json%add(p,"ShoeDepth",data%Configuration%Shoe%ShoeDepth) - - ! 3. add new node to parent - call json%add(parent,p) - end subroutine - +module CShoe + use SimulationVariables + use json_module + + implicit none + public + contains + + subroutine ShoeToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'Shoe') + + ! 2. add member of data type to new node + call json%add(p,"Breakdown",data%Configuration%Shoe%Breakdown) + call json%add(p,"FormationNo",data%Configuration%Shoe%FormationNo) + call json%add(p,"FracturePropagation",data%Configuration%Shoe%FracturePropagation) + call json%add(p,"InactiveFracture",data%Configuration%Shoe%InactiveFracture) + call json%add(p,"LeakOff",data%Configuration%Shoe%LeakOff) + call json%add(p,"ShoeDepth",data%Configuration%Shoe%ShoeDepth) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + end module CShoe \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/CShoeVariables.f90 b/CSharp/BasicInputs/Geology/CShoeVariables.f90 index 58daacc..c075aef 100644 --- a/CSharp/BasicInputs/Geology/CShoeVariables.f90 +++ b/CSharp/BasicInputs/Geology/CShoeVariables.f90 @@ -1,14 +1,14 @@ -module CShoeVariables - implicit none - public - ! variables - Type::ShoeType - integer :: FormationNo - real(8) :: ShoeDepth - real(8) :: LeakOff - real(8) :: Breakdown - real(8) :: FracturePropagation - logical :: InactiveFracture - End type ShoeType - Type(ShoeType)::Shoe +module CShoeVariables + implicit none + public + ! variables + Type::ShoeType + integer :: FormationNo + real(8) :: ShoeDepth + real(8) :: LeakOff + real(8) :: Breakdown + real(8) :: FracturePropagation + logical :: InactiveFracture + End type ShoeType + Type(ShoeType)::Shoe end module CShoeVariables \ No newline at end of file diff --git a/CSharp/BasicInputs/Geology/creservoirvariables.mod b/CSharp/BasicInputs/Geology/creservoirvariables.mod deleted file mode 100644 index 25e4892d502361337c4836dab4be66dddb0a6f71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmV-j0;2sNiwFP!000001J#z>j@mE~hVT6pa~HVS%Hd4!*p#BE5Kv(0O{A4K7}h0; zBRiqx?K@#f%OOzqAVeiXGLu;P{M+MydS8d`#O*i`%2^t4SaGF=jKDDK2Kb7zgwJ5E zWC;FeZ=~c8?kC!tj_rXr7U6)2D7&WtOK_AW75A+1GgGm5&$RIEC{FS79+!b!tUb%+ znyZx*YRZ&gPXX7T=50z!r80cPkK_+!f{z7P1q_xZG87B70mgrBfPwSea;izjAS}h{FaLh&FUv^RrP8~-$S`4DcO_s3~Sbv z7WJeQDkqRBRFC>D3N^CZ=uoI1_Y@Qw2PRITNly7Ch1Q`#QD`3-0tJ(j!m}6On8$}5 rW-H|Uxq_cmPn9sf! 0) then - ! deallocate(WellSurveyData%Items) - ! end if - ! if(count > 0) then - ! allocate(WellSurveyData%Items(count)) - ! do i = 1, count - ! item => array(i) - ! WellSurveyData%Items(i)%MeasuredDepth = item%MeasuredDepth - ! WellSurveyData%Items(i)%Inclination = item%Inclination - ! WellSurveyData%Items(i)%Azimoth = item%Azimoth - ! WellSurveyData%Items(i)%TotalVerticalDepth = item%TotalVerticalDepth - ! WellSurveyData%Items(i)%X = item%X - ! WellSurveyData%Items(i)%Y = item%Y - ! WellSurveyData%Items(i)%Z = item%Z - ! end do - ! end if - - ! SetSurveyData = 0 - ! end function SetSurveyData +module CWellSurveyData + use CWellSurveyDataVariables + implicit none + public + contains + ! integer function SetSurveyData(count, array) + ! !DEC$ ATTRIBUTES DLLEXPORT::SetSurveyData + ! !DEC$ ATTRIBUTES ALIAS: 'SetSurveyData' :: SetSurveyData + ! implicit none + ! integer, intent(in) :: count + ! integer :: i + ! type(CSurveyDataItem), intent(inout), target :: array(count) + ! type(CSurveyDataItem), pointer :: item + ! WellSurveyData%Count = count + ! if(size(WellSurveyData%Items) > 0) then + ! deallocate(WellSurveyData%Items) + ! end if + ! if(count > 0) then + ! allocate(WellSurveyData%Items(count)) + ! do i = 1, count + ! item => array(i) + ! WellSurveyData%Items(i)%MeasuredDepth = item%MeasuredDepth + ! WellSurveyData%Items(i)%Inclination = item%Inclination + ! WellSurveyData%Items(i)%Azimoth = item%Azimoth + ! WellSurveyData%Items(i)%TotalVerticalDepth = item%TotalVerticalDepth + ! WellSurveyData%Items(i)%X = item%X + ! WellSurveyData%Items(i)%Y = item%Y + ! WellSurveyData%Items(i)%Z = item%Z + ! end do + ! end if + + ! SetSurveyData = 0 + ! end function SetSurveyData end module CWellSurveyData \ No newline at end of file diff --git a/CSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 b/CSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 index 9324737..1527b81 100644 --- a/CSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 +++ b/CSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 @@ -1,23 +1,23 @@ -module CWellSurveyDataVariables - implicit none - public - - ! types - type, bind(c), public :: CSurveyDataItem - real(8) :: MeasuredDepth - real(8) :: Inclination - real(8) :: Azimoth - real(8) :: TotalVerticalDepth - real(8) :: X - real(8) :: Y - real(8) :: Z - end type CSurveyDataItem - - Type :: WellSurveyDataType - integer :: Count = 0 - type(CSurveyDataItem), allocatable :: Items(:) - End Type WellSurveyDataType - - Type(WellSurveyDataType)::WellSurveyData - contains +module CWellSurveyDataVariables + implicit none + public + + ! types + type, bind(c), public :: CSurveyDataItem + real(8) :: MeasuredDepth + real(8) :: Inclination + real(8) :: Azimoth + real(8) :: TotalVerticalDepth + real(8) :: X + real(8) :: Y + real(8) :: Z + end type CSurveyDataItem + + Type :: WellSurveyDataType + integer :: Count = 0 + type(CSurveyDataItem), allocatable :: Items(:) + End Type WellSurveyDataType + + ! Type(WellSurveyDataType)::WellSurveyData + contains end module CWellSurveyDataVariables \ No newline at end of file diff --git a/CSharp/Common/CCommon.f90 b/CSharp/Common/CCommon.f90 index 0743cbc..10131e7 100644 --- a/CSharp/Common/CCommon.f90 +++ b/CSharp/Common/CCommon.f90 @@ -1,50 +1,50 @@ -module CCommon - use CCommonVariables - implicit none - public - contains - ! Input routines - subroutine SetStandRack(v) - implicit none - integer, intent(in) :: v - if(Common%StandRack == v) return - Common%StandRack = v - ! call Common%OnStandRackChange%Run(v) - end subroutine - - integer function GetStandRack() - implicit none - GetStandRack = Common%StandRack - end function - - - ! subroutine SetStandRack_WN(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SetStandRack_WN - ! !DEC$ ATTRIBUTES ALIAS: 'SetStandRack_WN' :: SetStandRack_WN - ! implicit none - ! integer, intent(in) :: v - ! call SetStandRack(v) - ! end subroutine - - - - ! ! Output routines - ! logical function GetDrillWatchOperationMode() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetDrillWatchOperationMode - ! !DEC$ ATTRIBUTES ALIAS: 'GetDrillWatchOperationMode' :: GetDrillWatchOperationMode - ! implicit none - ! GetDrillWatchOperationMode = Common%DrillWatchOperationMode - ! end function - - - ! integer function GetStandRack_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetStandRack_WN - ! !DEC$ ATTRIBUTES ALIAS: 'GetStandRack_WN' :: GetStandRack_WN - ! implicit none - ! GetStandRack_WN = Common%StandRack - ! end function - - - - +module CCommon + use CCommonVariables + implicit none + public + contains + ! Input routines + subroutine SetStandRack(v) + implicit none + integer, intent(in) :: v + if(Common%StandRack == v) return + Common%StandRack = v + ! call Common%OnStandRackChange%Run(v) + end subroutine + + integer function GetStandRack() + implicit none + GetStandRack = Common%StandRack + end function + + + ! subroutine SetStandRack_WN(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SetStandRack_WN + ! !DEC$ ATTRIBUTES ALIAS: 'SetStandRack_WN' :: SetStandRack_WN + ! implicit none + ! integer, intent(in) :: v + ! call SetStandRack(v) + ! end subroutine + + + + ! ! Output routines + ! logical function GetDrillWatchOperationMode() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetDrillWatchOperationMode + ! !DEC$ ATTRIBUTES ALIAS: 'GetDrillWatchOperationMode' :: GetDrillWatchOperationMode + ! implicit none + ! GetDrillWatchOperationMode = Common%DrillWatchOperationMode + ! end function + + + ! integer function GetStandRack_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetStandRack_WN + ! !DEC$ ATTRIBUTES ALIAS: 'GetStandRack_WN' :: GetStandRack_WN + ! implicit none + ! GetStandRack_WN = Common%StandRack + ! end function + + + + end module CCommon \ No newline at end of file diff --git a/CSharp/Common/CCommonVariables.f90 b/CSharp/Common/CCommonVariables.f90 index 1bc6a53..1adb91c 100644 --- a/CSharp/Common/CCommonVariables.f90 +++ b/CSharp/Common/CCommonVariables.f90 @@ -1,16 +1,16 @@ -module CCommonVariables - !**use CIntegerEventHandler - implicit none - public - - type :: CommonType - ! Input vars - integer :: StandRack - ! type(IntegerEventHandler) :: OnStandRackChange - ! Output vars - logical :: DrillWatchOperationMode - end type - type(CommonType):: Common - contains - +module CCommonVariables + !**use CIntegerEventHandler + implicit none + public + + type :: CommonType + ! Input vars + integer :: StandRack + ! type(IntegerEventHandler) :: OnStandRackChange + ! Output vars + logical :: DrillWatchOperationMode + end type + type(CommonType):: Common + contains + end module CCommonVariables \ No newline at end of file diff --git a/CSharp/Common/CIActionReference.f90 b/CSharp/Common/CIActionReference.f90 index 6d06572..d72a335 100644 --- a/CSharp/Common/CIActionReference.f90 +++ b/CSharp/Common/CIActionReference.f90 @@ -1,55 +1,55 @@ -module CIActionReference - implicit none - abstract interface - subroutine ActionVoid() - end subroutine - - subroutine ActionBool(i) - logical, intent (in) :: i - end subroutine - - subroutine ActionInteger(i) - integer, intent (in) :: i - end subroutine - - subroutine ActionIntegerArray(arr) - integer, allocatable, intent (in) :: arr(:) - end subroutine - - subroutine ActionReal(i) - real, intent (in) :: i - end subroutine - - subroutine ActionDouble(i) - real(8), intent (in) :: i - end subroutine - - subroutine ActionDualDouble(a, b) - real(8), intent (in) :: a, b - end subroutine - - subroutine ActionString(c) - character(len=*), intent(in) :: c - end subroutine - - subroutine ActionStringInt(c, i) - character(len=*), intent(in) :: c - integer, intent (in) :: i - end subroutine - - subroutine ActionStringFloat(c, f) - character(len=*), intent(in) :: c - real, intent (in) :: f - end subroutine - - subroutine ActionStringDouble(c, d) - character(len=*), intent(in) :: c - real(8), intent (in) :: d - end subroutine - - subroutine ActionStringBool(c, b) - character(len=*), intent(in) :: c - logical, intent (in) :: b - end subroutine - end interface +module CIActionReference + implicit none + abstract interface + subroutine ActionVoid() + end subroutine + + subroutine ActionBool(i) + logical, intent (in) :: i + end subroutine + + subroutine ActionInteger(i) + integer, intent (in) :: i + end subroutine + + subroutine ActionIntegerArray(arr) + integer, allocatable, intent (in) :: arr(:) + end subroutine + + subroutine ActionReal(i) + real, intent (in) :: i + end subroutine + + subroutine ActionDouble(i) + real(8), intent (in) :: i + end subroutine + + subroutine ActionDualDouble(a, b) + real(8), intent (in) :: a, b + end subroutine + + subroutine ActionString(c) + character(len=*), intent(in) :: c + end subroutine + + subroutine ActionStringInt(c, i) + character(len=*), intent(in) :: c + integer, intent (in) :: i + end subroutine + + subroutine ActionStringFloat(c, f) + character(len=*), intent(in) :: c + real, intent (in) :: f + end subroutine + + subroutine ActionStringDouble(c, d) + character(len=*), intent(in) :: c + real(8), intent (in) :: d + end subroutine + + subroutine ActionStringBool(c, b) + character(len=*), intent(in) :: c + logical, intent (in) :: b + end subroutine + end interface end module CIActionReference \ No newline at end of file diff --git a/CSharp/Common/CQuery.f90 b/CSharp/Common/CQuery.f90 index 34f5d6d..d663cf5 100644 --- a/CSharp/Common/CQuery.f90 +++ b/CSharp/Common/CQuery.f90 @@ -1,17 +1,17 @@ -module CQuery - implicit none - public GetCurrentProcessorNumber - - interface - - function GetCurrentProcessorNumber() bind(C,Name='GetCurrentProcessorNumber') - use ifwinty - implicit none - !DEC$ ATTRIBUTES STDCALL :: GetCurrentProcessorNumber - integer(DWORD) :: GetCurrentProcessorNumber - end function GetCurrentProcessorNumber - - end interface - - contains +module CQuery + implicit none + public GetCurrentProcessorNumber + + interface + + function GetCurrentProcessorNumber() bind(C,Name='GetCurrentProcessorNumber') + use ifwinty + implicit none + !DEC$ ATTRIBUTES STDCALL :: GetCurrentProcessorNumber + integer(DWORD) :: GetCurrentProcessorNumber + end function GetCurrentProcessorNumber + + end interface + + contains end module CQuery \ No newline at end of file diff --git a/CSharp/Common/CScaleRange.f90 b/CSharp/Common/CScaleRange.f90 index cd08edf..9d588d4 100644 --- a/CSharp/Common/CScaleRange.f90 +++ b/CSharp/Common/CScaleRange.f90 @@ -1,16 +1,16 @@ -module CScaleRange - implicit none - public - contains - - real function ScaleRange(x, toMin, toMax, fromMin, fromMax) - implicit none - real, intent(in) :: x - real, intent(in) :: toMin - real, intent(in) :: toMax - real, intent(in) :: fromMin - real, intent(in) :: fromMax - ScaleRange = ((toMax - toMin)*(x - fromMin)/(fromMax - fromMin)) + toMin - end function - -end module CScaleRange +module CScaleRange + implicit none + public + contains + + real function ScaleRange(x, toMin, toMax, fromMin, fromMax) + implicit none + real, intent(in) :: x + real, intent(in) :: toMin + real, intent(in) :: toMax + real, intent(in) :: fromMin + real, intent(in) :: fromMax + ScaleRange = ((toMax - toMin)*(x - fromMin)/(fromMax - fromMin)) + toMin + end function + +end module CScaleRange diff --git a/CSharp/Common/CTimer.f90 b/CSharp/Common/CTimer.f90 index 6c29943..c53157e 100644 --- a/CSharp/Common/CTimer.f90 +++ b/CSharp/Common/CTimer.f90 @@ -1,54 +1,54 @@ -module CTimer - use ifwin, only: QueryPerformanceFrequency, QueryPerformanceCounter, T_LARGE_INTEGER - use ISO_C_BINDING - use ISO_FORTRAN_ENV - implicit none - public - type, public :: Timer - type(T_LARGE_INTEGER) :: StartTime - type(T_LARGE_INTEGER) :: EndTime - contains - procedure :: Start => Start - procedure :: Finish => Finish - procedure :: ElapsedTimeMs => ElapsedTime - end type Timer - contains - subroutine Start(this) - implicit none - class(Timer), intent(inout) :: this - integer :: ApiResult - ApiResult = QueryPerformanceCounter(this%StartTime) - end subroutine - subroutine Finish(this) - implicit none - class(Timer), intent(inout) :: this - integer :: ApiResult - ApiResult = QueryPerformanceCounter(this%EndTime) - end subroutine - integer function ElapsedTime(this) - implicit none - class(Timer), intent(inout) :: this - real(kind=REAL128) :: time - time = CalcTime(this%StartTime, this%EndTime) - ElapsedTime = int(time * 1000.0) - end function - real(kind=REAL128) function CalcTime(start, finish) - implicit none - type(T_LARGE_INTEGER), intent(in) :: start - type(T_LARGE_INTEGER), intent(in) :: finish - type(T_LARGE_INTEGER) :: freq - integer :: ApiResult - integer(kind=INT64) :: freq_64 - integer(kind=INT64) :: start_64 - integer(kind=INT64) :: finish_64 - start_64 = Make64(start) - finish_64 = Make64(finish) - ApiResult = QueryPerformanceFrequency(freq) - freq_64 = Make64( freq) - CalcTime = real(finish_64-start_64,kind=REAL128) / real(freq_64,kind=REAL128) - end function - integer(kind=INT64) function Make64(bit64_int) - type(T_LARGE_INTEGER), intent(in) :: bit64_int - Make64 = transfer(bit64_int, 0_INT64) - end function +module CTimer + use ifwin, only: QueryPerformanceFrequency, QueryPerformanceCounter, T_LARGE_INTEGER + use ISO_C_BINDING + use ISO_FORTRAN_ENV + implicit none + public + type, public :: Timer + type(T_LARGE_INTEGER) :: StartTime + type(T_LARGE_INTEGER) :: EndTime + contains + procedure :: Start => Start + procedure :: Finish => Finish + procedure :: ElapsedTimeMs => ElapsedTime + end type Timer + contains + subroutine Start(this) + implicit none + class(Timer), intent(inout) :: this + integer :: ApiResult + ApiResult = QueryPerformanceCounter(this%StartTime) + end subroutine + subroutine Finish(this) + implicit none + class(Timer), intent(inout) :: this + integer :: ApiResult + ApiResult = QueryPerformanceCounter(this%EndTime) + end subroutine + integer function ElapsedTime(this) + implicit none + class(Timer), intent(inout) :: this + real(kind=REAL128) :: time + time = CalcTime(this%StartTime, this%EndTime) + ElapsedTime = int(time * 1000.0) + end function + real(kind=REAL128) function CalcTime(start, finish) + implicit none + type(T_LARGE_INTEGER), intent(in) :: start + type(T_LARGE_INTEGER), intent(in) :: finish + type(T_LARGE_INTEGER) :: freq + integer :: ApiResult + integer(kind=INT64) :: freq_64 + integer(kind=INT64) :: start_64 + integer(kind=INT64) :: finish_64 + start_64 = Make64(start) + finish_64 = Make64(finish) + ApiResult = QueryPerformanceFrequency(freq) + freq_64 = Make64( freq) + CalcTime = real(finish_64-start_64,kind=REAL128) / real(freq_64,kind=REAL128) + end function + integer(kind=INT64) function Make64(bit64_int) + type(T_LARGE_INTEGER), intent(in) :: bit64_int + Make64 = transfer(bit64_int, 0_INT64) + end function end module CTimer \ No newline at end of file diff --git a/CSharp/Common/CTimerLegacy.f90 b/CSharp/Common/CTimerLegacy.f90 index 02cdcc9..d4e2c3f 100644 --- a/CSharp/Common/CTimerLegacy.f90 +++ b/CSharp/Common/CTimerLegacy.f90 @@ -1,28 +1,28 @@ -module CTimerLegacy - implicit none - public - type, public :: TimerLegacy - integer, dimension(8) :: StartTime - integer, dimension(8) :: EndTime - contains - procedure :: Start => Start - procedure :: Finish => Finish - procedure :: ElapsedTimeMs => ElapsedTime - end type TimerLegacy - contains - subroutine Start(this) - implicit none - class(TimerLegacy), intent(inout) :: this - call date_and_time(values=this%StartTime) - end subroutine - subroutine Finish(this) - implicit none - class(TimerLegacy), intent(inout) :: this - call date_and_time(values=this%EndTime) - end subroutine - integer function ElapsedTime(this) - implicit none - class(TimerLegacy), intent(inout) :: this - ElapsedTime = (this%EndTime(6)*60000+this%EndTime(7)*1000+this%EndTime(8)) - (this%StartTime(6)*60000+this%StartTime(7)*1000+this%StartTime(8)) - end function +module CTimerLegacy + implicit none + public + type, public :: TimerLegacy + integer, dimension(8) :: StartTime + integer, dimension(8) :: EndTime + contains + procedure :: Start => Start + procedure :: Finish => Finish + procedure :: ElapsedTimeMs => ElapsedTime + end type TimerLegacy + contains + subroutine Start(this) + implicit none + class(TimerLegacy), intent(inout) :: this + call date_and_time(values=this%StartTime) + end subroutine + subroutine Finish(this) + implicit none + class(TimerLegacy), intent(inout) :: this + call date_and_time(values=this%EndTime) + end subroutine + integer function ElapsedTime(this) + implicit none + class(TimerLegacy), intent(inout) :: this + ElapsedTime = (this%EndTime(6)*60000+this%EndTime(7)*1000+this%EndTime(8)) - (this%StartTime(6)*60000+this%StartTime(7)*1000+this%StartTime(8)) + end function end module CTimerLegacy \ No newline at end of file diff --git a/CSharp/DownHole/CDownHoleActions.f90 b/CSharp/DownHole/CDownHoleActions.f90 index e9063b7..4a5cf5a 100644 --- a/CSharp/DownHole/CDownHoleActions.f90 +++ b/CSharp/DownHole/CDownHoleActions.f90 @@ -1,105 +1,105 @@ -module CDownHoleActions - use CIActionReference - implicit none - public - - abstract interface - subroutine ActionFluid(array) - use CDownHoleTypes - type(CFluid), allocatable, intent(in), target :: array(:) - end subroutine - - subroutine ActionComponent(array) - use CDownHoleTypes - type(CStringComponent), allocatable, intent(in), target :: array(:) - end subroutine - - subroutine ActionBopElement(array) - use CDownHoleTypes - type(CBopElement), allocatable, intent(in), target :: array(:) - end subroutine - end interface - - procedure (ActionInteger), pointer :: AnnalusMudCountPtr - procedure (ActionFluid), pointer :: AnnalusMudArrayPtr - - procedure (ActionInteger), pointer :: StringMudCountPtr - procedure (ActionFluid), pointer :: StringMudArrayPtr - - procedure (ActionInteger), pointer :: StringComponentCountPtr - procedure (ActionComponent), pointer :: StringComponentArrayPtr - - procedure (ActionBopElement), pointer :: BopElementsPtr - - contains - - subroutine SubscribeAnnalusMudCount(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnalusMudCount - !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnalusMudCount' :: SubscribeAnnalusMudCount - implicit none - procedure (ActionInteger) :: a - AnnalusMudCountPtr => a - end subroutine - - subroutine SubscribeAnnalusMudArray(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnalusMudArray - !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnalusMudArray' :: SubscribeAnnalusMudArray - implicit none - procedure (ActionFluid) :: a - AnnalusMudArrayPtr => a - end subroutine - - - - - - - - - subroutine SubscribeStringMudCount(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringMudCount - !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringMudCount' :: SubscribeStringMudCount - implicit none - procedure (ActionInteger) :: a - StringMudCountPtr => a - end subroutine - - subroutine SubscribeStringMudArray(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringMudArray - !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringMudArray' :: SubscribeStringMudArray - implicit none - procedure (ActionFluid) :: a - StringMudArrayPtr => a - end subroutine - - - - - - - subroutine SubscribeStringComponentCount(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringComponentCount - !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringComponentCount' :: SubscribeStringComponentCount - implicit none - procedure (ActionInteger) :: a - StringComponentCountPtr => a - end subroutine - - subroutine SubscribeStringComponentArray(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringComponentArray - !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringComponentArray' :: SubscribeStringComponentArray - implicit none - procedure (ActionComponent) :: a - StringComponentArrayPtr => a - end subroutine - - - subroutine SubscribeBopElements(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeBopElements - !DEC$ ATTRIBUTES ALIAS: 'SubscribeBopElements' :: SubscribeBopElements - implicit none - procedure (ActionBopElement) :: a - BopElementsPtr => a - end subroutine - +module CDownHoleActions + use CIActionReference + implicit none + public + + abstract interface + subroutine ActionFluid(array) + use CDownHoleTypes + type(CFluid), allocatable, intent(in), target :: array(:) + end subroutine + + subroutine ActionComponent(array) + use CDownHoleTypes + type(CStringComponent), allocatable, intent(in), target :: array(:) + end subroutine + + subroutine ActionBopElement(array) + use CDownHoleTypes + type(CBopElement), allocatable, intent(in), target :: array(:) + end subroutine + end interface + + procedure (ActionInteger), pointer :: AnnalusMudCountPtr + procedure (ActionFluid), pointer :: AnnalusMudArrayPtr + + procedure (ActionInteger), pointer :: StringMudCountPtr + procedure (ActionFluid), pointer :: StringMudArrayPtr + + procedure (ActionInteger), pointer :: StringComponentCountPtr + procedure (ActionComponent), pointer :: StringComponentArrayPtr + + procedure (ActionBopElement), pointer :: BopElementsPtr + + contains + + subroutine SubscribeAnnalusMudCount(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnalusMudCount + !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnalusMudCount' :: SubscribeAnnalusMudCount + implicit none + procedure (ActionInteger) :: a + AnnalusMudCountPtr => a + end subroutine + + subroutine SubscribeAnnalusMudArray(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnalusMudArray + !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnalusMudArray' :: SubscribeAnnalusMudArray + implicit none + procedure (ActionFluid) :: a + AnnalusMudArrayPtr => a + end subroutine + + + + + + + + + subroutine SubscribeStringMudCount(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringMudCount + !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringMudCount' :: SubscribeStringMudCount + implicit none + procedure (ActionInteger) :: a + StringMudCountPtr => a + end subroutine + + subroutine SubscribeStringMudArray(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringMudArray + !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringMudArray' :: SubscribeStringMudArray + implicit none + procedure (ActionFluid) :: a + StringMudArrayPtr => a + end subroutine + + + + + + + subroutine SubscribeStringComponentCount(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringComponentCount + !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringComponentCount' :: SubscribeStringComponentCount + implicit none + procedure (ActionInteger) :: a + StringComponentCountPtr => a + end subroutine + + subroutine SubscribeStringComponentArray(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeStringComponentArray + !DEC$ ATTRIBUTES ALIAS: 'SubscribeStringComponentArray' :: SubscribeStringComponentArray + implicit none + procedure (ActionComponent) :: a + StringComponentArrayPtr => a + end subroutine + + + subroutine SubscribeBopElements(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeBopElements + !DEC$ ATTRIBUTES ALIAS: 'SubscribeBopElements' :: SubscribeBopElements + implicit none + procedure (ActionBopElement) :: a + BopElementsPtr => a + end subroutine + end module CDownHoleActions \ No newline at end of file diff --git a/CSharp/DownHole/CDownHoleTypes.f90 b/CSharp/DownHole/CDownHoleTypes.f90 index 078b046..88017ac 100644 --- a/CSharp/DownHole/CDownHoleTypes.f90 +++ b/CSharp/DownHole/CDownHoleTypes.f90 @@ -1,52 +1,52 @@ -module CDownHoleTypes - implicit none - public - - !enums - enum, bind(c) - enumerator STRING_BIT !0 - enumerator STRING_STABILIZER !1 - enumerator STRING_COLLAR !2 - enumerator STRING_DRILLPIPE !3 - enumerator STRING_HEAVYWEIGHT !4 - end enum - - enum, bind(c) - enumerator FLUID_NORMAL_MUD !0 - enumerator FLUID_GAS_KICK !1 - enumerator FLUID_WATER_KICK !2 - enumerator FLUID_OIL_KICK !3 - enumerator FLUID_NO_MUD !4 - end enum - - ! new types - type, bind(c), public :: CFluid - real(8) :: StartMd - real(8) :: EndMd - real(8) :: Density - integer :: MudType - end type CFluid - - type, bind(c), public :: CStringComponents - real(8) :: Length - real(8) :: TopDepth - real(8) :: DownDepth - real(8) :: Od - real(8) :: Id - integer :: ComponentType - end type CStringComponents - - type, bind(c), public :: CStringComponent - real(8) :: StartMd - real(8) :: EndMd - integer :: ComponentType - end type CStringComponent - - type, bind(c), public :: CBopElement - integer :: ElementType - real :: ElementStart - real :: ElementEnd - end type CBopElement - - contains +module CDownHoleTypes + implicit none + public + + !enums + enum, bind(c) + enumerator STRING_BIT !0 + enumerator STRING_STABILIZER !1 + enumerator STRING_COLLAR !2 + enumerator STRING_DRILLPIPE !3 + enumerator STRING_HEAVYWEIGHT !4 + end enum + + enum, bind(c) + enumerator FLUID_NORMAL_MUD !0 + enumerator FLUID_GAS_KICK !1 + enumerator FLUID_WATER_KICK !2 + enumerator FLUID_OIL_KICK !3 + enumerator FLUID_NO_MUD !4 + end enum + + ! new types + type, bind(c), public :: CFluid + real(8) :: StartMd + real(8) :: EndMd + real(8) :: Density + integer :: MudType + end type CFluid + + type, bind(c), public :: CStringComponents + real(8) :: Length + real(8) :: TopDepth + real(8) :: DownDepth + real(8) :: Od + real(8) :: Id + integer :: ComponentType + end type CStringComponents + + type, bind(c), public :: CStringComponent + real(8) :: StartMd + real(8) :: EndMd + integer :: ComponentType + end type CStringComponent + + type, bind(c), public :: CBopElement + integer :: ElementType + real :: ElementStart + real :: ElementEnd + end type CBopElement + + contains end module CDownHoleTypes \ No newline at end of file diff --git a/CSharp/DownHole/CDownHoleVariables.f90 b/CSharp/DownHole/CDownHoleVariables.f90 index 0ed6636..060819f 100644 --- a/CSharp/DownHole/CDownHoleVariables.f90 +++ b/CSharp/DownHole/CDownHoleVariables.f90 @@ -1,43 +1,43 @@ -module CDownHoleVariables - use CDownHoleTypes - ! use CStringConfigurationVariables - ! use CDownHoleActions - use CLog4 - implicit none - public - !!!!!!!!!!!!!!!!!!!!! - ! Outputs to user interface - !!!!!!!!!!!!!!!!!!!!! - type :: DownHoleType - logical :: AnnDrillMud - logical :: AnnCirculateMud - - integer :: AnnalusFluidsCount = 0 - integer :: StringFluidsCount = 0 - type(CFluid), allocatable :: AnnalusFluids(:) !, target - type(CFluid), allocatable :: StringFluids(:) - - integer :: StringCount = 0 - type(CStringComponent), allocatable :: String(:) - - type(CBopElement), allocatable :: BopElements(:) - - real(8) :: DrillPipePressure - real(8) :: CasingPressure - real(8) :: ShoePressure - real(8) :: BottomHolePressure - real(8) :: FormationPressure - real :: InfluxRate - real :: KickVolume - real :: SecondKickVolume - real :: PermeabilityExposedHeight - - real(8) :: Density - real(8) :: Pressure - real(8) :: Temperature - real(8) :: Height - real(8) :: Volume - end type DownHoleType - type(DownHoleType):: DownHole - contains +module CDownHoleVariables + use CDownHoleTypes + ! use CStringConfigurationVariables + ! use CDownHoleActions + use CLog4 + implicit none + public + !!!!!!!!!!!!!!!!!!!!! + ! Outputs to user interface + !!!!!!!!!!!!!!!!!!!!! + type :: DownHoleType + logical :: AnnDrillMud + logical :: AnnCirculateMud + + integer :: AnnalusFluidsCount = 0 + integer :: StringFluidsCount = 0 + type(CFluid), allocatable :: AnnalusFluids(:) !, target + type(CFluid), allocatable :: StringFluids(:) + + integer :: StringCount = 0 + type(CStringComponent), allocatable :: String(:) + + type(CBopElement), allocatable :: BopElements(:) + + real(8) :: DrillPipePressure + real(8) :: CasingPressure + real(8) :: ShoePressure + real(8) :: BottomHolePressure + real(8) :: FormationPressure + real :: InfluxRate + real :: KickVolume + real :: SecondKickVolume + real :: PermeabilityExposedHeight + + real(8) :: Density + real(8) :: Pressure + real(8) :: Temperature + real(8) :: Height + real(8) :: Volume + end type DownHoleType + type(DownHoleType):: DownHole + contains end module CDownHoleVariables \ No newline at end of file diff --git a/CSharp/DownHole/DownHole.f90 b/CSharp/DownHole/DownHole.f90 index 32aa417..cb9b7da 100644 --- a/CSharp/DownHole/DownHole.f90 +++ b/CSharp/DownHole/DownHole.f90 @@ -1,204 +1,204 @@ -module DownHoleModule - use SimulationVariables - contains - subroutine SetAnnalusFluids(count, array) - implicit none - integer, intent(in) :: count - integer :: i, offset - type(CFluid), intent(inout), target :: array(count) - type(CFluid), pointer :: item - DownHole%AnnalusFluidsCount = count - print*, 'AnnalusFluidsCount = ', count - if(size(DownHole%AnnalusFluids) > 0) then - deallocate(DownHole%AnnalusFluids) - end if - if(count > 0) then - offset = 0; - item => array(1) - if(item%StartMd > 0) then - DownHole%AnnalusFluidsCount = DownHole%AnnalusFluidsCount + 1 - offset = 1; - allocate(DownHole%AnnalusFluids(DownHole%AnnalusFluidsCount)) - DownHole%AnnalusFluids(1)%StartMd = 0 - DownHole%AnnalusFluids(1)%EndMd = item%StartMd - DownHole%AnnalusFluids(1)%Density = 0 - DownHole%AnnalusFluids(1)%MudType = FLUID_NO_MUD - endif - - !if(associated(AnnalusMudCountPtr)) then - ! call AnnalusMudCountPtr(AnnalusFluidsCount) - !end if - if(.not.allocated(DownHole%AnnalusFluids))allocate(DownHole%AnnalusFluids(DownHole%AnnalusFluidsCount)) - !print*, '============START-AN============' - if(item%StartMd < 0) DownHole%AnnalusFluids(1)%StartMd = 0 - do i = 1, count - item => array(i) - DownHole%AnnalusFluids(i + offset)%StartMd = item%StartMd - if(i==1) DownHole%AnnalusFluids(i)%StartMd = 0 - !print*, 'AnnalusFluids(',i,')%StartMd=', AnnalusFluids(i)%StartMd - DownHole%AnnalusFluids(i + offset)%EndMd = item%EndMd - !print*, 'AnnalusFluids(',i,')%EndMd=', AnnalusFluids(i)%EndMd - DownHole%AnnalusFluids(i + offset)%Density = item%Density - !print*, 'AnnalusFluids(',i,')%Density=', AnnalusFluids(i)%Density - DownHole%AnnalusFluids(i + offset)%MudType = item%MudType - !print*, 'AnnalusFluids(',i,')%MudType=', AnnalusFluids(i)%MudType - !print*, '----------------------------' - end do - !print*, '============END-AN============' - !if(associated(AnnalusMudArrayPtr)) then - ! !AnnalusFluidsPtr => AnnalusFluids - ! call AnnalusMudArrayPtr(AnnalusFluids) - !end if - end if - end subroutine SetAnnalusFluids - - subroutine SetStringFluids(count, array) - implicit none - integer, intent(in) :: count - integer :: i, offset !, startArr - type(CFluid), intent(inout), target :: array(count) - type(CFluid), pointer :: item - DownHole%StringFluidsCount = count - print*, 'StringFluidsCount = ', count - if(size(DownHole%StringFluids) > 0) then - deallocate(DownHole%StringFluids) - end if - - !startArr = 1 - - if(count > 0) then - offset = 0; - item => array(1) - ! - !if(item%StartMd <= 0 .and. item%EndMd <= 0) then - ! StringFluidsCount = StringFluidsCount - 1 - ! count = count - 1 - ! offset = offset + 1 - ! startArr = startArr + 1 - !endif - ! - !if(count <= 0) return - - if(item%StartMd > 0) then - DownHole%StringFluidsCount = DownHole%StringFluidsCount + 1 - offset = offset + 1 - allocate(DownHole%StringFluids(DownHole%StringFluidsCount)) - DownHole%StringFluids(1)%StartMd = 0 - DownHole%StringFluids(1)%EndMd = item%StartMd - DownHole%StringFluids(1)%Density = 0 - DownHole%StringFluids(1)%MudType = FLUID_NO_MUD - endif - - !if(associated(StringMudCountPtr)) then - ! call StringMudCountPtr(count) - !end if - if(.not.allocated(DownHole%StringFluids))allocate(DownHole%StringFluids(DownHole%StringFluidsCount)) - !print*, '============START-ST============' - !print*, 'count=', count - do i = 1, count - item => array(i) - DownHole%StringFluids(i + offset)%StartMd = item%StartMd - if(i==1) DownHole%StringFluids(i)%StartMd = 0 - !print*, 'StringFluids(i)%StartMd=', StringFluids(i)%StartMd - DownHole%StringFluids(i + offset)%EndMd = item%EndMd - !print*, 'StringFluids(i)%EndMd=', StringFluids(i)%EndMd - DownHole%StringFluids(i + offset)%Density = item%Density - DownHole%StringFluids(i + offset)%MudType = item%MudType - !print*, '----------------------------' - end do - !!if(item%StartMd < 0) StringFluids(1)%StartMd = 0 - !!print*, '============END-ST============' - !if(associated(StringMudArrayPtr)) then - ! call StringMudArrayPtr(StringFluids) - !end if - end if - end subroutine SetStringFluids - - subroutine SetString(count, array) - use CLog3 - implicit none - integer, intent(in) :: count - integer :: i !, j - type(CStringComponents), intent(inout), target :: array(count) - type(CStringComponents), pointer :: item - DownHole%StringCount = count - if(size(DownHole%String) > 0) then - deallocate(DownHole%String) - end if - if(count > 0) then - !if(associated(StringComponentCountPtr)) then - ! call StringComponentCountPtr(count) - !end if - allocate(DownHole%String(count)) - !j = 0 - !print*, '============CMP-ST============' - !call Log_3( '============CMP-ST============') - !do i = count, 1, -1 - do i = 1, count - item => array(i) - !String(i)%Length = item%Length - !String(i)%TopDepth = item%TopDepth - !String(i)%DownDepth = item%DownDepth - !String(i)%Od = item%Od - !String(i)%Id = item%Id - DownHole%String(i)%ComponentType= item%ComponentType - !j = j + 1 - DownHole%String(i)%StartMd = item%TopDepth - DownHole%String(i)%EndMd = item%DownDepth - - DownHole%String(i)%ComponentType=0 - !if(item%ComponentType > 4 ) then - ! String(i)%ComponentType=0 - ! String(i)%StartMd = 0 - !endif - if(item%ComponentType == 3) DownHole%String(i)%ComponentType=0 - if(item%ComponentType == 4) DownHole%String(i)%ComponentType=1 - if(item%ComponentType == 2) DownHole%String(i)%ComponentType=2 - if(item%ComponentType == 1) DownHole%String(i)%ComponentType=3 - !print*, 'item%ComponentType=', item%ComponentType - !print*, 'String(i)%ComponentType=', String(i)%ComponentType - !print*, 'String(i)%StartMd=', String(i)%StartMd - !print*, 'String(i)%EndMd=', String(i)%EndMd - !print*, '----------------------------' - - !call Log_3( 'item%ComponentType=', item%ComponentType) - !call Log_3( 'String(i)%ComponentType=', String(i)%ComponentType) - !call Log_3( 'String(i)%StartMd=', String(i)%StartMd) - !call Log_3( 'String(i)%EndMd=', String(i)%EndMd) - !call Log_3( '----------------------------') - - end do - !!print*, '============CMP-ST============' - !!call Log_3( '============CMP-ST============') - !if(associated(StringComponentArrayPtr)) then - ! call StringComponentArrayPtr(String) - !end if - end if - end subroutine SetString - - subroutine SetBopElements(array) - use CLog4 - implicit none - integer, parameter :: count = 4 - integer :: i = 1 !, j - type(CBopElement), intent(inout), target :: array(count) - type(CBopElement), pointer :: item - if(size(DownHole%BopElements) > 0) deallocate(DownHole%BopElements) - allocate(DownHole%BopElements(count)) - - do i = 1, count - item => array(i) - !call Log_4('item%ElementStart', item%ElementStart) - !call Log_4('item%ElementEnd', item%ElementEnd) - !call Log_4('item%ElementType', item%ElementType) - !call Log_4('=====================================================') - - DownHole%BopElements(i)%ElementStart = item%ElementStart - DownHole%BopElements(i)%ElementEnd = item%ElementEnd - DownHole%BopElements(i)%ElementType = item%ElementType - end do - - !if(associated(BopElementsPtr)) call BopElementsPtr(BopElements) - end subroutine SetBopElements - +module DownHoleModule + use SimulationVariables + contains + subroutine SetAnnalusFluids(count, array) + implicit none + integer, intent(in) :: count + integer :: i, offset + type(CFluid), intent(inout), target :: array(count) + type(CFluid), pointer :: item + DownHole%AnnalusFluidsCount = count + print*, 'AnnalusFluidsCount = ', count + if(size(DownHole%AnnalusFluids) > 0) then + deallocate(DownHole%AnnalusFluids) + end if + if(count > 0) then + offset = 0; + item => array(1) + if(item%StartMd > 0) then + DownHole%AnnalusFluidsCount = DownHole%AnnalusFluidsCount + 1 + offset = 1; + allocate(DownHole%AnnalusFluids(DownHole%AnnalusFluidsCount)) + DownHole%AnnalusFluids(1)%StartMd = 0 + DownHole%AnnalusFluids(1)%EndMd = item%StartMd + DownHole%AnnalusFluids(1)%Density = 0 + DownHole%AnnalusFluids(1)%MudType = FLUID_NO_MUD + endif + + !if(associated(AnnalusMudCountPtr)) then + ! call AnnalusMudCountPtr(AnnalusFluidsCount) + !end if + if(.not.allocated(DownHole%AnnalusFluids))allocate(DownHole%AnnalusFluids(DownHole%AnnalusFluidsCount)) + !print*, '============START-AN============' + if(item%StartMd < 0) DownHole%AnnalusFluids(1)%StartMd = 0 + do i = 1, count + item => array(i) + DownHole%AnnalusFluids(i + offset)%StartMd = item%StartMd + if(i==1) DownHole%AnnalusFluids(i)%StartMd = 0 + !print*, 'AnnalusFluids(',i,')%StartMd=', AnnalusFluids(i)%StartMd + DownHole%AnnalusFluids(i + offset)%EndMd = item%EndMd + !print*, 'AnnalusFluids(',i,')%EndMd=', AnnalusFluids(i)%EndMd + DownHole%AnnalusFluids(i + offset)%Density = item%Density + !print*, 'AnnalusFluids(',i,')%Density=', AnnalusFluids(i)%Density + DownHole%AnnalusFluids(i + offset)%MudType = item%MudType + !print*, 'AnnalusFluids(',i,')%MudType=', AnnalusFluids(i)%MudType + !print*, '----------------------------' + end do + !print*, '============END-AN============' + !if(associated(AnnalusMudArrayPtr)) then + ! !AnnalusFluidsPtr => AnnalusFluids + ! call AnnalusMudArrayPtr(AnnalusFluids) + !end if + end if + end subroutine SetAnnalusFluids + + subroutine SetStringFluids(count, array) + implicit none + integer, intent(in) :: count + integer :: i, offset !, startArr + type(CFluid), intent(inout), target :: array(count) + type(CFluid), pointer :: item + DownHole%StringFluidsCount = count + print*, 'StringFluidsCount = ', count + if(size(DownHole%StringFluids) > 0) then + deallocate(DownHole%StringFluids) + end if + + !startArr = 1 + + if(count > 0) then + offset = 0; + item => array(1) + ! + !if(item%StartMd <= 0 .and. item%EndMd <= 0) then + ! StringFluidsCount = StringFluidsCount - 1 + ! count = count - 1 + ! offset = offset + 1 + ! startArr = startArr + 1 + !endif + ! + !if(count <= 0) return + + if(item%StartMd > 0) then + DownHole%StringFluidsCount = DownHole%StringFluidsCount + 1 + offset = offset + 1 + allocate(DownHole%StringFluids(DownHole%StringFluidsCount)) + DownHole%StringFluids(1)%StartMd = 0 + DownHole%StringFluids(1)%EndMd = item%StartMd + DownHole%StringFluids(1)%Density = 0 + DownHole%StringFluids(1)%MudType = FLUID_NO_MUD + endif + + !if(associated(StringMudCountPtr)) then + ! call StringMudCountPtr(count) + !end if + if(.not.allocated(DownHole%StringFluids))allocate(DownHole%StringFluids(DownHole%StringFluidsCount)) + !print*, '============START-ST============' + !print*, 'count=', count + do i = 1, count + item => array(i) + DownHole%StringFluids(i + offset)%StartMd = item%StartMd + if(i==1) DownHole%StringFluids(i)%StartMd = 0 + !print*, 'StringFluids(i)%StartMd=', StringFluids(i)%StartMd + DownHole%StringFluids(i + offset)%EndMd = item%EndMd + !print*, 'StringFluids(i)%EndMd=', StringFluids(i)%EndMd + DownHole%StringFluids(i + offset)%Density = item%Density + DownHole%StringFluids(i + offset)%MudType = item%MudType + !print*, '----------------------------' + end do + !!if(item%StartMd < 0) StringFluids(1)%StartMd = 0 + !!print*, '============END-ST============' + !if(associated(StringMudArrayPtr)) then + ! call StringMudArrayPtr(StringFluids) + !end if + end if + end subroutine SetStringFluids + + subroutine SetString(count, array) + use CLog3 + implicit none + integer, intent(in) :: count + integer :: i !, j + type(CStringComponents), intent(inout), target :: array(count) + type(CStringComponents), pointer :: item + DownHole%StringCount = count + if(size(DownHole%String) > 0) then + deallocate(DownHole%String) + end if + if(count > 0) then + !if(associated(StringComponentCountPtr)) then + ! call StringComponentCountPtr(count) + !end if + allocate(DownHole%String(count)) + !j = 0 + !print*, '============CMP-ST============' + !call Log_3( '============CMP-ST============') + !do i = count, 1, -1 + do i = 1, count + item => array(i) + !String(i)%Length = item%Length + !String(i)%TopDepth = item%TopDepth + !String(i)%DownDepth = item%DownDepth + !String(i)%Od = item%Od + !String(i)%Id = item%Id + DownHole%String(i)%ComponentType= item%ComponentType + !j = j + 1 + DownHole%String(i)%StartMd = item%TopDepth + DownHole%String(i)%EndMd = item%DownDepth + + DownHole%String(i)%ComponentType=0 + !if(item%ComponentType > 4 ) then + ! String(i)%ComponentType=0 + ! String(i)%StartMd = 0 + !endif + if(item%ComponentType == 3) DownHole%String(i)%ComponentType=0 + if(item%ComponentType == 4) DownHole%String(i)%ComponentType=1 + if(item%ComponentType == 2) DownHole%String(i)%ComponentType=2 + if(item%ComponentType == 1) DownHole%String(i)%ComponentType=3 + !print*, 'item%ComponentType=', item%ComponentType + !print*, 'String(i)%ComponentType=', String(i)%ComponentType + !print*, 'String(i)%StartMd=', String(i)%StartMd + !print*, 'String(i)%EndMd=', String(i)%EndMd + !print*, '----------------------------' + + !call Log_3( 'item%ComponentType=', item%ComponentType) + !call Log_3( 'String(i)%ComponentType=', String(i)%ComponentType) + !call Log_3( 'String(i)%StartMd=', String(i)%StartMd) + !call Log_3( 'String(i)%EndMd=', String(i)%EndMd) + !call Log_3( '----------------------------') + + end do + !!print*, '============CMP-ST============' + !!call Log_3( '============CMP-ST============') + !if(associated(StringComponentArrayPtr)) then + ! call StringComponentArrayPtr(String) + !end if + end if + end subroutine SetString + + subroutine SetBopElements(array) + use CLog4 + implicit none + integer, parameter :: count = 4 + integer :: i = 1 !, j + type(CBopElement), intent(inout), target :: array(count) + type(CBopElement), pointer :: item + if(size(DownHole%BopElements) > 0) deallocate(DownHole%BopElements) + allocate(DownHole%BopElements(count)) + + do i = 1, count + item => array(i) + !call Log_4('item%ElementStart', item%ElementStart) + !call Log_4('item%ElementEnd', item%ElementEnd) + !call Log_4('item%ElementType', item%ElementType) + !call Log_4('=====================================================') + + DownHole%BopElements(i)%ElementStart = item%ElementStart + DownHole%BopElements(i)%ElementEnd = item%ElementEnd + DownHole%BopElements(i)%ElementType = item%ElementType + end do + + !if(associated(BopElementsPtr)) call BopElementsPtr(BopElements) + end subroutine SetBopElements + end module DownHoleModule \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CBopControlPanel.f90 b/CSharp/Equipments/ControlPanels/CBopControlPanel.f90 index 6d2af0a..f03d5de 100644 --- a/CSharp/Equipments/ControlPanels/CBopControlPanel.f90 +++ b/CSharp/Equipments/ControlPanels/CBopControlPanel.f90 @@ -1,83 +1,87 @@ -module CBopControlPanel - ! use CBopControlPanel - use SimulationVariables - implicit none - public - contains - subroutine OpenAnnular() - use CManifolds - implicit none - call ChangeValve(52, .true.) - end subroutine - - subroutine CloseAnnular() - use CManifolds - implicit none - call ChangeValve(52, .false.) - end subroutine - - subroutine OpenUpperRams() - use CManifolds - implicit none - call ChangeValve(51, .true.) - end subroutine - - subroutine CloseUpperRams() - use CManifolds - implicit none - call ChangeValve(51, .false.) - end subroutine - - subroutine OpenMiddleRams() - use CManifolds - implicit none - call ToggleMiddleRams(.true.) - end subroutine - - subroutine CloseMiddleRams() - use CManifolds - implicit none - call ToggleMiddleRams(.false.) - end subroutine - - subroutine OpenKillLine() - use CManifolds - implicit none - call ChangeValve(46, .true.) - end subroutine - - subroutine CloseKillLine() - use CManifolds - implicit none - call ChangeValve(46, .false.) - end subroutine - - subroutine OpenChokeLine() - use CManifolds - implicit none - call ChangeValve(47, .true.) - !WRITE (*,*) ' valve 47 true ' - end subroutine - - subroutine CloseChokeLine() - use CManifolds - implicit none - call ChangeValve(47, .false.) - !WRITE (*,*) ' valve 47 false ' - end subroutine - - subroutine OpenLowerRams() - use CManifolds - implicit none - call ChangeValve(49, .true.) - !WRITE (*,*) ' valve 49 true ' - end subroutine - - subroutine CloseLowerRams() - use CManifolds - implicit none - call ChangeValve(49, .false.) - !WRITE (*,*) ' valve 49 false ' - end subroutine - - end module CBopControlPanel +module CBopControlPanel + ! use CBopControlPanel + use SimulationVariables + implicit none + public + contains + + ! subroutine BopControlPanelToJson(parent) + + ! end subroutine + subroutine OpenAnnular() + use CManifolds + implicit none + call ChangeValve(52, .true.) + end subroutine + + subroutine CloseAnnular() + use CManifolds + implicit none + call ChangeValve(52, .false.) + end subroutine + + subroutine OpenUpperRams() + use CManifolds + implicit none + call ChangeValve(51, .true.) + end subroutine + + subroutine CloseUpperRams() + use CManifolds + implicit none + call ChangeValve(51, .false.) + end subroutine + + subroutine OpenMiddleRams() + use CManifolds + implicit none + call ToggleMiddleRams(.true.) + end subroutine + + subroutine CloseMiddleRams() + use CManifolds + implicit none + call ToggleMiddleRams(.false.) + end subroutine + + subroutine OpenKillLine() + use CManifolds + implicit none + call ChangeValve(46, .true.) + end subroutine + + subroutine CloseKillLine() + use CManifolds + implicit none + call ChangeValve(46, .false.) + end subroutine + + subroutine OpenChokeLine() + use CManifolds + implicit none + call ChangeValve(47, .true.) + !WRITE (*,*) ' valve 47 true ' + end subroutine + + subroutine CloseChokeLine() + use CManifolds + implicit none + call ChangeValve(47, .false.) + !WRITE (*,*) ' valve 47 false ' + end subroutine + + subroutine OpenLowerRams() + use CManifolds + implicit none + call ChangeValve(49, .true.) + !WRITE (*,*) ' valve 49 true ' + end subroutine + + subroutine CloseLowerRams() + use CManifolds + implicit none + call ChangeValve(49, .false.) + !WRITE (*,*) ' valve 49 false ' + end subroutine + + end module CBopControlPanel diff --git a/CSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 b/CSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 index 4992d1f..2f05b01 100644 --- a/CSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 @@ -1,40 +1,40 @@ -module CBopControlPanelVariables - implicit none - public - Type, Public:: BopControlPanelType - ! Input vars - real(8) :: AnnularRegulatorSetControl - real(8) :: AirMasterValve - real(8) :: ByePassValve - real(8) :: AnnularValve - real(8) :: UpperRamsValve - real(8) :: MiddleRamsValve - real(8) :: KillLineValve - real(8) :: ChokeLineValve - real(8) :: LowerRamsValve - - ! Output vars - real(8) :: ManifoldPressureGauge - real(8) :: AirSupplyPressureGauge - real(8) :: AccumulatorPressureGauge - real(8) :: AnnularPressureGauge - integer :: AnnularOpenLED - integer :: AnnularCloseLED - integer :: UpperRamsOpenLED - integer :: UpperRamsCloseLED - integer :: MiddleRamsOpenLED - integer :: MiddleRamsCloseLED - integer :: KillLineOpenLED - integer :: KillLineCloseLED - integer :: ChokeLineOpenLED - integer :: ChokeLineCloseLED - integer :: LowerRamsOpenLED - integer :: LowerRamsCloseLED - real(8) :: AnnularStatus - real(8) :: UpperRamsStatus - real(8) :: MiddleRamsStatus - real(8) :: LowerRamsStatus - end type - contains - -end module CBopControlPanelVariables +module CBopControlPanelVariables + implicit none + public + Type, Public:: BopControlPanelType + ! Input vars + real(8) :: AnnularRegulatorSetControl + real(8) :: AirMasterValve + real(8) :: ByePassValve + real(8) :: AnnularValve + real(8) :: UpperRamsValve + real(8) :: MiddleRamsValve + real(8) :: KillLineValve + real(8) :: ChokeLineValve + real(8) :: LowerRamsValve + + ! Output vars + real(8) :: ManifoldPressureGauge + real(8) :: AirSupplyPressureGauge + real(8) :: AccumulatorPressureGauge + real(8) :: AnnularPressureGauge + integer :: AnnularOpenLED + integer :: AnnularCloseLED + integer :: UpperRamsOpenLED + integer :: UpperRamsCloseLED + integer :: MiddleRamsOpenLED + integer :: MiddleRamsCloseLED + integer :: KillLineOpenLED + integer :: KillLineCloseLED + integer :: ChokeLineOpenLED + integer :: ChokeLineCloseLED + integer :: LowerRamsOpenLED + integer :: LowerRamsCloseLED + real(8) :: AnnularStatus + real(8) :: UpperRamsStatus + real(8) :: MiddleRamsStatus + real(8) :: LowerRamsStatus + end type + contains + +end module CBopControlPanelVariables diff --git a/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90 b/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90 index 6f22601..bec639c 100644 --- a/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90 +++ b/CSharp/Equipments/ControlPanels/CChokeControlPanel.f90 @@ -1,162 +1,162 @@ -module CChokeControlPanel - use CChokeControlPanelVariables - use SimulationVariables - implicit none - public - contains - - ! Input routines - subroutine SetChokePanelPumpSelectorSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelPumpSelectorSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelPumpSelectorSwitch' :: SetChokePanelPumpSelectorSwitch - implicit none - integer, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%ChokePanelPumpSelectorSwitch = v -#ifdef deb - print*, 'ChokePanelPumpSelectorSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelPumpSelectorSwitch -#endif - end subroutine - - subroutine SetChokePanelStrokeResetSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelStrokeResetSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelStrokeResetSwitch' :: SetChokePanelStrokeResetSwitch - implicit none - logical, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%ChokePanelStrokeResetSwitch = v -#ifdef deb - print*, 'ChokePanelStrokeResetSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelStrokeResetSwitch -#endif - end subroutine - - subroutine SetChokeSelectorSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeSelectorSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetChokeSelectorSwitch' :: SetChokeSelectorSwitch - implicit none - logical, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch = v -#ifdef deb - print*, 'ChokeSelectorSwitch=', data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch -#endif - end subroutine - - subroutine SetChokeRateControlKnob(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeRateControlKnob - !DEC$ ATTRIBUTES ALIAS: 'SetChokeRateControlKnob' :: SetChokeRateControlKnob - implicit none - real*8, intent(in) :: v - - !character(8) :: date - !character(10) :: time - !character(5) :: zone - !integer,dimension(8) :: values - - data%EquipmentControl%ChokeControlPanel%ChokeRateControlKnob = v -#ifdef deb - !call date_and_time(date,time,zone,values) - !!print '(a,2x,a,2x,a)', date, time, zone - !print '(8i5)', values - print*, 'ChokeRateControlKnob=', data%EquipmentControl%ChokeControlPanel%ChokeRateControlKnob -#endif - end subroutine - - subroutine SetChokeControlLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeControlLever - !DEC$ ATTRIBUTES ALIAS: 'SetChokeControlLever' :: SetChokeControlLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%ChokeControlLever = v -#ifdef deb - print*, 'ChokeControlLever=', data%EquipmentControl%ChokeControlPanel%ChokeControlLever -#endif - end subroutine - - subroutine SetChokePanelRigAirSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelRigAirSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelRigAirSwitch' :: SetChokePanelRigAirSwitch - implicit none - logical, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch = v -#ifdef deb - print*, 'ChokePanelRigAirSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch -#endif - end subroutine - - - subroutine SetEnableAutoChoke(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetEnableAutoChoke - !DEC$ ATTRIBUTES ALIAS: 'SetEnableAutoChoke' :: SetEnableAutoChoke - implicit none - logical, intent(in) :: v - data%EquipmentControl%ChokeControlPanel%EnableAutoChoke = v -#ifdef deb - print*, 'EnableAutoChoke=', data%EquipmentControl%ChokeControlPanel%EnableAutoChoke -#endif - end subroutine - - - - - - - - - - - - - ! Output routines - real(8) function GetStandPipePressure() - !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipePressure - !DEC$ ATTRIBUTES ALIAS: 'GetStandPipePressure' :: GetStandPipePressure - implicit none - GetStandPipePressure = data%EquipmentControl%ChokeControlPanel%StandPipePressure - end function - - real(8) function GetCasingPressure() - !DEC$ ATTRIBUTES DLLEXPORT :: GetCasingPressure - !DEC$ ATTRIBUTES ALIAS: 'GetCasingPressure' :: GetCasingPressure - implicit none - GetCasingPressure = data%EquipmentControl%ChokeControlPanel%CasingPressure - end function - - real(8) function GetChokePosition() - !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePosition - !DEC$ ATTRIBUTES ALIAS: 'GetChokePosition' :: GetChokePosition - implicit none - GetChokePosition = data%EquipmentControl%ChokeControlPanel%ChokePosition - end function - - real(8) function GetChokePanelSPMCounter() - !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePanelSPMCounter - !DEC$ ATTRIBUTES ALIAS: 'GetChokePanelSPMCounter' :: GetChokePanelSPMCounter - implicit none - !GetChokePanelSPMCounter = 0 - GetChokePanelSPMCounter = data%EquipmentControl%ChokeControlPanel%ChokePanelSPMCounter - end function - - real(8) function GetChokePanelTotalStrokeCounter() - !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePanelTotalStrokeCounter - !DEC$ ATTRIBUTES ALIAS: 'GetChokePanelTotalStrokeCounter' :: GetChokePanelTotalStrokeCounter - implicit none - !GetChokePanelTotalStrokeCounter = 0 - GetChokePanelTotalStrokeCounter = data%EquipmentControl%ChokeControlPanel%ChokePanelTotalStrokeCounter - end function - - integer function GetChoke1LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetChoke1LED - !DEC$ ATTRIBUTES ALIAS: 'GetChoke1LED' :: GetChoke1LED - implicit none - GetChoke1LED = data%EquipmentControl%ChokeControlPanel%Choke1LED - end function - - integer function GetChoke2LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetChoke2LED - !DEC$ ATTRIBUTES ALIAS: 'GetChoke2LED' :: GetChoke2LED - implicit none - GetChoke2LED = data%EquipmentControl%ChokeControlPanel%Choke2LED - end function - - - - +module CChokeControlPanel + use CChokeControlPanelVariables + use SimulationVariables + implicit none + public + contains + + ! Input routines + subroutine SetChokePanelPumpSelectorSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelPumpSelectorSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelPumpSelectorSwitch' :: SetChokePanelPumpSelectorSwitch + implicit none + integer, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%ChokePanelPumpSelectorSwitch = v +#ifdef deb + print*, 'ChokePanelPumpSelectorSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelPumpSelectorSwitch +#endif + end subroutine + + subroutine SetChokePanelStrokeResetSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelStrokeResetSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelStrokeResetSwitch' :: SetChokePanelStrokeResetSwitch + implicit none + logical, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%ChokePanelStrokeResetSwitch = v +#ifdef deb + print*, 'ChokePanelStrokeResetSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelStrokeResetSwitch +#endif + end subroutine + + subroutine SetChokeSelectorSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeSelectorSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetChokeSelectorSwitch' :: SetChokeSelectorSwitch + implicit none + logical, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch = v +#ifdef deb + print*, 'ChokeSelectorSwitch=', data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch +#endif + end subroutine + + subroutine SetChokeRateControlKnob(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeRateControlKnob + !DEC$ ATTRIBUTES ALIAS: 'SetChokeRateControlKnob' :: SetChokeRateControlKnob + implicit none + real*8, intent(in) :: v + + !character(8) :: date + !character(10) :: time + !character(5) :: zone + !integer,dimension(8) :: values + + data%EquipmentControl%ChokeControlPanel%ChokeRateControlKnob = v +#ifdef deb + !call date_and_time(date,time,zone,values) + !!print '(a,2x,a,2x,a)', date, time, zone + !print '(8i5)', values + print*, 'ChokeRateControlKnob=', data%EquipmentControl%ChokeControlPanel%ChokeRateControlKnob +#endif + end subroutine + + subroutine SetChokeControlLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokeControlLever + !DEC$ ATTRIBUTES ALIAS: 'SetChokeControlLever' :: SetChokeControlLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%ChokeControlLever = v +#ifdef deb + print*, 'ChokeControlLever=', data%EquipmentControl%ChokeControlPanel%ChokeControlLever +#endif + end subroutine + + subroutine SetChokePanelRigAirSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetChokePanelRigAirSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetChokePanelRigAirSwitch' :: SetChokePanelRigAirSwitch + implicit none + logical, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch = v +#ifdef deb + print*, 'ChokePanelRigAirSwitch=', data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch +#endif + end subroutine + + + subroutine SetEnableAutoChoke(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetEnableAutoChoke + !DEC$ ATTRIBUTES ALIAS: 'SetEnableAutoChoke' :: SetEnableAutoChoke + implicit none + logical, intent(in) :: v + data%EquipmentControl%ChokeControlPanel%EnableAutoChoke = v +#ifdef deb + print*, 'EnableAutoChoke=', data%EquipmentControl%ChokeControlPanel%EnableAutoChoke +#endif + end subroutine + + + + + + + + + + + + + ! Output routines + real(8) function GetStandPipePressure() + !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipePressure + !DEC$ ATTRIBUTES ALIAS: 'GetStandPipePressure' :: GetStandPipePressure + implicit none + GetStandPipePressure = data%EquipmentControl%ChokeControlPanel%StandPipePressure + end function + + real(8) function GetCasingPressure() + !DEC$ ATTRIBUTES DLLEXPORT :: GetCasingPressure + !DEC$ ATTRIBUTES ALIAS: 'GetCasingPressure' :: GetCasingPressure + implicit none + GetCasingPressure = data%EquipmentControl%ChokeControlPanel%CasingPressure + end function + + real(8) function GetChokePosition() + !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePosition + !DEC$ ATTRIBUTES ALIAS: 'GetChokePosition' :: GetChokePosition + implicit none + GetChokePosition = data%EquipmentControl%ChokeControlPanel%ChokePosition + end function + + real(8) function GetChokePanelSPMCounter() + !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePanelSPMCounter + !DEC$ ATTRIBUTES ALIAS: 'GetChokePanelSPMCounter' :: GetChokePanelSPMCounter + implicit none + !GetChokePanelSPMCounter = 0 + GetChokePanelSPMCounter = data%EquipmentControl%ChokeControlPanel%ChokePanelSPMCounter + end function + + real(8) function GetChokePanelTotalStrokeCounter() + !DEC$ ATTRIBUTES DLLEXPORT :: GetChokePanelTotalStrokeCounter + !DEC$ ATTRIBUTES ALIAS: 'GetChokePanelTotalStrokeCounter' :: GetChokePanelTotalStrokeCounter + implicit none + !GetChokePanelTotalStrokeCounter = 0 + GetChokePanelTotalStrokeCounter = data%EquipmentControl%ChokeControlPanel%ChokePanelTotalStrokeCounter + end function + + integer function GetChoke1LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetChoke1LED + !DEC$ ATTRIBUTES ALIAS: 'GetChoke1LED' :: GetChoke1LED + implicit none + GetChoke1LED = data%EquipmentControl%ChokeControlPanel%Choke1LED + end function + + integer function GetChoke2LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetChoke2LED + !DEC$ ATTRIBUTES ALIAS: 'GetChoke2LED' :: GetChoke2LED + implicit none + GetChoke2LED = data%EquipmentControl%ChokeControlPanel%Choke2LED + end function + + + + end module CChokeControlPanel \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 b/CSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 index ec6912a..b931a87 100644 --- a/CSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 @@ -1,23 +1,23 @@ -module CChokeControlPanelVariables - implicit none - type, public :: ChokeControlPanelType - ! Input vars - integer :: ChokePanelPumpSelectorSwitch - logical :: ChokePanelStrokeResetSwitch - logical :: ChokeSelectorSwitch - real(8) :: ChokeRateControlKnob - real(8) :: ChokeControlLever - logical :: ChokePanelRigAirSwitch - - logical :: EnableAutoChoke - - ! Output vars - real(8) :: StandPipePressure - real(8) :: CasingPressure - real(8) :: ChokePosition - real(8) :: ChokePanelSPMCounter - real(8) :: ChokePanelTotalStrokeCounter - integer :: Choke1LED - integer :: Choke2LED - End Type ChokeControlPanelType +module CChokeControlPanelVariables + implicit none + type, public :: ChokeControlPanelType + ! Input vars + integer :: ChokePanelPumpSelectorSwitch + logical :: ChokePanelStrokeResetSwitch + logical :: ChokeSelectorSwitch + real(8) :: ChokeRateControlKnob + real(8) :: ChokeControlLever + logical :: ChokePanelRigAirSwitch + + logical :: EnableAutoChoke + + ! Output vars + real(8) :: StandPipePressure + real(8) :: CasingPressure + real(8) :: ChokePosition + real(8) :: ChokePanelSPMCounter + real(8) :: ChokePanelTotalStrokeCounter + integer :: Choke1LED + integer :: Choke2LED + End Type ChokeControlPanelType end module CChokeControlPanelVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CChokeManifold.f90 b/CSharp/Equipments/ControlPanels/CChokeManifold.f90 index 90e53c3..8c2cd01 100644 --- a/CSharp/Equipments/ControlPanels/CChokeManifold.f90 +++ b/CSharp/Equipments/ControlPanels/CChokeManifold.f90 @@ -1,41 +1,41 @@ -module CChokeManifold -! use CChokeManifoldVariables - use SimulationVariables - use CManifolds - use CLog2 - implicit none - public - contains - subroutine SetHydraulicChock1(v) - implicit none - integer, intent(in) :: v - data%EquipmentControl%ChokeManifold%HydraulicChock1 = v - if(data%EquipmentControl%ChokeManifold%HyChock1OnProblem) then - call ChangeValve(33, .true.) - else - if(v == 100) then - if(Manifold%Valve(33)%Status) call ChangeValve(33, .false.) - else - if(.not.Manifold%Valve(33)%Status) call ChangeValve(33, .true.) - endif - endif - !WRITE (*,*) ' valve 33 ', Valve(33)%Status, ' arg ', v -end subroutine - -subroutine SetHydraulicChock2(v) - implicit none - integer, intent(in) :: v - data%EquipmentControl%ChokeManifold%HydraulicChock2 = v - if(data%EquipmentControl%ChokeManifold%HyChock2OnProblem) then - call ChangeValve(34, .true.) - else - if(v==100) then - if(Manifold%Valve(34)%Status) call ChangeValve(34, .false.) - else - if(.not.Manifold%Valve(34)%Status) call ChangeValve(34, .true.) - endif - endif - !WRITE (*,*) ' valve 34 ', Valve(34)%Status, ' arg ', v -end subroutine - +module CChokeManifold +! use CChokeManifoldVariables + use SimulationVariables + use CManifolds + use CLog2 + implicit none + public + contains + subroutine SetHydraulicChock1(v) + implicit none + integer, intent(in) :: v + data%EquipmentControl%ChokeManifold%HydraulicChock1 = v + if(data%EquipmentControl%ChokeManifold%HyChock1OnProblem) then + call ChangeValve(33, .true.) + else + if(v == 100) then + if(Manifold%Valve(33)%Status) call ChangeValve(33, .false.) + else + if(.not.Manifold%Valve(33)%Status) call ChangeValve(33, .true.) + endif + endif + !WRITE (*,*) ' valve 33 ', Valve(33)%Status, ' arg ', v +end subroutine + +subroutine SetHydraulicChock2(v) + implicit none + integer, intent(in) :: v + data%EquipmentControl%ChokeManifold%HydraulicChock2 = v + if(data%EquipmentControl%ChokeManifold%HyChock2OnProblem) then + call ChangeValve(34, .true.) + else + if(v==100) then + if(Manifold%Valve(34)%Status) call ChangeValve(34, .false.) + else + if(.not.Manifold%Valve(34)%Status) call ChangeValve(34, .true.) + endif + endif + !WRITE (*,*) ' valve 34 ', Valve(34)%Status, ' arg ', v +end subroutine + end module CChokeManifold \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 b/CSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 index 9afc539..4d4f307 100644 --- a/CSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 @@ -1,36 +1,36 @@ -module CChokeManifoldVariables - implicit none - public - Type :: ChokeManifoldType - ! Input vars - logical :: ChokeManifoldValve1 - logical :: ChokeManifoldValve2 - real(8) :: LeftManualChoke - logical :: ChokeManifoldValve4 - logical :: ChokeManifoldValve5 - real(8) :: RightManualChoke - logical :: ChokeManifoldValve7 - logical :: ChokeManifoldValve8 - logical :: ChokeManifoldValve9 - logical :: ChokeManifoldValve10 - logical :: ChokeManifoldValve11 - logical :: ChokeManifoldValve12 - logical :: ChokeManifoldValve13 - - ! Output vars - integer :: HydraulicChock1 - integer :: HydraulicChock2 - - ! Control vars - logical :: HyChock1OnProblem = .false. - logical :: HyChock2OnProblem = .false. - logical :: LeftManChokeOnProblem = .false. - logical :: RightManChokeOnProblem = .false. - End Type ChokeManifoldType - - - - contains - - +module CChokeManifoldVariables + implicit none + public + Type :: ChokeManifoldType + ! Input vars + logical :: ChokeManifoldValve1 + logical :: ChokeManifoldValve2 + real(8) :: LeftManualChoke + logical :: ChokeManifoldValve4 + logical :: ChokeManifoldValve5 + real(8) :: RightManualChoke + logical :: ChokeManifoldValve7 + logical :: ChokeManifoldValve8 + logical :: ChokeManifoldValve9 + logical :: ChokeManifoldValve10 + logical :: ChokeManifoldValve11 + logical :: ChokeManifoldValve12 + logical :: ChokeManifoldValve13 + + ! Output vars + integer :: HydraulicChock1 + integer :: HydraulicChock2 + + ! Control vars + logical :: HyChock1OnProblem = .false. + logical :: HyChock2OnProblem = .false. + logical :: LeftManChokeOnProblem = .false. + logical :: RightManChokeOnProblem = .false. + End Type ChokeManifoldType + + + + contains + + endmodule CChokeManifoldVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 index 68053cb..a8c5679 100644 --- a/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 +++ b/CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 @@ -1,153 +1,153 @@ -module CDataDisplayConsole - ! use CDataDisplayConsole - use SimulationVariables - implicit none - public - contains - subroutine Set_TotalDepth(v) - use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%Depth - ! use CSimulationVariables, only: SetDistanceDrilled - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%TotalWellDepth = v - data%EquipmentControl%DrillingWatch%Depth = v - ! call SetDistanceDrilled(v) - end subroutine - - subroutine Set_BitPosition(v) - use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%BitPosition - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%BitDepth = v - data%EquipmentControl%DrillingWatch%BitPosition = v - end subroutine - - subroutine Set_RotaryTorque(v) - use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%Torque - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%RotaryTorqueGauge = v - data%EquipmentControl%DrillingWatch%Torque = v - data%EquipmentControl%DataDisplayConsole%RTTorque = v - end subroutine - - - subroutine Set_MudWeightIn(v) - use SimulationVariables !@!, only: MudWeightInDw => data%EquipmentControl%DataDisplayConsole%MudWeightIn - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%MudWeightIn = v - data%EquipmentControl%DrillingWatch%MudWeightIn = v - end subroutine - - subroutine Set_MudWeightOut(v) - use SimulationVariables !@!, only: MudWeightOutDw => data%EquipmentControl%DataDisplayConsole%MudWeightOut - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%MudWeightOut = v - data%EquipmentControl%DrillingWatch%MudWeightOut = v - end subroutine - - subroutine Set_TripTankVolume(v) - use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%TripTankVolume - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DrillingWatch%TripTankVolume = v - end subroutine - - subroutine Set_FillVolume(v) - use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%FillVolume - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DrillingWatch%FillVolume = v - end subroutine - - subroutine Set_HookLoad(v) - use SimulationVariables !@!, only: HookLoadDw => data%EquipmentControl%DataDisplayConsole%HookLoad - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%HookLoadPointer = v - data%EquipmentControl%DrillingWatch%HookLoad = v * 1000 - data%EquipmentControl%DataDisplayConsole%HookLoad = v - end subroutine - - subroutine Set_WeightOnBit(v) - use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%WeightOnBit - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%WOBPointer = v - data%EquipmentControl%DrillingWatch%WeightOnBit = v - data%EquipmentControl%DataDisplayConsole%WOP = v - end subroutine - - subroutine Set_ROP(v) - use SimulationVariables !@!, only: ROPDw => data%EquipmentControl%DataDisplayConsole%ROP - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%ROP = v - data%EquipmentControl%DrillingWatch%ROP = v - end subroutine - - subroutine Set_CasingPressure(v) - use SimulationVariables !@!, only: CasingPressureDw => CasingPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: CasingPressureChoke => CasingPressure - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%CasingPressureGauge = v - data%EquipmentControl%DrillingWatch%CasingPressure = v - data%EquipmentControl%ChokeControlPanel%CasingPressure = v - data%EquipmentControl%DataDisplayConsole%CasingPressure = v - end subroutine - - subroutine Set_StandPipePressure(v) - use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%PumpPressure - use CChokeControlPanelVariables - use SimulationVariables!, only: StandPipePressureChoke => data%EquipmentControl%DataDisplayConsole%StandPipePressure - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%StandPipePressureGauge = v - data%EquipmentControl%DrillingWatch%PumpPressure = v - data%EquipmentControl%ChokeControlPanel%StandPipePressure = v - data%EquipmentControl%DataDisplayConsole%StandPipePressure = v - - - - end subroutine - - - subroutine Set_RotaryRPMGauge(v) - use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%RPM - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%RotaryRPMGauge = v - data%EquipmentControl%DrillingWatch%RPM = v - data%EquipmentControl%DataDisplayConsole%RTRPM = v - ! call data%EquipmentControl%DataDisplayConsole%OnRotaryRpmChange%RunAll(v) - end subroutine - - - - - subroutine Set_MP1SPMGauge(v) - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%MP1SPMGauge = v - data%EquipmentControl%DataDisplayConsole%MP1SPM = v - !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%EquipmentControl%DataDisplayConsole%MP1SPMGauge, data%EquipmentControl%DataDisplayConsole%MP2SPMGauge) -#ifdef deb - print*, 'MP1SPMGauge=', data%EquipmentControl%DataDisplayConsole%MP1SPMGauge -#endif - end subroutine - - subroutine Set_MP2SPMGauge(v) - implicit none - real(8), intent(in) :: v - data%EquipmentControl%DataDisplayConsole%MP2SPMGauge = v - data%EquipmentControl%DataDisplayConsole%MP2SPM = v - !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%EquipmentControl%DataDisplayConsole%MP1SPMGauge, data%EquipmentControl%DataDisplayConsole%MP2SPMGauge) -#ifdef deb - print*, 'MP2SPMGauge=', data%EquipmentControl%DataDisplayConsole%MP2SPMGauge -#endif - end subroutine +module CDataDisplayConsole + ! use CDataDisplayConsole + use SimulationVariables + implicit none + public + contains + subroutine Set_TotalDepth(v) + use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%Depth + ! use CSimulationVariables, only: SetDistanceDrilled + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%TotalWellDepth = v + data%EquipmentControl%DrillingWatch%Depth = v + ! call SetDistanceDrilled(v) + end subroutine + + subroutine Set_BitPosition(v) + use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%BitPosition + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%BitDepth = v + data%EquipmentControl%DrillingWatch%BitPosition = v + end subroutine + + subroutine Set_RotaryTorque(v) + use SimulationVariables !@!!, only: data%EquipmentControl%DrillingWatch%Torque + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%RotaryTorqueGauge = v + data%EquipmentControl%DrillingWatch%Torque = v + data%EquipmentControl%DataDisplayConsole%RTTorque = v + end subroutine + + + subroutine Set_MudWeightIn(v) + use SimulationVariables !@!, only: MudWeightInDw => data%EquipmentControl%DataDisplayConsole%MudWeightIn + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%MudWeightIn = v + data%EquipmentControl%DrillingWatch%MudWeightIn = v + end subroutine + + subroutine Set_MudWeightOut(v) + use SimulationVariables !@!, only: MudWeightOutDw => data%EquipmentControl%DataDisplayConsole%MudWeightOut + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%MudWeightOut = v + data%EquipmentControl%DrillingWatch%MudWeightOut = v + end subroutine + + subroutine Set_TripTankVolume(v) + use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%TripTankVolume + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DrillingWatch%TripTankVolume = v + end subroutine + + subroutine Set_FillVolume(v) + use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%FillVolume + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DrillingWatch%FillVolume = v + end subroutine + + subroutine Set_HookLoad(v) + use SimulationVariables !@!, only: HookLoadDw => data%EquipmentControl%DataDisplayConsole%HookLoad + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%HookLoadPointer = v + data%EquipmentControl%DrillingWatch%HookLoad = v * 1000 + data%EquipmentControl%DataDisplayConsole%HookLoad = v + end subroutine + + subroutine Set_WeightOnBit(v) + use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%WeightOnBit + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%WOBPointer = v + data%EquipmentControl%DrillingWatch%WeightOnBit = v + data%EquipmentControl%DataDisplayConsole%WOP = v + end subroutine + + subroutine Set_ROP(v) + use SimulationVariables !@!, only: ROPDw => data%EquipmentControl%DataDisplayConsole%ROP + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%ROP = v + data%EquipmentControl%DrillingWatch%ROP = v + end subroutine + + subroutine Set_CasingPressure(v) + use SimulationVariables !@!, only: CasingPressureDw => CasingPressure + use CChokeControlPanelVariables + use SimulationVariables!, only: CasingPressureChoke => CasingPressure + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%CasingPressureGauge = v + data%EquipmentControl%DrillingWatch%CasingPressure = v + data%EquipmentControl%ChokeControlPanel%CasingPressure = v + data%EquipmentControl%DataDisplayConsole%CasingPressure = v + end subroutine + + subroutine Set_StandPipePressure(v) + use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%PumpPressure + use CChokeControlPanelVariables + use SimulationVariables!, only: StandPipePressureChoke => data%EquipmentControl%DataDisplayConsole%StandPipePressure + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%StandPipePressureGauge = v + data%EquipmentControl%DrillingWatch%PumpPressure = v + data%EquipmentControl%ChokeControlPanel%StandPipePressure = v + data%EquipmentControl%DataDisplayConsole%StandPipePressure = v + + + + end subroutine + + + subroutine Set_RotaryRPMGauge(v) + use SimulationVariables !@!, only: data%EquipmentControl%DrillingWatch%RPM + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%RotaryRPMGauge = v + data%EquipmentControl%DrillingWatch%RPM = v + data%EquipmentControl%DataDisplayConsole%RTRPM = v + ! call data%EquipmentControl%DataDisplayConsole%OnRotaryRpmChange%RunAll(v) + end subroutine + + + + + subroutine Set_MP1SPMGauge(v) + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%MP1SPMGauge = v + data%EquipmentControl%DataDisplayConsole%MP1SPM = v + !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%EquipmentControl%DataDisplayConsole%MP1SPMGauge, data%EquipmentControl%DataDisplayConsole%MP2SPMGauge) +#ifdef deb + print*, 'MP1SPMGauge=', data%EquipmentControl%DataDisplayConsole%MP1SPMGauge +#endif + end subroutine + + subroutine Set_MP2SPMGauge(v) + implicit none + real(8), intent(in) :: v + data%EquipmentControl%DataDisplayConsole%MP2SPMGauge = v + data%EquipmentControl%DataDisplayConsole%MP2SPM = v + !@data%State%unitySignals%(PumpsSpmChanges)) call PumpsSpmChanges(data%EquipmentControl%DataDisplayConsole%MP1SPMGauge, data%EquipmentControl%DataDisplayConsole%MP2SPMGauge) +#ifdef deb + print*, 'MP2SPMGauge=', data%EquipmentControl%DataDisplayConsole%MP2SPMGauge +#endif + end subroutine end module CDataDisplayConsole \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 b/CSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 index 8f76c26..9f93201 100644 --- a/CSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 @@ -1,106 +1,106 @@ -module CDataDisplayConsoleVariables - use CIActionReference - ! !**use CDoubleEventHandlerCollection - implicit none - public - - Type :: DataDisplayConsoleType - !portable - real(8) :: TripAlarmLow - real(8) :: TripAlarmHigh - real(8) :: RetFlowAlarmLow - real(8) :: RetFlowAlarmHigh - real(8) :: PitAlarmLow - real(8) :: PitAlarmHigh - - real(8) :: PortWeightOnBit - real(8) :: PortHookLoad - real(8) :: PortCasingPressure - real(8) :: PortPumpPressure - - ! Input vars - real(8) :: TripTankSetAlarmLow - real(8) :: TripTankSetAlarmHigh - integer :: TripTankSetAlarmSwitch - logical :: TripTankPowerSwitch - logical :: TripTankPumpSwitch - logical :: TripTankHornSwitch - logical :: AcidGasDetectionHornSwitch - logical :: TotalStrokeCounterResetSwitch - logical :: DrillingTrippingSelectorSwitch - real(8) :: MVTSetAlarmLowKnob - real(8) :: MVTSetAlarmHighKnob - integer :: MVTSetAlarmSwitch - logical :: MudTank1Switch - logical :: MudTank2Switch - logical :: MudTank3Switch - logical :: MudTank4Switch - real(8) :: MVTFineKnob - real(8) :: MVTCoarseKnob - logical :: MVTHornSwitch - logical :: MVTDeviationTripSelectionSwitch - logical :: MVTPowerSwitch - logical :: MFFIResetTotalStrokes - logical :: MFFIResetFillCounter - integer :: MFFIPumpSelectorSwitch - logical :: MFFIFillSPMSelectorSwitch - real(8) :: MFFISetAlarmLowKnob - real(8) :: MFFISetAlarmHighKnob - integer :: MFFISetAlarmSwitch - logical :: MFFIPowerSwitch - logical :: MFFIHornSwitch - - logical :: ResetWob - logical :: Clutch - - ! Output vars - real(8) :: WOBPointer - real(8) :: HookLoadPointer - real(8) :: TripTankGauge - integer :: TripTankAlarmLED - integer :: TripTankPumpLED - real(8) :: StandPipePressureGauge - real(8) :: CasingPressureGauge - real(8) :: MP1SPMGauge - real(8) :: MP2SPMGauge - real(8) :: ReturnLineTempGauge - real(8) :: RotaryTorqueGauge - real(8) :: RotaryRPMGauge - ! !**type(DoubleEventHandlerCollection) :: OnRotaryRpmChange - integer :: AcidGasDetectionLED - real(8) :: TotalStrokeCounter - !real(8) :: TotalStrokeCounter_temp - real(8) :: PitGainLossGauge - real(8) :: MudTanksVolumeGauge - integer :: MVTAlarmLED - real(8) :: ReturnMudFlowGauge - real(8) :: FillStrokeCounter - real(8) :: MFFITotalStrokeCounter - integer :: MFFIAlarmLED - integer :: MFFIPumpLED - real(8) :: TotalWellDepth - real(8) :: BitDepth - real(8) :: HookLoad - real(8) :: StandPipePressure - real(8) :: CasingPressure - real(8) :: MP1SPM - real(8) :: MP2SPM - real(8) :: RTTorque - real(8) :: RTRPM - real(8) :: WOP - real(8) :: ROP - real(8) :: MudWeightIn - real(8) :: MudWeightOut - logical :: Buzzer1 - logical :: Buzzer2 - logical :: Buzzer3 - logical :: Buzzer4 - End Type DataDisplayConsoleType - - - ! events - ! procedure (ActionDualDouble), pointer :: PumpsSpmChanges => null() - - contains - +module CDataDisplayConsoleVariables + use CIActionReference + ! !**use CDoubleEventHandlerCollection + implicit none + public + + Type :: DataDisplayConsoleType + !portable + real(8) :: TripAlarmLow + real(8) :: TripAlarmHigh + real(8) :: RetFlowAlarmLow + real(8) :: RetFlowAlarmHigh + real(8) :: PitAlarmLow + real(8) :: PitAlarmHigh + + real(8) :: PortWeightOnBit + real(8) :: PortHookLoad + real(8) :: PortCasingPressure + real(8) :: PortPumpPressure + + ! Input vars + real(8) :: TripTankSetAlarmLow + real(8) :: TripTankSetAlarmHigh + integer :: TripTankSetAlarmSwitch + logical :: TripTankPowerSwitch + logical :: TripTankPumpSwitch + logical :: TripTankHornSwitch + logical :: AcidGasDetectionHornSwitch + logical :: TotalStrokeCounterResetSwitch + logical :: DrillingTrippingSelectorSwitch + real(8) :: MVTSetAlarmLowKnob + real(8) :: MVTSetAlarmHighKnob + integer :: MVTSetAlarmSwitch + logical :: MudTank1Switch + logical :: MudTank2Switch + logical :: MudTank3Switch + logical :: MudTank4Switch + real(8) :: MVTFineKnob + real(8) :: MVTCoarseKnob + logical :: MVTHornSwitch + logical :: MVTDeviationTripSelectionSwitch + logical :: MVTPowerSwitch + logical :: MFFIResetTotalStrokes + logical :: MFFIResetFillCounter + integer :: MFFIPumpSelectorSwitch + logical :: MFFIFillSPMSelectorSwitch + real(8) :: MFFISetAlarmLowKnob + real(8) :: MFFISetAlarmHighKnob + integer :: MFFISetAlarmSwitch + logical :: MFFIPowerSwitch + logical :: MFFIHornSwitch + + logical :: ResetWob + logical :: Clutch + + ! Output vars + real(8) :: WOBPointer + real(8) :: HookLoadPointer + real(8) :: TripTankGauge + integer :: TripTankAlarmLED + integer :: TripTankPumpLED + real(8) :: StandPipePressureGauge + real(8) :: CasingPressureGauge + real(8) :: MP1SPMGauge + real(8) :: MP2SPMGauge + real(8) :: ReturnLineTempGauge + real(8) :: RotaryTorqueGauge + real(8) :: RotaryRPMGauge + ! !**type(DoubleEventHandlerCollection) :: OnRotaryRpmChange + integer :: AcidGasDetectionLED + real(8) :: TotalStrokeCounter + !real(8) :: TotalStrokeCounter_temp + real(8) :: PitGainLossGauge + real(8) :: MudTanksVolumeGauge + integer :: MVTAlarmLED + real(8) :: ReturnMudFlowGauge + real(8) :: FillStrokeCounter + real(8) :: MFFITotalStrokeCounter + integer :: MFFIAlarmLED + integer :: MFFIPumpLED + real(8) :: TotalWellDepth + real(8) :: BitDepth + real(8) :: HookLoad + real(8) :: StandPipePressure + real(8) :: CasingPressure + real(8) :: MP1SPM + real(8) :: MP2SPM + real(8) :: RTTorque + real(8) :: RTRPM + real(8) :: WOP + real(8) :: ROP + real(8) :: MudWeightIn + real(8) :: MudWeightOut + logical :: Buzzer1 + logical :: Buzzer2 + logical :: Buzzer3 + logical :: Buzzer4 + End Type DataDisplayConsoleType + + + ! events + ! procedure (ActionDualDouble), pointer :: PumpsSpmChanges => null() + + contains + end module CDataDisplayConsoleVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 b/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 index 471fe9d..da07e2c 100644 --- a/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 +++ b/CSharp/Equipments/ControlPanels/CDrillingConsole.f90 @@ -1,873 +1,873 @@ -module CDrillingConsole - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - ! use CSimulationVariables - use CLog4 - use CLog3 - implicit none - public - contains - - ! Input routines - subroutine SetAssignmentSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetAssignmentSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetAssignmentSwitch' :: SetAssignmentSwitch - implicit none - integer, intent(in) :: v - data%EquipmentControl%DrillingConsole%AssignmentSwitch = v -#ifdef deb - call Log_4( 'AssignmentSwitch=', data%EquipmentControl%DrillingConsole%AssignmentSwitch) -#endif - end subroutine - - subroutine SetEmergencySwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetEmergencySwitch - !DEC$ ATTRIBUTES ALIAS: 'SetEmergencySwitch' :: SetEmergencySwitch - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%EmergencySwitch = v -#ifdef deb - print*, 'EmergencySwitch=', data%EquipmentControl%DrillingConsole%EmergencySwitch -#endif - end subroutine - - subroutine SetRTTorqueLimitKnob(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetRTTorqueLimitKnob - !DEC$ ATTRIBUTES ALIAS: 'SetRTTorqueLimitKnob' :: SetRTTorqueLimitKnob - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = v -#ifdef deb - print*, 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob -#endif - end subroutine - - subroutine SetMP1CPSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetMP1CPSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetMP1CPSwitch' :: SetMP1CPSwitch - implicit none - integer, intent(in) :: v - - if(data%EquipmentControl%DrillingConsole%MP1CPSwitch == v) return - - if(SimulationState == SimulationState_Started) then - data%EquipmentControl%DrillingConsole%MP1CPSwitchI = data%EquipmentControl%DrillingConsole%MP1CPSwitchI + 1 - if(data%EquipmentControl%DrillingConsole%MP1CPSwitchI >= 1) data%EquipmentControl%DrillingConsole%MP1CPSwitch = v - if(data%EquipmentControl%DrillingConsole%MP1CPSwitchI >= 100) data%EquipmentControl%DrillingConsole%MP1CPSwitchI = 1 - !call Log_3( "MP1CPSwitchI=", MP1CPSwitchI) - !call Log_3( "MP1CPSwitch=", MP1CPSwitch) - - !MP1CPSwitch = v - endif -! if(SimulationState == SimulationState_Started) then -! !call Log_3( 'MP1CPSwitc(s)h=', MP1CPSwitch) -! if(MP1CPSwitchT /= v) then -! MP1CPSwitchT = v -! MP1CPSwitch = v -!#ifdef deb -! !print*, 'MP1CPSwitch=', MP1CPSwitch -! !call Log_3( 'MP1CPSwitch=', MP1CPSwitch) -!#endif -! endif -! else -! MP1CPSwitchT = v -! endif - end subroutine - - subroutine SetMP1Throttle(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetMP1Throttle - !DEC$ ATTRIBUTES ALIAS: 'SetMP1Throttle' :: SetMP1Throttle - implicit none - real*8, intent(in) :: v - if(data%EquipmentControl%DrillingConsole%MP1Throttle == v) return - if(SimulationState == SimulationState_Started) then - if( abs(v - data%EquipmentControl%DrillingConsole%MP1Throttle) > 0.1) data%EquipmentControl%DrillingConsole%MP1ThrottleUpdate = .true. - if(data%EquipmentControl%DrillingConsole%MP1ThrottleUpdate) data%EquipmentControl%DrillingConsole%MP1Throttle = v - - !call Log_3( 'v-mp1=', v) - !call Log_3( 'MP1Throttle=', MP1Throttle) - !call Log_3( 'MP1ThrottleUpdate=', MP1ThrottleUpdate) - - !MP1Throttle = v - endif -#ifdef deb - print*, 'MP1Throttle=', data%EquipmentControl%DrillingConsole%MP1Throttle -#endif - end subroutine - - subroutine SetMP2Switch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetMP2Switch - !DEC$ ATTRIBUTES ALIAS: 'SetMP2Switch' :: SetMP2Switch - implicit none - logical, intent(in) :: v - !call Log_3( 'v=', MP2SwitchT) - - if(data%EquipmentControl%DrillingConsole%MP2Switch == v) return - - if(SimulationState == SimulationState_Started) then - data%EquipmentControl%DrillingConsole%MP2SwitchI = data%EquipmentControl%DrillingConsole%MP2SwitchI + 1 - if(data%EquipmentControl%DrillingConsole%MP2SwitchI >= 1) data%EquipmentControl%DrillingConsole%MP2Switch = v - if(data%EquipmentControl%DrillingConsole%MP2SwitchI >= 100) data%EquipmentControl%DrillingConsole%MP2SwitchI = 1 - !call Log_3( "MP1CPSwitchI=", MP1CPSwitchI) - !call Log_3( "MP2Switch=", MP2Switch) - - !MP2Switch = v - endif - -! if(SimulationState == SimulationState_Started) then -! !call Log_3( 'MP2Switch(s)=', MP2Switch) -! if(MP2SwitchT /= v) then -! MP2SwitchT = v -! MP2Switch = v -!#ifdef deb -! !print*, 'MP2Switch=', MP2Switch -! !call Log_3( 'MP2Switch=', MP2Switch) -!#endif -! endif -! else -! MP2SwitchT = v -! !call Log_3( 'MP2SwitchTMP2SwitchTMP2SwitchT=', MP2SwitchT) -! endif - end subroutine - - subroutine SetMP2Throttle(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetMP2Throttle - !DEC$ ATTRIBUTES ALIAS: 'SetMP2Throttle' :: SetMP2Throttle - implicit none - real*8, intent(in) :: v - if(data%EquipmentControl%DrillingConsole%MP2Throttle == v) return - if(SimulationState == SimulationState_Started) then - if( abs(v - data%EquipmentControl%DrillingConsole%MP2Throttle) > 0.1) data%EquipmentControl%DrillingConsole%MP2ThrottleUpdate = .true. - if(data%EquipmentControl%DrillingConsole%MP2ThrottleUpdate) data%EquipmentControl%DrillingConsole%MP2Throttle = v - - !call Log_3( 'v-mp2=', v) - !call Log_3( 'MP2Throttle=', MP2Throttle) - !call Log_3( 'MP2ThrottleUpdate=', MP2ThrottleUpdate) - - !MP2Throttle = v - endif -#ifdef deb - print*, 'MP2Throttle=', data%EquipmentControl%DrillingConsole%MP2Throttle -#endif - end subroutine - - subroutine SetDWSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetDWSwitch' :: SetDWSwitch - implicit none - integer, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWSwitch = v -#ifdef deb - print*, 'DWSwitch=', data%EquipmentControl%DrillingConsole%DWSwitch -#endif - end subroutine - - subroutine SetDWThrottle(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWThrottle - !DEC$ ATTRIBUTES ALIAS: 'SetDWThrottle' :: SetDWThrottle - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWThrottle = v -#ifdef deb - print*, 'DWThrottle=', data%EquipmentControl%DrillingConsole%DWThrottle -#endif - end subroutine - - subroutine SetRTSwitch(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetRTSwitch - !DEC$ ATTRIBUTES ALIAS: 'SetRTSwitch' :: SetRTSwitch - implicit none - integer, intent(in) :: v - data%EquipmentControl%DrillingConsole%RTSwitch = v -#ifdef deb - print*, 'RTSwitch=', data%EquipmentControl%DrillingConsole%RTSwitch -#endif - end subroutine - - subroutine SetRTThrottle(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetRTThrottle - !DEC$ ATTRIBUTES ALIAS: 'SetRTThrottle' :: SetRTThrottle - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%RTThrottle = v -#ifdef deb - print*, 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle -#endif - end subroutine - - subroutine SetDWBreak(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWBreak - !DEC$ ATTRIBUTES ALIAS: 'SetDWBreak' :: SetDWBreak - implicit none - real*8, intent(in) :: v - !if(ForceBreak) return - data%EquipmentControl%DrillingConsole%PreviousDWBreak = data%EquipmentControl%DrillingConsole%DWBreak - data%EquipmentControl%DrillingConsole%DWBreak = v -#ifdef deb - print*, 'DWBreak=', data%EquipmentControl%DrillingConsole%DWBreak -#endif - end subroutine - - subroutine SetDWAcceleretor(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWAcceleretor - !DEC$ ATTRIBUTES ALIAS: 'SetDWAcceleretor' :: SetDWAcceleretor - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWAcceleretor = v -#ifdef deb - print*, 'DWAcceleretor=', data%EquipmentControl%DrillingConsole%DWAcceleretor -#endif - end subroutine - - subroutine SetDWTransmisionLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWTransmisionLever - !DEC$ ATTRIBUTES ALIAS: 'SetDWTransmisionLever' :: SetDWTransmisionLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWTransmisionLever = v -#ifdef deb - print*, 'DWTransmisionLever=', data%EquipmentControl%DrillingConsole%DWTransmisionLever -#endif - end subroutine - - subroutine SetDWPowerLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWPowerLever - !DEC$ ATTRIBUTES ALIAS: 'SetDWPowerLever' :: SetDWPowerLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWPowerLever = v -#ifdef deb - print*, 'DWPowerLever=', data%EquipmentControl%DrillingConsole%DWPowerLever -#endif - end subroutine - - subroutine SetTongLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTongLever - !DEC$ ATTRIBUTES ALIAS: 'SetTongLever' :: SetTongLever - implicit none - real*8, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%TongLever == v) return - data%EquipmentControl%DrillingConsole%TongLever = v - - ! if(dint(TongLever) == 1.0) then - ! call OnBreakoutLeverPress%RunAll() -! #ifdef deb - ! print*, 'OnBreakoutLeverPress=', size(OnBreakoutLeverPress%Delegates) -! #endif - ! endif - ! if(dint(TongLever) == -1.0) then - ! call OnMakeupLeverPress%RunAll() - -! #ifdef deb -! print*, 'OnMakeupPress=', size(OnMakeupLeverPress%Delegates) -! #endif -! endif - ! if(dint(TongLever) == 0.0) then - ! call OnTongNeutralPress%RunAll() -! #ifdef deb -! print*, 'OnTongNeutralPress=', size(OnTongNeutralPress%Delegates) -! #endif -! endif - -#ifdef deb - print*, 'TongLever=', data%EquipmentControl%DrillingConsole%TongLever -#endif - end subroutine - - subroutine SetRTTransmissionLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetRTTransmissionLever - !DEC$ ATTRIBUTES ALIAS: 'SetRTTransmissionLever' :: SetRTTransmissionLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%RTTransmissionLever = v -#ifdef deb - print*, 'RTTransmissionLever=', data%EquipmentControl%DrillingConsole%RTTransmissionLever -#endif - end subroutine - - subroutine SetDWClutchLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetDWClutchLever - !DEC$ ATTRIBUTES ALIAS: 'SetDWClutchLever' :: SetDWClutchLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%DWClutchLever = v -#ifdef deb - print*, 'DWClutchLever=', data%EquipmentControl%DrillingConsole%DWClutchLever -#endif - end subroutine - - subroutine SetEddyBreakLever(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetEddyBreakLever - !DEC$ ATTRIBUTES ALIAS: 'SetEddyBreakLever' :: SetEddyBreakLever - implicit none - real*8, intent(in) :: v - data%EquipmentControl%DrillingConsole%EddyBreakLever = v -#ifdef deb - print*, 'EddyBreakLever=', data%EquipmentControl%DrillingConsole%EddyBreakLever -#endif - end subroutine - - subroutine SetAutoDW(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetAutoDW - !DEC$ ATTRIBUTES ALIAS: 'SetAutoDW' :: SetAutoDW - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%AutoDW = v -#ifdef deb - print*, 'AutoDW=', data%EquipmentControl%DrillingConsole%AutoDW -#endif - end subroutine - - subroutine SetGEN1(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN1 - !DEC$ ATTRIBUTES ALIAS: 'SetGEN1' :: SetGEN1 - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%GEN1 = v -#ifdef deb - print*, 'GEN1=', data%EquipmentControl%DrillingConsole%GEN1 -#endif - end subroutine - - subroutine SetGEN2(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN2 - !DEC$ ATTRIBUTES ALIAS: 'SetGEN2' :: SetGEN2 - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%GEN2 = v -#ifdef deb - print*, 'GEN2=', data%EquipmentControl%DrillingConsole%GEN2 -#endif - end subroutine - - subroutine SetGEN3(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN3 - !DEC$ ATTRIBUTES ALIAS: 'SetGEN3' :: SetGEN3 - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%GEN3 = v -#ifdef deb - print*, 'GEN3=', data%EquipmentControl%DrillingConsole%GEN3 -#endif - end subroutine - - subroutine SetGEN4(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN4 - !DEC$ ATTRIBUTES ALIAS: 'SetGEN4' :: SetGEN4 - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%GEN4 = v -#ifdef deb - print*, 'GEN4=', data%EquipmentControl%DrillingConsole%GEN4 -#endif - end subroutine - -! subroutine SetInstallSafetyValve(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetInstallSafetyValve -! !DEC$ ATTRIBUTES ALIAS: 'SetInstallSafetyValve' :: SetInstallSafetyValve -! implicit none -! logical, intent(in) :: v -! InstallSafetyValve = v -!#ifdef deb -! print*, 'InstallSafetyValve=', InstallSafetyValve -!#endif -! end subroutine -! -! subroutine SetOpenSafetyValve(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenSafetyValve -! !DEC$ ATTRIBUTES ALIAS: 'SetOpenSafetyValve' :: SetOpenSafetyValve -! implicit none -! logical, intent(in) :: v -! OpenSafetyValve = v -!#ifdef deb -! print*, 'OpenSafetyValve=', OpenSafetyValve -!#endif -! end subroutine -! -! subroutine SetRemoveSafetyValve(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetRemoveSafetyValve -! !DEC$ ATTRIBUTES ALIAS: 'SetRemoveSafetyValve' :: SetRemoveSafetyValve -! implicit none -! logical, intent(in) :: v -! RemoveSafetyValve = v -!#ifdef deb -! print*, 'RemoveSafetyValve=', RemoveSafetyValve -!#endif -! end subroutine -! -! subroutine SetCloseSafetyValve(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseSafetyValve -! !DEC$ ATTRIBUTES ALIAS: 'SetCloseSafetyValve' :: SetCloseSafetyValve -! implicit none -! logical, intent(in) :: v -! CloseSafetyValve = v -!#ifdef deb -! print*, 'CloseSafetyValve=', CloseSafetyValve -!#endif -! end subroutine -! -! subroutine SetMakeJoint(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetMakeJoint -! !DEC$ ATTRIBUTES ALIAS: 'SetMakeJoint' :: SetMakeJoint -! implicit none -! logical, intent(in) :: v -! MakeJoint = v -!#ifdef deb -! print*, 'MakeJoint=', MakeJoint -!#endif -! end subroutine -! -! subroutine SetBreakJoint(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: SetBreakJoint -! !DEC$ ATTRIBUTES ALIAS: 'SetBreakJoint' :: SetBreakJoint -! implicit none -! logical, intent(in) :: v -! BreakJoint = v -!#ifdef deb -! print*, 'BreakJoint=', BreakJoint -!#endif -! end subroutine - - subroutine SetOpenKellyCock(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenKellyCock - !DEC$ ATTRIBUTES ALIAS: 'SetOpenKellyCock' :: SetOpenKellyCock - use CManifolds, OpenKellyCockSub => OpenKellyCock - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%OpenKellyCock == v) return - data%EquipmentControl%DrillingConsole%OpenKellyCock = v - ! if (v) call OnOpenKellyCockPress%RunAll() - if(v .and. data%EquipmentControl%DrillingConsole%Permission_OpenKellyCock) call OpenKellyCockSub() -#ifdef deb - print*, 'OpenKellyCock=', data%EquipmentControl%DrillingConsole%OpenKellyCock -#endif - end subroutine - - subroutine SetCloseKellyCock(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseKellyCock - !DEC$ ATTRIBUTES ALIAS: 'SetCloseKellyCock' :: SetCloseKellyCock - use CManifolds, CloseKellyCockSub => CloseKellyCock - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%CloseKellyCock == v) return - data%EquipmentControl%DrillingConsole%CloseKellyCock = v - ! if (v) call OnCloseKellyCockPress%RunAll() - if(v .and. data%EquipmentControl%DrillingConsole%Permission_CloseKellyCock) call CloseKellyCockSub() -#ifdef deb - print*, 'CloseKellyCock=', data%EquipmentControl%DrillingConsole%CloseKellyCock -#endif - end subroutine - - subroutine SetOpenSafetyValve(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenSafetyValve - !DEC$ ATTRIBUTES ALIAS: 'SetOpenSafetyValve' :: SetOpenSafetyValve - !use CManifolds, OpenSafetyValveSub => OpenSafetyValve - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%OpenSafetyValve == v) return - data%EquipmentControl%DrillingConsole%OpenSafetyValve = v - ! if (v) call OnOpenSafetyValvePress%RunAll() - !if(v .and. Permission_OpenSafetyValve) call OpenSafetyValveSub() -#ifdef deb - print*, 'OpenSafetyValve=', data%EquipmentControl%DrillingConsole%OpenSafetyValve -#endif - end subroutine - - subroutine SetCloseSafetyValve(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseSafetyValve - !DEC$ ATTRIBUTES ALIAS: 'SetCloseSafetyValve' :: SetCloseSafetyValve - !use CManifolds, CloseSafetyValveSub => CloseSafetyValve - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%CloseSafetyValve == v) return - data%EquipmentControl%DrillingConsole%CloseSafetyValve = v - ! if (v) call OnCloseSafetyValvePress%RunAll() - !if(v .and. Permission_CloseSafetyValve) call CloseSafetyValveSub() -#ifdef deb - print*, 'CloseSafetyValve=', data%EquipmentControl%DrillingConsole%CloseSafetyValve -#endif - end subroutine - - subroutine SetIRSafetyValve(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetIRSafetyValve - !DEC$ ATTRIBUTES ALIAS: 'SetIRSafetyValve' :: SetIRSafetyValve - use CManifolds - implicit none - logical, intent(in) :: v - logical :: prev - if (data%EquipmentControl%DrillingConsole%IRSafetyValve == v) return - prev = data%EquipmentControl%DrillingConsole%IRSafetyValve - data%EquipmentControl%DrillingConsole%IRSafetyValve = v - ! if (v) call OnIRSafetyValvePress%RunAll() - !if(prev /= IRSafetyValve .and. v .and. Permission_IRSafetyValve) call ToggleSafetyValve() - !if(prev /= IRSafetyValve .and. v) call ToggleSafetyValve() -#ifdef deb - print*, 'IRSafetyValve=', data%EquipmentControl%DrillingConsole%IRSafetyValve -#endif - end subroutine - - subroutine SetIRIBop(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetIRIBop - !DEC$ ATTRIBUTES ALIAS: 'SetIRIBop' :: SetIRIBop - use CManifolds - implicit none - logical, intent(in) :: v - logical :: prev - if (data%EquipmentControl%DrillingConsole%IRIBop == v) return - prev = data%EquipmentControl%DrillingConsole%IRIBop - data%EquipmentControl%DrillingConsole%IRIBop = v - ! if (v) call OnIRIBopPress%RunAll() - !if(prev /= IRIBop .and. v .and. Permission_IRIBop) call ToggleIBop() - !if(prev /= IRIBop .and. v) call ToggleIBop() -#ifdef deb - print*, 'IRIBop=', data%EquipmentControl%DrillingConsole%IRIBop -#endif - end subroutine - - - - subroutine SetLatchPipe(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetLatchPipe - !DEC$ ATTRIBUTES ALIAS: 'SetLatchPipe' :: SetLatchPipe - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%LatchPipe .eqv. v) return - data%EquipmentControl%DrillingConsole%LatchPipe = v - ! if (v) call OnLatchPipePress%RunAll() -#ifdef deb - print*, 'LatchPipe=', data%EquipmentControl%DrillingConsole%LatchPipe -#endif - end subroutine - - subroutine SetUnlatchPipe(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetUnlatchPipe - !DEC$ ATTRIBUTES ALIAS: 'SetUnlatchPipe' :: SetUnlatchPipe - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%UnlatchPipe .eqv. v) return - data%EquipmentControl%DrillingConsole%UnlatchPipe = v - ! if (v) call OnUnlatchPipePress%RunAll() -#ifdef deb - print*, 'UnlatchPipe=', data%EquipmentControl%DrillingConsole%UnlatchPipe -#endif - end subroutine - - subroutine SetSwing(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetSwing - !DEC$ ATTRIBUTES ALIAS: 'SetSwing' :: SetSwing - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%Swing .eqv. v) return - data%EquipmentControl%DrillingConsole%Swing = v - ! if (v) call OnSwingPress%RunAll() -#ifdef deb - print*, 'Swing=', data%EquipmentControl%DrillingConsole%Swing -#endif - end subroutine - - subroutine SetFillMouseHole(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetFillMouseHole - !DEC$ ATTRIBUTES ALIAS: 'SetFillMouseHole' :: SetFillMouseHole - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%FillMouseHole .eqv. v) return - data%EquipmentControl%DrillingConsole%FillMouseHole = v - ! if (v) call OnFillMouseHolePress%RunAll() -#ifdef deb - print*, 'FillMouseHole=', data%EquipmentControl%DrillingConsole%FillMouseHole -#endif - end subroutine - - subroutine SetSlips(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetSlips - !DEC$ ATTRIBUTES ALIAS: 'SetSlips' :: SetSlips - implicit none - logical, intent(in) :: v - if (data%EquipmentControl%DrillingConsole%Slips .eqv. v) return - data%EquipmentControl%DrillingConsole%Slips = v -#ifdef deb - print*, 'Slips=', data%EquipmentControl%DrillingConsole%Slips -#endif - ! if (v) call OnSlipsPress%RunAll() - end subroutine - - - subroutine SetBrakeLeverCoefficient(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetBrakeLeverCoefficient - !DEC$ ATTRIBUTES ALIAS: 'SetBrakeLeverCoefficient' :: SetBrakeLeverCoefficient - implicit none - real, intent(in) :: v - data%EquipmentControl%DrillingConsole%BrakeLeverCoefficient = v -#ifdef deb - print*, 'BrakeLeverCoefficient=', data%EquipmentControl%DrillingConsole%BrakeLeverCoefficient -#endif - end subroutine - - subroutine SetHideDrillingBrake(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetHideDrillingBrake - !DEC$ ATTRIBUTES ALIAS: 'SetHideDrillingBrake' :: SetHideDrillingBrake - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%HideDrillingBrake = v -#ifdef deb - print*, 'HideDrillingBrake=', data%EquipmentControl%DrillingConsole%HideDrillingBrake -#endif - end subroutine - - - - - - - - - subroutine SetParkingBrake(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetParkingBrake - !DEC$ ATTRIBUTES ALIAS: 'SetParkingBrake' :: SetParkingBrake - implicit none - logical, intent(in) :: v - data%EquipmentControl%DrillingConsole%ParkingBrakeBtn = v -#ifdef deb - print*, 'ParkingBrakeBtn=', data%EquipmentControl%DrillingConsole%ParkingBrakeBtn -#endif - end subroutine - - - - - - - - - - - - - ! Output routines - - logical function GetParkingBrakeLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetParkingBrakeLed - !DEC$ ATTRIBUTES ALIAS: 'GetParkingBrakeLed' :: GetParkingBrakeLed - implicit none - GetParkingBrakeLed = data%EquipmentControl%DrillingConsole%ParkingBrakeLed - !GetParkingBrakeLed = .true. - end function - - - integer function GetGEN1LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN1LED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN1LED' :: GetGEN1LED - implicit none - GetGEN1LED = 1 - !GetGEN1LED = GEN1LED - end function - - integer function GetGEN2LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN2LED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN2LED' :: GetGEN2LED - implicit none - GetGEN2LED = 1 - !GetGEN2LED = GEN2LED - end function - - integer function GetGEN3LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN3LED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN3LED' :: GetGEN3LED - implicit none - GetGEN3LED = 1 - !GetGEN3LED = GEN3LED - end function - - integer function GetGEN4LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN4LED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN4LED' :: GetGEN4LED - implicit none - GetGEN4LED = 1 - !GetGEN4LED = GEN4LED - end function - - integer function GetSCR1LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR1LED - !DEC$ ATTRIBUTES ALIAS: 'GetSCR1LED' :: GetSCR1LED - implicit none - GetSCR1LED = data%EquipmentControl%DrillingConsole%SCR1LED - end function - - integer function GetSCR2LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR2LED - !DEC$ ATTRIBUTES ALIAS: 'GetSCR2LED' :: GetSCR2LED - implicit none - GetSCR2LED = data%EquipmentControl%DrillingConsole%SCR2LED - end function - - integer function GetSCR3LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR3LED - !DEC$ ATTRIBUTES ALIAS: 'GetSCR3LED' :: GetSCR3LED - implicit none - GetSCR3LED = data%EquipmentControl%DrillingConsole%SCR3LED - end function - - integer function GetSCR4LED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR4LED - !DEC$ ATTRIBUTES ALIAS: 'GetSCR4LED' :: GetSCR4LED - implicit none - GetSCR4LED = data%EquipmentControl%DrillingConsole%SCR4LED - end function - - integer function GetMP1BLWR() - !DEC$ ATTRIBUTES DLLEXPORT :: GetMP1BLWR - !DEC$ ATTRIBUTES ALIAS: 'GetMP1BLWR' :: GetMP1BLWR - implicit none - GetMP1BLWR = data%EquipmentControl%DrillingConsole%MP1BLWR - end function - - integer function GetMP2BLWR() - !DEC$ ATTRIBUTES DLLEXPORT :: GetMP2BLWR - !DEC$ ATTRIBUTES ALIAS: 'GetMP2BLWR' :: GetMP2BLWR - implicit none - GetMP2BLWR = data%EquipmentControl%DrillingConsole%MP2BLWR - end function - - integer function GetDWBLWR() - !DEC$ ATTRIBUTES DLLEXPORT :: GetDWBLWR - !DEC$ ATTRIBUTES ALIAS: 'GetDWBLWR' :: GetDWBLWR - implicit none - GetDWBLWR = data%EquipmentControl%DrillingConsole%DWBLWR - end function - - integer function GetRTBLWR() - !DEC$ ATTRIBUTES DLLEXPORT :: GetRTBLWR - !DEC$ ATTRIBUTES ALIAS: 'GetRTBLWR' :: GetRTBLWR - implicit none - GetRTBLWR = data%EquipmentControl%DrillingConsole%RTBLWR - end function - - integer function GetPWRLIM() - !DEC$ ATTRIBUTES DLLEXPORT :: GetPWRLIM - !DEC$ ATTRIBUTES ALIAS: 'GetPWRLIM' :: GetPWRLIM - implicit none - GetPWRLIM = data%EquipmentControl%DrillingConsole%PWRLIM - end function - - real(8) function GetPWRLIMMTR() - !DEC$ ATTRIBUTES DLLEXPORT :: GetPWRLIMMTR - !DEC$ ATTRIBUTES ALIAS: 'GetPWRLIMMTR' :: GetPWRLIMMTR - implicit none - GetPWRLIMMTR = data%EquipmentControl%DrillingConsole%PWRLIMMTR - end function - - real(8) function GetRTTorqueLimitGauge() - !DEC$ ATTRIBUTES DLLEXPORT :: GetRTTorqueLimitGauge - !DEC$ ATTRIBUTES ALIAS: 'GetRTTorqueLimitGauge' :: GetRTTorqueLimitGauge - implicit none - GetRTTorqueLimitGauge = data%EquipmentControl%DrillingConsole%RTTorqueLimitGauge - end function - - integer function GetAutoDWLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetAutoDWLED - !DEC$ ATTRIBUTES ALIAS: 'GetAutoDWLED' :: GetAutoDWLED - implicit none - GetAutoDWLED = data%EquipmentControl%DrillingConsole%AutoDWLED - end function - - integer function GetGEN1BTNLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN1BTNLED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN1BTNLED' :: GetGEN1BTNLED - implicit none - GetGEN1BTNLED = data%EquipmentControl%DrillingConsole%GEN1BTNLED - end function - - integer function GetGEN2BTNLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN2BTNLED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN2BTNLED' :: GetGEN2BTNLED - implicit none - GetGEN2BTNLED = data%EquipmentControl%DrillingConsole%GEN2BTNLED - end function - - integer function GetGEN3BTNLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN3BTNLED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN3BTNLED' :: GetGEN3BTNLED - implicit none - GetGEN3BTNLED = data%EquipmentControl%DrillingConsole%GEN3BTNLED - end function - - integer function GetGEN4BTNLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN4BTNLED - !DEC$ ATTRIBUTES ALIAS: 'GetGEN4BTNLED' :: GetGEN4BTNLED - implicit none - GetGEN4BTNLED = data%EquipmentControl%DrillingConsole%GEN4BTNLED - end function - - integer function GetOpenKellyCockLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetOpenKellyCockLed - !DEC$ ATTRIBUTES ALIAS: 'GetOpenKellyCockLed' :: GetOpenKellyCockLed - implicit none - GetOpenKellyCockLed = data%EquipmentControl%DrillingConsole%OpenKellyCockLed - end function - - integer function GetCloseKellyCockLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetCloseKellyCockLed - !DEC$ ATTRIBUTES ALIAS: 'GetCloseKellyCockLed' :: GetCloseKellyCockLed - implicit none - GetCloseKellyCockLed = data%EquipmentControl%DrillingConsole%CloseKellyCockLed - end function - - integer function GetOpenSafetyValveLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetOpenSafetyValveLed - !DEC$ ATTRIBUTES ALIAS: 'GetOpenSafetyValveLed' :: GetOpenSafetyValveLed - implicit none - GetOpenSafetyValveLed = data%EquipmentControl%DrillingConsole%OpenSafetyValveLed - end function - - integer function GetCloseSafetyValveLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetCloseSafetyValveLed - !DEC$ ATTRIBUTES ALIAS: 'GetCloseSafetyValveLed' :: GetCloseSafetyValveLed - implicit none - GetCloseSafetyValveLed = data%EquipmentControl%DrillingConsole%CloseSafetyValveLed - end function - - integer function GetIRSafetyValveLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetIRSafetyValveLed - !DEC$ ATTRIBUTES ALIAS: 'GetIRSafetyValveLed' :: GetIRSafetyValveLed - implicit none - GetIRSafetyValveLed = data%EquipmentControl%DrillingConsole%IRSafetyValveLed - end function - - integer function GetIRIBopLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetIRIBopLed - !DEC$ ATTRIBUTES ALIAS: 'GetIRIBopLed' :: GetIRIBopLed - implicit none - GetIRIBopLed = data%EquipmentControl%DrillingConsole%IRIBopLed - end function - - - integer function GetLatchPipeLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetLatchPipeLED - !DEC$ ATTRIBUTES ALIAS: 'GetLatchPipeLED' :: GetLatchPipeLED - implicit none - GetLatchPipeLED = data%EquipmentControl%DrillingConsole%LatchPipeLED - end function - - integer function GetUnlatchPipeLED() - !DEC$ ATTRIBUTES DLLEXPORT :: GetUnlatchPipeLED - !DEC$ ATTRIBUTES ALIAS: 'GetUnlatchPipeLED' :: GetUnlatchPipeLED - implicit none - GetUnlatchPipeLED = data%EquipmentControl%DrillingConsole%UnlatchPipeLED - end function - - integer function GetSwingLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSwingLed - !DEC$ ATTRIBUTES ALIAS: 'GetSwingLed' :: GetSwingLed - implicit none - GetSwingLed = data%EquipmentControl%DrillingConsole%SwingLed - end function - - integer function GetFillMouseHoleLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetFillMouseHoleLed - !DEC$ ATTRIBUTES ALIAS: 'GetFillMouseHoleLed' :: GetFillMouseHoleLed - implicit none - GetFillMouseHoleLed = data%EquipmentControl%DrillingConsole%FillMouseHoleLed - end function - +module CDrillingConsole + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + ! use CSimulationVariables + use CLog4 + use CLog3 + implicit none + public + contains + + ! Input routines + subroutine SetAssignmentSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetAssignmentSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetAssignmentSwitch' :: SetAssignmentSwitch + implicit none + integer, intent(in) :: v + data%EquipmentControl%DrillingConsole%AssignmentSwitch = v +#ifdef deb + call Log_4( 'AssignmentSwitch=', data%EquipmentControl%DrillingConsole%AssignmentSwitch) +#endif + end subroutine + + subroutine SetEmergencySwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetEmergencySwitch + !DEC$ ATTRIBUTES ALIAS: 'SetEmergencySwitch' :: SetEmergencySwitch + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%EmergencySwitch = v +#ifdef deb + print*, 'EmergencySwitch=', data%EquipmentControl%DrillingConsole%EmergencySwitch +#endif + end subroutine + + subroutine SetRTTorqueLimitKnob(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetRTTorqueLimitKnob + !DEC$ ATTRIBUTES ALIAS: 'SetRTTorqueLimitKnob' :: SetRTTorqueLimitKnob + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = v +#ifdef deb + print*, 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob +#endif + end subroutine + + subroutine SetMP1CPSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetMP1CPSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetMP1CPSwitch' :: SetMP1CPSwitch + implicit none + integer, intent(in) :: v + + if(data%EquipmentControl%DrillingConsole%MP1CPSwitch == v) return + + if(SimulationState == SimulationState_Started) then + data%EquipmentControl%DrillingConsole%MP1CPSwitchI = data%EquipmentControl%DrillingConsole%MP1CPSwitchI + 1 + if(data%EquipmentControl%DrillingConsole%MP1CPSwitchI >= 1) data%EquipmentControl%DrillingConsole%MP1CPSwitch = v + if(data%EquipmentControl%DrillingConsole%MP1CPSwitchI >= 100) data%EquipmentControl%DrillingConsole%MP1CPSwitchI = 1 + !call Log_3( "MP1CPSwitchI=", MP1CPSwitchI) + !call Log_3( "MP1CPSwitch=", MP1CPSwitch) + + !MP1CPSwitch = v + endif +! if(SimulationState == SimulationState_Started) then +! !call Log_3( 'MP1CPSwitc(s)h=', MP1CPSwitch) +! if(MP1CPSwitchT /= v) then +! MP1CPSwitchT = v +! MP1CPSwitch = v +!#ifdef deb +! !print*, 'MP1CPSwitch=', MP1CPSwitch +! !call Log_3( 'MP1CPSwitch=', MP1CPSwitch) +!#endif +! endif +! else +! MP1CPSwitchT = v +! endif + end subroutine + + subroutine SetMP1Throttle(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetMP1Throttle + !DEC$ ATTRIBUTES ALIAS: 'SetMP1Throttle' :: SetMP1Throttle + implicit none + real*8, intent(in) :: v + if(data%EquipmentControl%DrillingConsole%MP1Throttle == v) return + if(SimulationState == SimulationState_Started) then + if( abs(v - data%EquipmentControl%DrillingConsole%MP1Throttle) > 0.1) data%EquipmentControl%DrillingConsole%MP1ThrottleUpdate = .true. + if(data%EquipmentControl%DrillingConsole%MP1ThrottleUpdate) data%EquipmentControl%DrillingConsole%MP1Throttle = v + + !call Log_3( 'v-mp1=', v) + !call Log_3( 'MP1Throttle=', MP1Throttle) + !call Log_3( 'MP1ThrottleUpdate=', MP1ThrottleUpdate) + + !MP1Throttle = v + endif +#ifdef deb + print*, 'MP1Throttle=', data%EquipmentControl%DrillingConsole%MP1Throttle +#endif + end subroutine + + subroutine SetMP2Switch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetMP2Switch + !DEC$ ATTRIBUTES ALIAS: 'SetMP2Switch' :: SetMP2Switch + implicit none + logical, intent(in) :: v + !call Log_3( 'v=', MP2SwitchT) + + if(data%EquipmentControl%DrillingConsole%MP2Switch == v) return + + if(SimulationState == SimulationState_Started) then + data%EquipmentControl%DrillingConsole%MP2SwitchI = data%EquipmentControl%DrillingConsole%MP2SwitchI + 1 + if(data%EquipmentControl%DrillingConsole%MP2SwitchI >= 1) data%EquipmentControl%DrillingConsole%MP2Switch = v + if(data%EquipmentControl%DrillingConsole%MP2SwitchI >= 100) data%EquipmentControl%DrillingConsole%MP2SwitchI = 1 + !call Log_3( "MP1CPSwitchI=", MP1CPSwitchI) + !call Log_3( "MP2Switch=", MP2Switch) + + !MP2Switch = v + endif + +! if(SimulationState == SimulationState_Started) then +! !call Log_3( 'MP2Switch(s)=', MP2Switch) +! if(MP2SwitchT /= v) then +! MP2SwitchT = v +! MP2Switch = v +!#ifdef deb +! !print*, 'MP2Switch=', MP2Switch +! !call Log_3( 'MP2Switch=', MP2Switch) +!#endif +! endif +! else +! MP2SwitchT = v +! !call Log_3( 'MP2SwitchTMP2SwitchTMP2SwitchT=', MP2SwitchT) +! endif + end subroutine + + subroutine SetMP2Throttle(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetMP2Throttle + !DEC$ ATTRIBUTES ALIAS: 'SetMP2Throttle' :: SetMP2Throttle + implicit none + real*8, intent(in) :: v + if(data%EquipmentControl%DrillingConsole%MP2Throttle == v) return + if(SimulationState == SimulationState_Started) then + if( abs(v - data%EquipmentControl%DrillingConsole%MP2Throttle) > 0.1) data%EquipmentControl%DrillingConsole%MP2ThrottleUpdate = .true. + if(data%EquipmentControl%DrillingConsole%MP2ThrottleUpdate) data%EquipmentControl%DrillingConsole%MP2Throttle = v + + !call Log_3( 'v-mp2=', v) + !call Log_3( 'MP2Throttle=', MP2Throttle) + !call Log_3( 'MP2ThrottleUpdate=', MP2ThrottleUpdate) + + !MP2Throttle = v + endif +#ifdef deb + print*, 'MP2Throttle=', data%EquipmentControl%DrillingConsole%MP2Throttle +#endif + end subroutine + + subroutine SetDWSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetDWSwitch' :: SetDWSwitch + implicit none + integer, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWSwitch = v +#ifdef deb + print*, 'DWSwitch=', data%EquipmentControl%DrillingConsole%DWSwitch +#endif + end subroutine + + subroutine SetDWThrottle(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWThrottle + !DEC$ ATTRIBUTES ALIAS: 'SetDWThrottle' :: SetDWThrottle + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWThrottle = v +#ifdef deb + print*, 'DWThrottle=', data%EquipmentControl%DrillingConsole%DWThrottle +#endif + end subroutine + + subroutine SetRTSwitch(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetRTSwitch + !DEC$ ATTRIBUTES ALIAS: 'SetRTSwitch' :: SetRTSwitch + implicit none + integer, intent(in) :: v + data%EquipmentControl%DrillingConsole%RTSwitch = v +#ifdef deb + print*, 'RTSwitch=', data%EquipmentControl%DrillingConsole%RTSwitch +#endif + end subroutine + + subroutine SetRTThrottle(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetRTThrottle + !DEC$ ATTRIBUTES ALIAS: 'SetRTThrottle' :: SetRTThrottle + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%RTThrottle = v +#ifdef deb + print*, 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle +#endif + end subroutine + + subroutine SetDWBreak(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWBreak + !DEC$ ATTRIBUTES ALIAS: 'SetDWBreak' :: SetDWBreak + implicit none + real*8, intent(in) :: v + !if(ForceBreak) return + data%EquipmentControl%DrillingConsole%PreviousDWBreak = data%EquipmentControl%DrillingConsole%DWBreak + data%EquipmentControl%DrillingConsole%DWBreak = v +#ifdef deb + print*, 'DWBreak=', data%EquipmentControl%DrillingConsole%DWBreak +#endif + end subroutine + + subroutine SetDWAcceleretor(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWAcceleretor + !DEC$ ATTRIBUTES ALIAS: 'SetDWAcceleretor' :: SetDWAcceleretor + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWAcceleretor = v +#ifdef deb + print*, 'DWAcceleretor=', data%EquipmentControl%DrillingConsole%DWAcceleretor +#endif + end subroutine + + subroutine SetDWTransmisionLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWTransmisionLever + !DEC$ ATTRIBUTES ALIAS: 'SetDWTransmisionLever' :: SetDWTransmisionLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWTransmisionLever = v +#ifdef deb + print*, 'DWTransmisionLever=', data%EquipmentControl%DrillingConsole%DWTransmisionLever +#endif + end subroutine + + subroutine SetDWPowerLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWPowerLever + !DEC$ ATTRIBUTES ALIAS: 'SetDWPowerLever' :: SetDWPowerLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWPowerLever = v +#ifdef deb + print*, 'DWPowerLever=', data%EquipmentControl%DrillingConsole%DWPowerLever +#endif + end subroutine + + subroutine SetTongLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTongLever + !DEC$ ATTRIBUTES ALIAS: 'SetTongLever' :: SetTongLever + implicit none + real*8, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%TongLever == v) return + data%EquipmentControl%DrillingConsole%TongLever = v + + ! if(dint(TongLever) == 1.0) then + ! call OnBreakoutLeverPress%RunAll() +! #ifdef deb + ! print*, 'OnBreakoutLeverPress=', size(OnBreakoutLeverPress%Delegates) +! #endif + ! endif + ! if(dint(TongLever) == -1.0) then + ! call OnMakeupLeverPress%RunAll() + +! #ifdef deb +! print*, 'OnMakeupPress=', size(OnMakeupLeverPress%Delegates) +! #endif +! endif + ! if(dint(TongLever) == 0.0) then + ! call OnTongNeutralPress%RunAll() +! #ifdef deb +! print*, 'OnTongNeutralPress=', size(OnTongNeutralPress%Delegates) +! #endif +! endif + +#ifdef deb + print*, 'TongLever=', data%EquipmentControl%DrillingConsole%TongLever +#endif + end subroutine + + subroutine SetRTTransmissionLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetRTTransmissionLever + !DEC$ ATTRIBUTES ALIAS: 'SetRTTransmissionLever' :: SetRTTransmissionLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%RTTransmissionLever = v +#ifdef deb + print*, 'RTTransmissionLever=', data%EquipmentControl%DrillingConsole%RTTransmissionLever +#endif + end subroutine + + subroutine SetDWClutchLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetDWClutchLever + !DEC$ ATTRIBUTES ALIAS: 'SetDWClutchLever' :: SetDWClutchLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%DWClutchLever = v +#ifdef deb + print*, 'DWClutchLever=', data%EquipmentControl%DrillingConsole%DWClutchLever +#endif + end subroutine + + subroutine SetEddyBreakLever(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetEddyBreakLever + !DEC$ ATTRIBUTES ALIAS: 'SetEddyBreakLever' :: SetEddyBreakLever + implicit none + real*8, intent(in) :: v + data%EquipmentControl%DrillingConsole%EddyBreakLever = v +#ifdef deb + print*, 'EddyBreakLever=', data%EquipmentControl%DrillingConsole%EddyBreakLever +#endif + end subroutine + + subroutine SetAutoDW(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetAutoDW + !DEC$ ATTRIBUTES ALIAS: 'SetAutoDW' :: SetAutoDW + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%AutoDW = v +#ifdef deb + print*, 'AutoDW=', data%EquipmentControl%DrillingConsole%AutoDW +#endif + end subroutine + + subroutine SetGEN1(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN1 + !DEC$ ATTRIBUTES ALIAS: 'SetGEN1' :: SetGEN1 + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%GEN1 = v +#ifdef deb + print*, 'GEN1=', data%EquipmentControl%DrillingConsole%GEN1 +#endif + end subroutine + + subroutine SetGEN2(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN2 + !DEC$ ATTRIBUTES ALIAS: 'SetGEN2' :: SetGEN2 + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%GEN2 = v +#ifdef deb + print*, 'GEN2=', data%EquipmentControl%DrillingConsole%GEN2 +#endif + end subroutine + + subroutine SetGEN3(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN3 + !DEC$ ATTRIBUTES ALIAS: 'SetGEN3' :: SetGEN3 + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%GEN3 = v +#ifdef deb + print*, 'GEN3=', data%EquipmentControl%DrillingConsole%GEN3 +#endif + end subroutine + + subroutine SetGEN4(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetGEN4 + !DEC$ ATTRIBUTES ALIAS: 'SetGEN4' :: SetGEN4 + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%GEN4 = v +#ifdef deb + print*, 'GEN4=', data%EquipmentControl%DrillingConsole%GEN4 +#endif + end subroutine + +! subroutine SetInstallSafetyValve(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetInstallSafetyValve +! !DEC$ ATTRIBUTES ALIAS: 'SetInstallSafetyValve' :: SetInstallSafetyValve +! implicit none +! logical, intent(in) :: v +! InstallSafetyValve = v +!#ifdef deb +! print*, 'InstallSafetyValve=', InstallSafetyValve +!#endif +! end subroutine +! +! subroutine SetOpenSafetyValve(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenSafetyValve +! !DEC$ ATTRIBUTES ALIAS: 'SetOpenSafetyValve' :: SetOpenSafetyValve +! implicit none +! logical, intent(in) :: v +! OpenSafetyValve = v +!#ifdef deb +! print*, 'OpenSafetyValve=', OpenSafetyValve +!#endif +! end subroutine +! +! subroutine SetRemoveSafetyValve(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetRemoveSafetyValve +! !DEC$ ATTRIBUTES ALIAS: 'SetRemoveSafetyValve' :: SetRemoveSafetyValve +! implicit none +! logical, intent(in) :: v +! RemoveSafetyValve = v +!#ifdef deb +! print*, 'RemoveSafetyValve=', RemoveSafetyValve +!#endif +! end subroutine +! +! subroutine SetCloseSafetyValve(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseSafetyValve +! !DEC$ ATTRIBUTES ALIAS: 'SetCloseSafetyValve' :: SetCloseSafetyValve +! implicit none +! logical, intent(in) :: v +! CloseSafetyValve = v +!#ifdef deb +! print*, 'CloseSafetyValve=', CloseSafetyValve +!#endif +! end subroutine +! +! subroutine SetMakeJoint(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetMakeJoint +! !DEC$ ATTRIBUTES ALIAS: 'SetMakeJoint' :: SetMakeJoint +! implicit none +! logical, intent(in) :: v +! MakeJoint = v +!#ifdef deb +! print*, 'MakeJoint=', MakeJoint +!#endif +! end subroutine +! +! subroutine SetBreakJoint(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: SetBreakJoint +! !DEC$ ATTRIBUTES ALIAS: 'SetBreakJoint' :: SetBreakJoint +! implicit none +! logical, intent(in) :: v +! BreakJoint = v +!#ifdef deb +! print*, 'BreakJoint=', BreakJoint +!#endif +! end subroutine + + subroutine SetOpenKellyCock(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenKellyCock + !DEC$ ATTRIBUTES ALIAS: 'SetOpenKellyCock' :: SetOpenKellyCock + use CManifolds, OpenKellyCockSub => OpenKellyCock + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%OpenKellyCock == v) return + data%EquipmentControl%DrillingConsole%OpenKellyCock = v + ! if (v) call OnOpenKellyCockPress%RunAll() + if(v .and. data%EquipmentControl%DrillingConsole%Permission_OpenKellyCock) call OpenKellyCockSub() +#ifdef deb + print*, 'OpenKellyCock=', data%EquipmentControl%DrillingConsole%OpenKellyCock +#endif + end subroutine + + subroutine SetCloseKellyCock(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseKellyCock + !DEC$ ATTRIBUTES ALIAS: 'SetCloseKellyCock' :: SetCloseKellyCock + use CManifolds, CloseKellyCockSub => CloseKellyCock + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%CloseKellyCock == v) return + data%EquipmentControl%DrillingConsole%CloseKellyCock = v + ! if (v) call OnCloseKellyCockPress%RunAll() + if(v .and. data%EquipmentControl%DrillingConsole%Permission_CloseKellyCock) call CloseKellyCockSub() +#ifdef deb + print*, 'CloseKellyCock=', data%EquipmentControl%DrillingConsole%CloseKellyCock +#endif + end subroutine + + subroutine SetOpenSafetyValve(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetOpenSafetyValve + !DEC$ ATTRIBUTES ALIAS: 'SetOpenSafetyValve' :: SetOpenSafetyValve + !use CManifolds, OpenSafetyValveSub => OpenSafetyValve + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%OpenSafetyValve == v) return + data%EquipmentControl%DrillingConsole%OpenSafetyValve = v + ! if (v) call OnOpenSafetyValvePress%RunAll() + !if(v .and. Permission_OpenSafetyValve) call OpenSafetyValveSub() +#ifdef deb + print*, 'OpenSafetyValve=', data%EquipmentControl%DrillingConsole%OpenSafetyValve +#endif + end subroutine + + subroutine SetCloseSafetyValve(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetCloseSafetyValve + !DEC$ ATTRIBUTES ALIAS: 'SetCloseSafetyValve' :: SetCloseSafetyValve + !use CManifolds, CloseSafetyValveSub => CloseSafetyValve + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%CloseSafetyValve == v) return + data%EquipmentControl%DrillingConsole%CloseSafetyValve = v + ! if (v) call OnCloseSafetyValvePress%RunAll() + !if(v .and. Permission_CloseSafetyValve) call CloseSafetyValveSub() +#ifdef deb + print*, 'CloseSafetyValve=', data%EquipmentControl%DrillingConsole%CloseSafetyValve +#endif + end subroutine + + subroutine SetIRSafetyValve(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetIRSafetyValve + !DEC$ ATTRIBUTES ALIAS: 'SetIRSafetyValve' :: SetIRSafetyValve + use CManifolds + implicit none + logical, intent(in) :: v + logical :: prev + if (data%EquipmentControl%DrillingConsole%IRSafetyValve == v) return + prev = data%EquipmentControl%DrillingConsole%IRSafetyValve + data%EquipmentControl%DrillingConsole%IRSafetyValve = v + ! if (v) call OnIRSafetyValvePress%RunAll() + !if(prev /= IRSafetyValve .and. v .and. Permission_IRSafetyValve) call ToggleSafetyValve() + !if(prev /= IRSafetyValve .and. v) call ToggleSafetyValve() +#ifdef deb + print*, 'IRSafetyValve=', data%EquipmentControl%DrillingConsole%IRSafetyValve +#endif + end subroutine + + subroutine SetIRIBop(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetIRIBop + !DEC$ ATTRIBUTES ALIAS: 'SetIRIBop' :: SetIRIBop + use CManifolds + implicit none + logical, intent(in) :: v + logical :: prev + if (data%EquipmentControl%DrillingConsole%IRIBop == v) return + prev = data%EquipmentControl%DrillingConsole%IRIBop + data%EquipmentControl%DrillingConsole%IRIBop = v + ! if (v) call OnIRIBopPress%RunAll() + !if(prev /= IRIBop .and. v .and. Permission_IRIBop) call ToggleIBop() + !if(prev /= IRIBop .and. v) call ToggleIBop() +#ifdef deb + print*, 'IRIBop=', data%EquipmentControl%DrillingConsole%IRIBop +#endif + end subroutine + + + + subroutine SetLatchPipe(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetLatchPipe + !DEC$ ATTRIBUTES ALIAS: 'SetLatchPipe' :: SetLatchPipe + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%LatchPipe .eqv. v) return + data%EquipmentControl%DrillingConsole%LatchPipe = v + ! if (v) call OnLatchPipePress%RunAll() +#ifdef deb + print*, 'LatchPipe=', data%EquipmentControl%DrillingConsole%LatchPipe +#endif + end subroutine + + subroutine SetUnlatchPipe(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetUnlatchPipe + !DEC$ ATTRIBUTES ALIAS: 'SetUnlatchPipe' :: SetUnlatchPipe + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%UnlatchPipe .eqv. v) return + data%EquipmentControl%DrillingConsole%UnlatchPipe = v + ! if (v) call OnUnlatchPipePress%RunAll() +#ifdef deb + print*, 'UnlatchPipe=', data%EquipmentControl%DrillingConsole%UnlatchPipe +#endif + end subroutine + + subroutine SetSwing(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetSwing + !DEC$ ATTRIBUTES ALIAS: 'SetSwing' :: SetSwing + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%Swing .eqv. v) return + data%EquipmentControl%DrillingConsole%Swing = v + ! if (v) call OnSwingPress%RunAll() +#ifdef deb + print*, 'Swing=', data%EquipmentControl%DrillingConsole%Swing +#endif + end subroutine + + subroutine SetFillMouseHole(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetFillMouseHole + !DEC$ ATTRIBUTES ALIAS: 'SetFillMouseHole' :: SetFillMouseHole + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%FillMouseHole .eqv. v) return + data%EquipmentControl%DrillingConsole%FillMouseHole = v + ! if (v) call OnFillMouseHolePress%RunAll() +#ifdef deb + print*, 'FillMouseHole=', data%EquipmentControl%DrillingConsole%FillMouseHole +#endif + end subroutine + + subroutine SetSlips(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetSlips + !DEC$ ATTRIBUTES ALIAS: 'SetSlips' :: SetSlips + implicit none + logical, intent(in) :: v + if (data%EquipmentControl%DrillingConsole%Slips .eqv. v) return + data%EquipmentControl%DrillingConsole%Slips = v +#ifdef deb + print*, 'Slips=', data%EquipmentControl%DrillingConsole%Slips +#endif + ! if (v) call OnSlipsPress%RunAll() + end subroutine + + + subroutine SetBrakeLeverCoefficient(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetBrakeLeverCoefficient + !DEC$ ATTRIBUTES ALIAS: 'SetBrakeLeverCoefficient' :: SetBrakeLeverCoefficient + implicit none + real, intent(in) :: v + data%EquipmentControl%DrillingConsole%BrakeLeverCoefficient = v +#ifdef deb + print*, 'BrakeLeverCoefficient=', data%EquipmentControl%DrillingConsole%BrakeLeverCoefficient +#endif + end subroutine + + subroutine SetHideDrillingBrake(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetHideDrillingBrake + !DEC$ ATTRIBUTES ALIAS: 'SetHideDrillingBrake' :: SetHideDrillingBrake + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%HideDrillingBrake = v +#ifdef deb + print*, 'HideDrillingBrake=', data%EquipmentControl%DrillingConsole%HideDrillingBrake +#endif + end subroutine + + + + + + + + + subroutine SetParkingBrake(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetParkingBrake + !DEC$ ATTRIBUTES ALIAS: 'SetParkingBrake' :: SetParkingBrake + implicit none + logical, intent(in) :: v + data%EquipmentControl%DrillingConsole%ParkingBrakeBtn = v +#ifdef deb + print*, 'ParkingBrakeBtn=', data%EquipmentControl%DrillingConsole%ParkingBrakeBtn +#endif + end subroutine + + + + + + + + + + + + + ! Output routines + + logical function GetParkingBrakeLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetParkingBrakeLed + !DEC$ ATTRIBUTES ALIAS: 'GetParkingBrakeLed' :: GetParkingBrakeLed + implicit none + GetParkingBrakeLed = data%EquipmentControl%DrillingConsole%ParkingBrakeLed + !GetParkingBrakeLed = .true. + end function + + + integer function GetGEN1LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN1LED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN1LED' :: GetGEN1LED + implicit none + GetGEN1LED = 1 + !GetGEN1LED = GEN1LED + end function + + integer function GetGEN2LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN2LED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN2LED' :: GetGEN2LED + implicit none + GetGEN2LED = 1 + !GetGEN2LED = GEN2LED + end function + + integer function GetGEN3LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN3LED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN3LED' :: GetGEN3LED + implicit none + GetGEN3LED = 1 + !GetGEN3LED = GEN3LED + end function + + integer function GetGEN4LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN4LED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN4LED' :: GetGEN4LED + implicit none + GetGEN4LED = 1 + !GetGEN4LED = GEN4LED + end function + + integer function GetSCR1LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR1LED + !DEC$ ATTRIBUTES ALIAS: 'GetSCR1LED' :: GetSCR1LED + implicit none + GetSCR1LED = data%EquipmentControl%DrillingConsole%SCR1LED + end function + + integer function GetSCR2LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR2LED + !DEC$ ATTRIBUTES ALIAS: 'GetSCR2LED' :: GetSCR2LED + implicit none + GetSCR2LED = data%EquipmentControl%DrillingConsole%SCR2LED + end function + + integer function GetSCR3LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR3LED + !DEC$ ATTRIBUTES ALIAS: 'GetSCR3LED' :: GetSCR3LED + implicit none + GetSCR3LED = data%EquipmentControl%DrillingConsole%SCR3LED + end function + + integer function GetSCR4LED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSCR4LED + !DEC$ ATTRIBUTES ALIAS: 'GetSCR4LED' :: GetSCR4LED + implicit none + GetSCR4LED = data%EquipmentControl%DrillingConsole%SCR4LED + end function + + integer function GetMP1BLWR() + !DEC$ ATTRIBUTES DLLEXPORT :: GetMP1BLWR + !DEC$ ATTRIBUTES ALIAS: 'GetMP1BLWR' :: GetMP1BLWR + implicit none + GetMP1BLWR = data%EquipmentControl%DrillingConsole%MP1BLWR + end function + + integer function GetMP2BLWR() + !DEC$ ATTRIBUTES DLLEXPORT :: GetMP2BLWR + !DEC$ ATTRIBUTES ALIAS: 'GetMP2BLWR' :: GetMP2BLWR + implicit none + GetMP2BLWR = data%EquipmentControl%DrillingConsole%MP2BLWR + end function + + integer function GetDWBLWR() + !DEC$ ATTRIBUTES DLLEXPORT :: GetDWBLWR + !DEC$ ATTRIBUTES ALIAS: 'GetDWBLWR' :: GetDWBLWR + implicit none + GetDWBLWR = data%EquipmentControl%DrillingConsole%DWBLWR + end function + + integer function GetRTBLWR() + !DEC$ ATTRIBUTES DLLEXPORT :: GetRTBLWR + !DEC$ ATTRIBUTES ALIAS: 'GetRTBLWR' :: GetRTBLWR + implicit none + GetRTBLWR = data%EquipmentControl%DrillingConsole%RTBLWR + end function + + integer function GetPWRLIM() + !DEC$ ATTRIBUTES DLLEXPORT :: GetPWRLIM + !DEC$ ATTRIBUTES ALIAS: 'GetPWRLIM' :: GetPWRLIM + implicit none + GetPWRLIM = data%EquipmentControl%DrillingConsole%PWRLIM + end function + + real(8) function GetPWRLIMMTR() + !DEC$ ATTRIBUTES DLLEXPORT :: GetPWRLIMMTR + !DEC$ ATTRIBUTES ALIAS: 'GetPWRLIMMTR' :: GetPWRLIMMTR + implicit none + GetPWRLIMMTR = data%EquipmentControl%DrillingConsole%PWRLIMMTR + end function + + real(8) function GetRTTorqueLimitGauge() + !DEC$ ATTRIBUTES DLLEXPORT :: GetRTTorqueLimitGauge + !DEC$ ATTRIBUTES ALIAS: 'GetRTTorqueLimitGauge' :: GetRTTorqueLimitGauge + implicit none + GetRTTorqueLimitGauge = data%EquipmentControl%DrillingConsole%RTTorqueLimitGauge + end function + + integer function GetAutoDWLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetAutoDWLED + !DEC$ ATTRIBUTES ALIAS: 'GetAutoDWLED' :: GetAutoDWLED + implicit none + GetAutoDWLED = data%EquipmentControl%DrillingConsole%AutoDWLED + end function + + integer function GetGEN1BTNLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN1BTNLED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN1BTNLED' :: GetGEN1BTNLED + implicit none + GetGEN1BTNLED = data%EquipmentControl%DrillingConsole%GEN1BTNLED + end function + + integer function GetGEN2BTNLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN2BTNLED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN2BTNLED' :: GetGEN2BTNLED + implicit none + GetGEN2BTNLED = data%EquipmentControl%DrillingConsole%GEN2BTNLED + end function + + integer function GetGEN3BTNLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN3BTNLED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN3BTNLED' :: GetGEN3BTNLED + implicit none + GetGEN3BTNLED = data%EquipmentControl%DrillingConsole%GEN3BTNLED + end function + + integer function GetGEN4BTNLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetGEN4BTNLED + !DEC$ ATTRIBUTES ALIAS: 'GetGEN4BTNLED' :: GetGEN4BTNLED + implicit none + GetGEN4BTNLED = data%EquipmentControl%DrillingConsole%GEN4BTNLED + end function + + integer function GetOpenKellyCockLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetOpenKellyCockLed + !DEC$ ATTRIBUTES ALIAS: 'GetOpenKellyCockLed' :: GetOpenKellyCockLed + implicit none + GetOpenKellyCockLed = data%EquipmentControl%DrillingConsole%OpenKellyCockLed + end function + + integer function GetCloseKellyCockLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetCloseKellyCockLed + !DEC$ ATTRIBUTES ALIAS: 'GetCloseKellyCockLed' :: GetCloseKellyCockLed + implicit none + GetCloseKellyCockLed = data%EquipmentControl%DrillingConsole%CloseKellyCockLed + end function + + integer function GetOpenSafetyValveLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetOpenSafetyValveLed + !DEC$ ATTRIBUTES ALIAS: 'GetOpenSafetyValveLed' :: GetOpenSafetyValveLed + implicit none + GetOpenSafetyValveLed = data%EquipmentControl%DrillingConsole%OpenSafetyValveLed + end function + + integer function GetCloseSafetyValveLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetCloseSafetyValveLed + !DEC$ ATTRIBUTES ALIAS: 'GetCloseSafetyValveLed' :: GetCloseSafetyValveLed + implicit none + GetCloseSafetyValveLed = data%EquipmentControl%DrillingConsole%CloseSafetyValveLed + end function + + integer function GetIRSafetyValveLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetIRSafetyValveLed + !DEC$ ATTRIBUTES ALIAS: 'GetIRSafetyValveLed' :: GetIRSafetyValveLed + implicit none + GetIRSafetyValveLed = data%EquipmentControl%DrillingConsole%IRSafetyValveLed + end function + + integer function GetIRIBopLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetIRIBopLed + !DEC$ ATTRIBUTES ALIAS: 'GetIRIBopLed' :: GetIRIBopLed + implicit none + GetIRIBopLed = data%EquipmentControl%DrillingConsole%IRIBopLed + end function + + + integer function GetLatchPipeLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetLatchPipeLED + !DEC$ ATTRIBUTES ALIAS: 'GetLatchPipeLED' :: GetLatchPipeLED + implicit none + GetLatchPipeLED = data%EquipmentControl%DrillingConsole%LatchPipeLED + end function + + integer function GetUnlatchPipeLED() + !DEC$ ATTRIBUTES DLLEXPORT :: GetUnlatchPipeLED + !DEC$ ATTRIBUTES ALIAS: 'GetUnlatchPipeLED' :: GetUnlatchPipeLED + implicit none + GetUnlatchPipeLED = data%EquipmentControl%DrillingConsole%UnlatchPipeLED + end function + + integer function GetSwingLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSwingLed + !DEC$ ATTRIBUTES ALIAS: 'GetSwingLed' :: GetSwingLed + implicit none + GetSwingLed = data%EquipmentControl%DrillingConsole%SwingLed + end function + + integer function GetFillMouseHoleLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetFillMouseHoleLed + !DEC$ ATTRIBUTES ALIAS: 'GetFillMouseHoleLed' :: GetFillMouseHoleLed + implicit none + GetFillMouseHoleLed = data%EquipmentControl%DrillingConsole%FillMouseHoleLed + end function + end module CDrillingConsole \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 b/CSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 index f611d0f..78c9204 100644 --- a/CSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 @@ -1,133 +1,133 @@ -module CDrillingConsoleVariables - - ! use CVoidEventHandlerCollection - implicit none - public - - TYPE, PUBLIC :: DrillingConsoleType - ! Input vars - integer :: AssignmentSwitch - logical :: EmergencySwitch - real(8) :: RTTorqueLimitKnob - integer :: MP1CPSwitchI = 0 !for not turning on pump1 on simulation start - integer :: MP1CPSwitchT !for not turning on pump1 on simulation start - integer :: MP1CPSwitch - logical :: MP1ThrottleUpdate = .false. - real(8) :: MP1Throttle = -1.0 - integer :: MP2SwitchI = 0 !for not turning on pump2 on simulation start - logical :: MP2SwitchT !for not turning on pump2 on simulation start - logical :: MP2Switch - logical :: MP2ThrottleUpdate = .false. - real(8) :: MP2Throttle = -1.0 - integer :: DWSwitch - real(8) :: DWThrottle - integer :: RTSwitch - real(8) :: RTThrottle - - real(8) :: DWBreak - real(8) :: PreviousDWBreak - logical :: ForceBreak = .false. - - real(8) :: DWAcceleretor - real(8) :: DWTransmisionLever - real(8) :: DWPowerLever - - real(8) :: TongLever - ! ! type(VoidEventHandlerCollection) :: OnBreakoutLeverPress - ! ! type(VoidEventHandlerCollection) :: OnMakeupLeverPress - ! ! type(VoidEventHandlerCollection) :: OnTongNeutralPress - - real(8) :: RTTransmissionLever - real(8) :: DWClutchLever - real(8) :: EddyBreakLever - logical :: AutoDW - logical :: GEN1 - logical :: GEN2 - logical :: GEN3 - logical :: GEN4 - logical :: Permission_OpenKellyCock = .false. - logical :: OpenKellyCock - ! ! type(VoidEventHandlerCollection) :: OnOpenKellyCockPress - - logical :: Permission_CloseKellyCock = .false. - logical :: CloseKellyCock - ! ! type(VoidEventHandlerCollection) :: OnCloseKellyCockPress - - logical :: Permission_OpenSafetyValve = .false. - logical :: OpenSafetyValve - ! typeVoidEventHandlerCollection) :: OnOpenSafetyValvePress - - logical :: Permission_CloseSafetyValve = .false. - logical :: CloseSafetyValve - ! typeVoidEventHandlerCollection) :: OnCloseSafetyValvePress - - logical :: Permission_IRSafetyValve = .false. - logical :: IRSafetyValve - ! typeVoidEventHandlerCollection) :: OnIRSafetyValvePress - - logical :: Permission_IRIBop = .false. - logical :: IRIBop - ! typeVoidEventHandlerCollection) :: OnIRIBopPress - - logical :: LatchPipe - ! typeVoidEventHandlerCollection) :: OnLatchPipePress - - logical :: UnlatchPipe - ! typeVoidEventHandlerCollection) :: OnUnlatchPipePress - - logical :: Swing - ! typeVoidEventHandlerCollection) :: OnSwingPress - - logical :: FillMouseHole - ! typeVoidEventHandlerCollection) :: OnFillMouseHolePress - - logical :: Slips - ! typeVoidEventHandlerCollection) :: OnSlipsPress - - !logical :: TopDriveIBop - ! - !logical :: TopDriveDrillTorque - !integer :: TopDriveRevOffFwd - !integer :: TopDriveDrillOffTilt - - real :: BrakeLeverCoefficient - logical :: HideDrillingBrake - - logical :: ParkingBrakeBtn - - ! Output vars - logical :: ParkingBrakeLed - integer :: GEN1LED - integer :: GEN2LED - integer :: GEN3LED - integer :: GEN4LED - integer :: SCR1LED - integer :: SCR2LED - integer :: SCR3LED - integer :: SCR4LED - integer :: MP1BLWR - integer :: MP2BLWR - integer :: DWBLWR - integer :: RTBLWR - integer :: PWRLIM - real(8) :: PWRLIMMTR - real(8) :: RTTorqueLimitGauge - integer :: AutoDWLED - integer :: GEN1BTNLED - integer :: GEN2BTNLED - integer :: GEN3BTNLED - integer :: GEN4BTNLED - integer :: OpenKellyCockLed - integer :: CloseKellyCockLed - integer :: OpenSafetyValveLed - integer :: CloseSafetyValveLed - integer :: IRSafetyValveLed - integer :: IRIBopLed - - integer :: LatchPipeLED - integer :: UnlatchPipeLED - integer :: SwingLed - integer :: FillMouseHoleLed - END TYPE DrillingConsoleType - +module CDrillingConsoleVariables + + ! use CVoidEventHandlerCollection + implicit none + public + + TYPE, PUBLIC :: DrillingConsoleType + ! Input vars + integer :: AssignmentSwitch + logical :: EmergencySwitch + real(8) :: RTTorqueLimitKnob + integer :: MP1CPSwitchI = 0 !for not turning on pump1 on simulation start + integer :: MP1CPSwitchT !for not turning on pump1 on simulation start + integer :: MP1CPSwitch + logical :: MP1ThrottleUpdate = .false. + real(8) :: MP1Throttle = -1.0 + integer :: MP2SwitchI = 0 !for not turning on pump2 on simulation start + logical :: MP2SwitchT !for not turning on pump2 on simulation start + logical :: MP2Switch + logical :: MP2ThrottleUpdate = .false. + real(8) :: MP2Throttle = -1.0 + integer :: DWSwitch + real(8) :: DWThrottle + integer :: RTSwitch + real(8) :: RTThrottle + + real(8) :: DWBreak + real(8) :: PreviousDWBreak + logical :: ForceBreak = .false. + + real(8) :: DWAcceleretor + real(8) :: DWTransmisionLever + real(8) :: DWPowerLever + + real(8) :: TongLever + ! ! type(VoidEventHandlerCollection) :: OnBreakoutLeverPress + ! ! type(VoidEventHandlerCollection) :: OnMakeupLeverPress + ! ! type(VoidEventHandlerCollection) :: OnTongNeutralPress + + real(8) :: RTTransmissionLever + real(8) :: DWClutchLever + real(8) :: EddyBreakLever + logical :: AutoDW + logical :: GEN1 + logical :: GEN2 + logical :: GEN3 + logical :: GEN4 + logical :: Permission_OpenKellyCock = .false. + logical :: OpenKellyCock + ! ! type(VoidEventHandlerCollection) :: OnOpenKellyCockPress + + logical :: Permission_CloseKellyCock = .false. + logical :: CloseKellyCock + ! ! type(VoidEventHandlerCollection) :: OnCloseKellyCockPress + + logical :: Permission_OpenSafetyValve = .false. + logical :: OpenSafetyValve + ! typeVoidEventHandlerCollection) :: OnOpenSafetyValvePress + + logical :: Permission_CloseSafetyValve = .false. + logical :: CloseSafetyValve + ! typeVoidEventHandlerCollection) :: OnCloseSafetyValvePress + + logical :: Permission_IRSafetyValve = .false. + logical :: IRSafetyValve + ! typeVoidEventHandlerCollection) :: OnIRSafetyValvePress + + logical :: Permission_IRIBop = .false. + logical :: IRIBop + ! typeVoidEventHandlerCollection) :: OnIRIBopPress + + logical :: LatchPipe + ! typeVoidEventHandlerCollection) :: OnLatchPipePress + + logical :: UnlatchPipe + ! typeVoidEventHandlerCollection) :: OnUnlatchPipePress + + logical :: Swing + ! typeVoidEventHandlerCollection) :: OnSwingPress + + logical :: FillMouseHole + ! typeVoidEventHandlerCollection) :: OnFillMouseHolePress + + logical :: Slips + ! typeVoidEventHandlerCollection) :: OnSlipsPress + + !logical :: TopDriveIBop + ! + !logical :: TopDriveDrillTorque + !integer :: TopDriveRevOffFwd + !integer :: TopDriveDrillOffTilt + + real :: BrakeLeverCoefficient + logical :: HideDrillingBrake + + logical :: ParkingBrakeBtn + + ! Output vars + logical :: ParkingBrakeLed + integer :: GEN1LED + integer :: GEN2LED + integer :: GEN3LED + integer :: GEN4LED + integer :: SCR1LED + integer :: SCR2LED + integer :: SCR3LED + integer :: SCR4LED + integer :: MP1BLWR + integer :: MP2BLWR + integer :: DWBLWR + integer :: RTBLWR + integer :: PWRLIM + real(8) :: PWRLIMMTR + real(8) :: RTTorqueLimitGauge + integer :: AutoDWLED + integer :: GEN1BTNLED + integer :: GEN2BTNLED + integer :: GEN3BTNLED + integer :: GEN4BTNLED + integer :: OpenKellyCockLed + integer :: CloseKellyCockLed + integer :: OpenSafetyValveLed + integer :: CloseSafetyValveLed + integer :: IRSafetyValveLed + integer :: IRIBopLed + + integer :: LatchPipeLED + integer :: UnlatchPipeLED + integer :: SwingLed + integer :: FillMouseHoleLed + END TYPE DrillingConsoleType + end module CDrillingConsoleVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 b/CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 index 7e5ab31..0807ee0 100644 --- a/CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 +++ b/CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 @@ -1,11 +1,11 @@ -module CEquipmentsConstants - implicit none - public - - ! LED State Types - integer :: LedOff = 0 - integer :: LedOn = 1 - integer :: LedBlinking = 2 - - contains +module CEquipmentsConstants + implicit none + public + + ! LED State Types + integer :: LedOff = 0 + integer :: LedOn = 1 + integer :: LedBlinking = 2 + + contains end module CEquipmentsConstants \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CHook.f90 b/CSharp/Equipments/ControlPanels/CHook.f90 index d64f6df..c702a4e 100644 --- a/CSharp/Equipments/ControlPanels/CHook.f90 +++ b/CSharp/Equipments/ControlPanels/CHook.f90 @@ -1,64 +1,64 @@ -module CHook - use CHookVariables - use SimulationVariables - implicit none - public - contains - - subroutine Set_HookHeight(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - real , intent(in) :: v - -#ifdef ExcludeExtraChanges - if(data%EquipmentControl%Hook%HookHeight == v) return -#endif - data%EquipmentControl%Hook%HookHeight = v - - ! if(associated(HookHeightPtr)) then - ! call HookHeightPtr(data%EquipmentControl%Hook%HookHeight) - ! end if - -#ifdef deb - print*, 'HookHeight=', data%EquipmentControl%Hook%HookHeight -#endif - - !**call data%EquipmentControl%Hook%OnHookHeightChange%RunAll(data%EquipmentControl%Hook%HookHeight) - end subroutine - - - subroutine Set_HookHeight_S(v) - implicit none - real , intent(in) :: v - - if(v == data%EquipmentControl%Hook%HookHeight) then - return - elseif (v > data%EquipmentControl%Hook%HookHeight) then - loop1: do - call Set_HookHeight(data%EquipmentControl%Hook%HookHeight + 0.2) - if(abs(v - data%EquipmentControl%Hook%HookHeight) <= 0.1) then - call Set_HookHeight(v) - exit loop1 - endif - call sleepqq(100) - enddo loop1 - else ! v < HookHeight - loop2: do - call Set_HookHeight(data%EquipmentControl%Hook%HookHeight - 0.2) - if(abs(data%EquipmentControl%Hook%HookHeight - v) <= 0.1) then - call Set_HookHeight(v) - exit loop2 - endif - call sleepqq(100) - enddo loop2 - endif - - end subroutine - - subroutine Update_HookHeight_From_Snapshot() - implicit none - call Set_HookHeight_S(data%EquipmentControl%Hook%HookHeight_S) - end subroutine - end module CHook +module CHook + use CHookVariables + use SimulationVariables + implicit none + public + contains + + subroutine Set_HookHeight(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + real , intent(in) :: v + +#ifdef ExcludeExtraChanges + if(data%EquipmentControl%Hook%HookHeight == v) return +#endif + data%EquipmentControl%Hook%HookHeight = v + + ! if(associated(HookHeightPtr)) then + ! call HookHeightPtr(data%EquipmentControl%Hook%HookHeight) + ! end if + +#ifdef deb + print*, 'HookHeight=', data%EquipmentControl%Hook%HookHeight +#endif + + !**call data%EquipmentControl%Hook%OnHookHeightChange%RunAll(data%EquipmentControl%Hook%HookHeight) + end subroutine + + + subroutine Set_HookHeight_S(v) + implicit none + real , intent(in) :: v + + if(v == data%EquipmentControl%Hook%HookHeight) then + return + elseif (v > data%EquipmentControl%Hook%HookHeight) then + loop1: do + call Set_HookHeight(data%EquipmentControl%Hook%HookHeight + 0.2) + if(abs(v - data%EquipmentControl%Hook%HookHeight) <= 0.1) then + call Set_HookHeight(v) + exit loop1 + endif + call sleepqq(100) + enddo loop1 + else ! v < HookHeight + loop2: do + call Set_HookHeight(data%EquipmentControl%Hook%HookHeight - 0.2) + if(abs(data%EquipmentControl%Hook%HookHeight - v) <= 0.1) then + call Set_HookHeight(v) + exit loop2 + endif + call sleepqq(100) + enddo loop2 + endif + + end subroutine + + subroutine Update_HookHeight_From_Snapshot() + implicit none + call Set_HookHeight_S(data%EquipmentControl%Hook%HookHeight_S) + end subroutine + end module CHook diff --git a/CSharp/Equipments/ControlPanels/CHookActions.f90 b/CSharp/Equipments/ControlPanels/CHookActions.f90 index 5632712..2c77ba9 100644 --- a/CSharp/Equipments/ControlPanels/CHookActions.f90 +++ b/CSharp/Equipments/ControlPanels/CHookActions.f90 @@ -1,16 +1,16 @@ -module CHookActions - use CIActionReference - implicit none - public - procedure (ActionReal), pointer :: HookHeightPtr - contains - - subroutine SubscribeHookHeight(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeHookHeight - !DEC$ ATTRIBUTES ALIAS: 'SubscribeHookHeight' :: SubscribeHookHeight - implicit none - procedure (ActionReal) :: a - HookHeightPtr => a - end subroutine - +module CHookActions + use CIActionReference + implicit none + public + procedure (ActionReal), pointer :: HookHeightPtr + contains + + subroutine SubscribeHookHeight(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeHookHeight + !DEC$ ATTRIBUTES ALIAS: 'SubscribeHookHeight' :: SubscribeHookHeight + implicit none + procedure (ActionReal) :: a + HookHeightPtr => a + end subroutine + end module CHookActions \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CHookVariables.f90 b/CSharp/Equipments/ControlPanels/CHookVariables.f90 index 617e7c6..c6e8f06 100644 --- a/CSharp/Equipments/ControlPanels/CHookVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CHookVariables.f90 @@ -1,16 +1,16 @@ -module CHookVariables - !**use CRealEventHandlerCollection - ! use CHookActions - implicit none - Type :: HookType - real :: HookHeight_S = 0.0 - real :: HookHeight - !**type(RealEventHandlerCollection) :: OnHookHeightChange - end type HookType - - - contains - - - +module CHookVariables + !**use CRealEventHandlerCollection + ! use CHookActions + implicit none + Type :: HookType + real :: HookHeight_S = 0.0 + real :: HookHeight + !**type(RealEventHandlerCollection) :: OnHookHeightChange + end type HookType + + + contains + + + end module CHookVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CStandPipeManifold.f90 b/CSharp/Equipments/ControlPanels/CStandPipeManifold.f90 index a191f13..fcbe597 100644 --- a/CSharp/Equipments/ControlPanels/CStandPipeManifold.f90 +++ b/CSharp/Equipments/ControlPanels/CStandPipeManifold.f90 @@ -1,207 +1,207 @@ -module CStandPipeManifold - use CStandPipeManifoldVariables - use SimulationVariables - use CManifolds - implicit none - public - contains - - ! Input routines - subroutine SetStandPipeManifoldValve1(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve1 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve1' :: SetStandPipeManifoldValve1 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve1 = v - call ChangeValve(13, v) -#ifdef deb - print*, 'StandPipeManifoldValve1=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve1 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve2(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve2 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve2' :: SetStandPipeManifoldValve2 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve2 = v - call ChangeValve(14, v) -#ifdef deb - print*, 'StandPipeManifoldValve2=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve2 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve3(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve3 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve3' :: SetStandPipeManifoldValve3 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve3 = v - call ChangeValve(15, v) -#ifdef deb - print*, 'StandPipeManifoldValve3=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve3 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve4(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve4 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve4' :: SetStandPipeManifoldValve4 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve4 = v - call ChangeValve(11, v) -#ifdef deb - print*, 'StandPipeManifoldValve4=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve4 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve5(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve5 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve5' :: SetStandPipeManifoldValve5 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve5 = v - call ChangeValve(12, v) -#ifdef deb - print*, 'StandPipeManifoldValve5=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve5 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve6(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve6 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve6' :: SetStandPipeManifoldValve6 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve6 = v - call ChangeValve(9, v) -#ifdef deb - print*, 'StandPipeManifoldValve6=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve6 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve7(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve7 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve7' :: SetStandPipeManifoldValve7 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve7 = v - call ChangeValve(10, v) -#ifdef deb - print*, 'StandPipeManifoldValve7=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve7 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve8(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve8 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve8' :: SetStandPipeManifoldValve8 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve8 = v - call ChangeValve(6, v) -#ifdef deb - print*, 'StandPipeManifoldValve8=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve8 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve9(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve9 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve9' :: SetStandPipeManifoldValve9 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve9 = v - call ChangeValve(7, v) -#ifdef deb - print*, 'StandPipeManifoldValve9=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve9 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve10(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve10 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve10' :: SetStandPipeManifoldValve10 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve10 = v - call ChangeValve(8, v) -#ifdef deb - print*, 'StandPipeManifoldValve10=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve10 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve11(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve11 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve11' :: SetStandPipeManifoldValve11 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve11 = v - call ChangeValve(1, v) -#ifdef deb - print*, 'StandPipeManifoldValve11=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve11 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve12(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve12 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve12' :: SetStandPipeManifoldValve12 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve12 = v - call ChangeValve(2, v) -#ifdef deb - print*, 'StandPipeManifoldValve12=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve12 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve13(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve13 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve13' :: SetStandPipeManifoldValve13 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve13 = v - call ChangeValve(3, v) -#ifdef deb - print*, 'StandPipeManifoldValve13=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve13 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve14(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve14 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve14' :: SetStandPipeManifoldValve14 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve14 = v - call ChangeValve(4, v) -#ifdef deb - print*, 'StandPipeManifoldValve14=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve14 -#endif - end subroutine - - subroutine SetStandPipeManifoldValve15(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve15 - !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve15' :: SetStandPipeManifoldValve15 - implicit none - logical, intent(in) :: v - data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve15 = v - call ChangeValve(5, v) -#ifdef deb - print*, 'StandPipeManifoldValve15=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve15 -#endif - end subroutine - - ! Output routines - real(8) function GetStandPipeGauge1() - !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipeGauge1 - !DEC$ ATTRIBUTES ALIAS: 'GetStandPipeGauge1' :: GetStandPipeGauge1 - implicit none - GetStandPipeGauge1 = data%EquipmentControl%StandPipeManifold%StandPipeGauge1 - !GetStandPipeGauge1 = 567.4 - end function - - real(8) function GetStandPipeGauge2() - !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipeGauge2 - !DEC$ ATTRIBUTES ALIAS: 'GetStandPipeGauge2' :: GetStandPipeGauge2 - implicit none - GetStandPipeGauge2 = data%EquipmentControl%StandPipeManifold%StandPipeGauge2 - !GetStandPipeGauge2 = 1564.0 - end function - +module CStandPipeManifold + use CStandPipeManifoldVariables + use SimulationVariables + use CManifolds + implicit none + public + contains + + ! Input routines + subroutine SetStandPipeManifoldValve1(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve1 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve1' :: SetStandPipeManifoldValve1 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve1 = v + call ChangeValve(13, v) +#ifdef deb + print*, 'StandPipeManifoldValve1=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve1 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve2(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve2 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve2' :: SetStandPipeManifoldValve2 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve2 = v + call ChangeValve(14, v) +#ifdef deb + print*, 'StandPipeManifoldValve2=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve2 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve3(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve3 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve3' :: SetStandPipeManifoldValve3 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve3 = v + call ChangeValve(15, v) +#ifdef deb + print*, 'StandPipeManifoldValve3=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve3 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve4(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve4 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve4' :: SetStandPipeManifoldValve4 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve4 = v + call ChangeValve(11, v) +#ifdef deb + print*, 'StandPipeManifoldValve4=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve4 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve5(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve5 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve5' :: SetStandPipeManifoldValve5 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve5 = v + call ChangeValve(12, v) +#ifdef deb + print*, 'StandPipeManifoldValve5=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve5 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve6(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve6 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve6' :: SetStandPipeManifoldValve6 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve6 = v + call ChangeValve(9, v) +#ifdef deb + print*, 'StandPipeManifoldValve6=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve6 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve7(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve7 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve7' :: SetStandPipeManifoldValve7 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve7 = v + call ChangeValve(10, v) +#ifdef deb + print*, 'StandPipeManifoldValve7=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve7 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve8(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve8 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve8' :: SetStandPipeManifoldValve8 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve8 = v + call ChangeValve(6, v) +#ifdef deb + print*, 'StandPipeManifoldValve8=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve8 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve9(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve9 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve9' :: SetStandPipeManifoldValve9 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve9 = v + call ChangeValve(7, v) +#ifdef deb + print*, 'StandPipeManifoldValve9=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve9 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve10(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve10 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve10' :: SetStandPipeManifoldValve10 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve10 = v + call ChangeValve(8, v) +#ifdef deb + print*, 'StandPipeManifoldValve10=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve10 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve11(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve11 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve11' :: SetStandPipeManifoldValve11 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve11 = v + call ChangeValve(1, v) +#ifdef deb + print*, 'StandPipeManifoldValve11=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve11 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve12(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve12 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve12' :: SetStandPipeManifoldValve12 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve12 = v + call ChangeValve(2, v) +#ifdef deb + print*, 'StandPipeManifoldValve12=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve12 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve13(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve13 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve13' :: SetStandPipeManifoldValve13 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve13 = v + call ChangeValve(3, v) +#ifdef deb + print*, 'StandPipeManifoldValve13=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve13 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve14(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve14 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve14' :: SetStandPipeManifoldValve14 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve14 = v + call ChangeValve(4, v) +#ifdef deb + print*, 'StandPipeManifoldValve14=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve14 +#endif + end subroutine + + subroutine SetStandPipeManifoldValve15(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetStandPipeManifoldValve15 + !DEC$ ATTRIBUTES ALIAS: 'SetStandPipeManifoldValve15' :: SetStandPipeManifoldValve15 + implicit none + logical, intent(in) :: v + data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve15 = v + call ChangeValve(5, v) +#ifdef deb + print*, 'StandPipeManifoldValve15=', data%EquipmentControl%StandPipeManifold%StandPipeManifoldValve15 +#endif + end subroutine + + ! Output routines + real(8) function GetStandPipeGauge1() + !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipeGauge1 + !DEC$ ATTRIBUTES ALIAS: 'GetStandPipeGauge1' :: GetStandPipeGauge1 + implicit none + GetStandPipeGauge1 = data%EquipmentControl%StandPipeManifold%StandPipeGauge1 + !GetStandPipeGauge1 = 567.4 + end function + + real(8) function GetStandPipeGauge2() + !DEC$ ATTRIBUTES DLLEXPORT :: GetStandPipeGauge2 + !DEC$ ATTRIBUTES ALIAS: 'GetStandPipeGauge2' :: GetStandPipeGauge2 + implicit none + GetStandPipeGauge2 = data%EquipmentControl%StandPipeManifold%StandPipeGauge2 + !GetStandPipeGauge2 = 1564.0 + end function + end module CStandPipeManifold \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 b/CSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 index 7ffb90c..7fb53e8 100644 --- a/CSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 @@ -1,28 +1,28 @@ -module CStandPipeManifoldVariables - implicit none - public - - Type::StandPipeManifoldType - ! Input vars - logical :: StandPipeManifoldValve1 - logical :: StandPipeManifoldValve2 - logical :: StandPipeManifoldValve3 - logical :: StandPipeManifoldValve4 - logical :: StandPipeManifoldValve5 - logical :: StandPipeManifoldValve6 - logical :: StandPipeManifoldValve7 - logical :: StandPipeManifoldValve8 - logical :: StandPipeManifoldValve9 - logical :: StandPipeManifoldValve10 - logical :: StandPipeManifoldValve11 - logical :: StandPipeManifoldValve12 - logical :: StandPipeManifoldValve13 - logical :: StandPipeManifoldValve14 - logical :: StandPipeManifoldValve15 - - ! Output vars - real(8) :: StandPipeGauge1 - real(8) :: StandPipeGauge2 - End type StandPipeManifoldType - +module CStandPipeManifoldVariables + implicit none + public + + Type::StandPipeManifoldType + ! Input vars + logical :: StandPipeManifoldValve1 + logical :: StandPipeManifoldValve2 + logical :: StandPipeManifoldValve3 + logical :: StandPipeManifoldValve4 + logical :: StandPipeManifoldValve5 + logical :: StandPipeManifoldValve6 + logical :: StandPipeManifoldValve7 + logical :: StandPipeManifoldValve8 + logical :: StandPipeManifoldValve9 + logical :: StandPipeManifoldValve10 + logical :: StandPipeManifoldValve11 + logical :: StandPipeManifoldValve12 + logical :: StandPipeManifoldValve13 + logical :: StandPipeManifoldValve14 + logical :: StandPipeManifoldValve15 + + ! Output vars + real(8) :: StandPipeGauge1 + real(8) :: StandPipeGauge2 + End type StandPipeManifoldType + end module CStandPipeManifoldVariables \ No newline at end of file diff --git a/CSharp/Equipments/ControlPanels/CTopDrivePanel.f90 b/CSharp/Equipments/ControlPanels/CTopDrivePanel.f90 index 14cdfb6..ccfa66c 100644 --- a/CSharp/Equipments/ControlPanels/CTopDrivePanel.f90 +++ b/CSharp/Equipments/ControlPanels/CTopDrivePanel.f90 @@ -1,216 +1,216 @@ -module CTopDrivePanel - use CTopDrivePanelVariables - use SimulationVariables - use CLog3 - implicit none - public - contains - - ! Input routines - subroutine SetTopDriveTdsPowerState(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTdsPowerState - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTdsPowerState' :: SetTopDriveTdsPowerState - implicit none - integer, intent(in) :: v - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState = v -#ifdef deb - call Log_3( 'TopDriveTdsPowerState=', data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState) -#endif - end subroutine - - subroutine SetTopDriveTorqueWrench(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTorqueWrench - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTorqueWrench' :: SetTopDriveTorqueWrench - implicit none - logical, intent(in) :: v - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench = v -#ifdef deb - call Log_3( 'TopDriveTorqueWrench=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench) -#endif - end subroutine - - subroutine SetTopDriveDrillTorqueState(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveDrillTorqueState - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveDrillTorqueState' :: SetTopDriveDrillTorqueState - implicit none - integer, intent(in) :: v - data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState = v -#ifdef deb - call Log_3( 'TopDriveDrillTorqueState=', data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState) -#endif - end subroutine - - subroutine SetTopDriveLinkTiltState(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveLinkTiltState - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveLinkTiltState' :: SetTopDriveLinkTiltState - implicit none - integer, intent(in) :: v - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState = v -#ifdef deb - call Log_3( 'TopDriveLinkTiltState=', data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState) -#endif - end subroutine - - subroutine SetTopDriveIbop(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveIbop - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveIbop' :: SetTopDriveIbop - implicit none - logical, intent(in) :: v - data%EquipmentControl%TopDrivePanel%TopDriveIbop = v -#ifdef deb - call Log_3( 'TopDriveIbop=', data%EquipmentControl%TopDrivePanel%TopDriveIbop) -#endif - end subroutine - - subroutine SetTopDriveTorqueLimitKnob(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTorqueLimitKnob - !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTorqueLimitKnob' :: SetTopDriveTorqueLimitKnob - ! use CSimulationVariables, only: IsPortable - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%RTSwitch, data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob - use CWarnings, only: Activate_TopdriveRotaryTableConfilict - use CScaleRange - implicit none - real, intent(in) :: v - if (IsPortable) then - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) call Activate_TopdriveRotaryTableConfilict() - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch == 0) then - data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = 0 - data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = v -#ifdef deb - call Log_3( 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob ) - call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob ) -#endif - endif - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) then - data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = 0 - data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = real(ScaleRange(v, 0.0, 10.0, 0.0, 6000.0), 8) -#ifdef deb - call Log_3( 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob ) - call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob ) -#endif - endif - else - data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = v -#ifdef deb - call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob) -#endif - endif - - end subroutine - - subroutine SetRpmKnob(v) - !DEC$ ATTRIBUTES DLLEXPORT :: SetRpmKnob - !DEC$ ATTRIBUTES ALIAS: 'SetRpmKnob' :: SetRpmKnob - ! use CSimulationVariables, only: IsPortable - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%RTSwitch, data%EquipmentControl%DrillingConsole%RTThrottle - use CWarnings, only: Activate_TopdriveRotaryTableConfilict - use CScaleRange - implicit none - real, intent(in) :: v - if (IsPortable) then - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) call Activate_TopdriveRotaryTableConfilict() - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch == 0) then - data%EquipmentControl%DrillingConsole%RTThrottle = 0 - data%EquipmentControl%TopDrivePanel%RpmKnob = v -#ifdef deb - call Log_3( 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle ) - call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) -#endif - endif - if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) then - data%EquipmentControl%TopDrivePanel%RpmKnob = 0 - data%EquipmentControl%DrillingConsole%RTThrottle = real(ScaleRange(v, 0.0, 965.0, 0.0, 250.0), 8) -#ifdef deb - call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) - call Log_3( 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle ) -#endif - endif - else - data%EquipmentControl%TopDrivePanel%RpmKnob = v - endif - - - - if (IsPortable) then - ! - else - data%EquipmentControl%TopDrivePanel%RpmKnob = v -#ifdef deb - call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) -#endif - endif - - end subroutine - - - ! Output routines - integer function GetTopDriveOperationFaultLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveOperationFaultLed - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveOperationFaultLed' :: GetTopDriveOperationFaultLed - implicit none - GetTopDriveOperationFaultLed = data%EquipmentControl%TopDrivePanel%TopDriveOperationFaultLed - !GetTopDriveOperationFaultLed = 1 - end function - - integer function GetTopDriveTdsPowerLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTdsPowerLed - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTdsPowerLed' :: GetTopDriveTdsPowerLed - implicit none - GetTopDriveTdsPowerLed = data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed - !GetTopDriveTdsPowerLed = 1 - end function - - integer function GetTopDriveTorqueWrenchLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueWrenchLed - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueWrenchLed' :: GetTopDriveTorqueWrenchLed - implicit none - GetTopDriveTorqueWrenchLed = data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed - !GetTopDriveTorqueWrenchLed = 1 - end function - - integer function GetTopDriveLinkTiltLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveLinkTiltLed - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveLinkTiltLed' :: GetTopDriveLinkTiltLed - implicit none - GetTopDriveLinkTiltLed = data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed - !GetTopDriveLinkTiltLed = 1 - end function - - integer function GetTopDriveIbopLed() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveIbopLed - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveIbopLed' :: GetTopDriveIbopLed - implicit none - GetTopDriveIbopLed = data%EquipmentControl%TopDrivePanel%TopDriveIbopLed - !GetTopDriveIbopLed = 1 - end function - - real function GetTopDriveTorqueGauge() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueGauge - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueGauge' :: GetTopDriveTorqueGauge - implicit none - GetTopDriveTorqueGauge = data%EquipmentControl%TopDrivePanel%TopDriveTorqueGauge - !GetTopDriveTorqueGauge = 340 - end function - - real function GetTopDriveTorqueLimitGauge() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueLimitGauge - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueLimitGauge' :: GetTopDriveTorqueLimitGauge - implicit none - GetTopDriveTorqueLimitGauge = data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitGauge - !GetTopDriveTorqueLimitGauge = 442 - end function - - real function GetTopDriveRpmGauge() - !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveRpmGauge - !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveRpmGauge' :: GetTopDriveRpmGauge - implicit none - GetTopDriveRpmGauge = data%EquipmentControl%TopDrivePanel%TopDriveRpmGauge - !GetTopDriveRpmGauge = 67 - end function - - - end module CTopDrivePanel +module CTopDrivePanel + use CTopDrivePanelVariables + use SimulationVariables + use CLog3 + implicit none + public + contains + + ! Input routines + subroutine SetTopDriveTdsPowerState(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTdsPowerState + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTdsPowerState' :: SetTopDriveTdsPowerState + implicit none + integer, intent(in) :: v + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState = v +#ifdef deb + call Log_3( 'TopDriveTdsPowerState=', data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState) +#endif + end subroutine + + subroutine SetTopDriveTorqueWrench(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTorqueWrench + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTorqueWrench' :: SetTopDriveTorqueWrench + implicit none + logical, intent(in) :: v + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench = v +#ifdef deb + call Log_3( 'TopDriveTorqueWrench=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench) +#endif + end subroutine + + subroutine SetTopDriveDrillTorqueState(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveDrillTorqueState + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveDrillTorqueState' :: SetTopDriveDrillTorqueState + implicit none + integer, intent(in) :: v + data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState = v +#ifdef deb + call Log_3( 'TopDriveDrillTorqueState=', data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState) +#endif + end subroutine + + subroutine SetTopDriveLinkTiltState(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveLinkTiltState + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveLinkTiltState' :: SetTopDriveLinkTiltState + implicit none + integer, intent(in) :: v + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState = v +#ifdef deb + call Log_3( 'TopDriveLinkTiltState=', data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState) +#endif + end subroutine + + subroutine SetTopDriveIbop(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveIbop + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveIbop' :: SetTopDriveIbop + implicit none + logical, intent(in) :: v + data%EquipmentControl%TopDrivePanel%TopDriveIbop = v +#ifdef deb + call Log_3( 'TopDriveIbop=', data%EquipmentControl%TopDrivePanel%TopDriveIbop) +#endif + end subroutine + + subroutine SetTopDriveTorqueLimitKnob(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetTopDriveTorqueLimitKnob + !DEC$ ATTRIBUTES ALIAS: 'SetTopDriveTorqueLimitKnob' :: SetTopDriveTorqueLimitKnob + ! use CSimulationVariables, only: IsPortable + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%RTSwitch, data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob + use CWarnings, only: Activate_TopdriveRotaryTableConfilict + use CScaleRange + implicit none + real, intent(in) :: v + if (IsPortable) then + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) call Activate_TopdriveRotaryTableConfilict() + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch == 0) then + data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = 0 + data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = v +#ifdef deb + call Log_3( 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob ) + call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob ) +#endif + endif + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) then + data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = 0 + data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob = real(ScaleRange(v, 0.0, 10.0, 0.0, 6000.0), 8) +#ifdef deb + call Log_3( 'RTTorqueLimitKnob=', data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob ) + call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob ) +#endif + endif + else + data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob = v +#ifdef deb + call Log_3( 'TopDriveTorqueLimitKnob=', data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitKnob) +#endif + endif + + end subroutine + + subroutine SetRpmKnob(v) + !DEC$ ATTRIBUTES DLLEXPORT :: SetRpmKnob + !DEC$ ATTRIBUTES ALIAS: 'SetRpmKnob' :: SetRpmKnob + ! use CSimulationVariables, only: IsPortable + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%RTSwitch, data%EquipmentControl%DrillingConsole%RTThrottle + use CWarnings, only: Activate_TopdriveRotaryTableConfilict + use CScaleRange + implicit none + real, intent(in) :: v + if (IsPortable) then + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) call Activate_TopdriveRotaryTableConfilict() + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch == 0) then + data%EquipmentControl%DrillingConsole%RTThrottle = 0 + data%EquipmentControl%TopDrivePanel%RpmKnob = v +#ifdef deb + call Log_3( 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle ) + call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) +#endif + endif + if(data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == 0 .and. data%EquipmentControl%DrillingConsole%RTSwitch /= 0) then + data%EquipmentControl%TopDrivePanel%RpmKnob = 0 + data%EquipmentControl%DrillingConsole%RTThrottle = real(ScaleRange(v, 0.0, 965.0, 0.0, 250.0), 8) +#ifdef deb + call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) + call Log_3( 'RTThrottle=', data%EquipmentControl%DrillingConsole%RTThrottle ) +#endif + endif + else + data%EquipmentControl%TopDrivePanel%RpmKnob = v + endif + + + + if (IsPortable) then + ! + else + data%EquipmentControl%TopDrivePanel%RpmKnob = v +#ifdef deb + call Log_3( 'RpmKnob=', data%EquipmentControl%TopDrivePanel%RpmKnob ) +#endif + endif + + end subroutine + + + ! Output routines + integer function GetTopDriveOperationFaultLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveOperationFaultLed + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveOperationFaultLed' :: GetTopDriveOperationFaultLed + implicit none + GetTopDriveOperationFaultLed = data%EquipmentControl%TopDrivePanel%TopDriveOperationFaultLed + !GetTopDriveOperationFaultLed = 1 + end function + + integer function GetTopDriveTdsPowerLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTdsPowerLed + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTdsPowerLed' :: GetTopDriveTdsPowerLed + implicit none + GetTopDriveTdsPowerLed = data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed + !GetTopDriveTdsPowerLed = 1 + end function + + integer function GetTopDriveTorqueWrenchLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueWrenchLed + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueWrenchLed' :: GetTopDriveTorqueWrenchLed + implicit none + GetTopDriveTorqueWrenchLed = data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed + !GetTopDriveTorqueWrenchLed = 1 + end function + + integer function GetTopDriveLinkTiltLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveLinkTiltLed + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveLinkTiltLed' :: GetTopDriveLinkTiltLed + implicit none + GetTopDriveLinkTiltLed = data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed + !GetTopDriveLinkTiltLed = 1 + end function + + integer function GetTopDriveIbopLed() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveIbopLed + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveIbopLed' :: GetTopDriveIbopLed + implicit none + GetTopDriveIbopLed = data%EquipmentControl%TopDrivePanel%TopDriveIbopLed + !GetTopDriveIbopLed = 1 + end function + + real function GetTopDriveTorqueGauge() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueGauge + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueGauge' :: GetTopDriveTorqueGauge + implicit none + GetTopDriveTorqueGauge = data%EquipmentControl%TopDrivePanel%TopDriveTorqueGauge + !GetTopDriveTorqueGauge = 340 + end function + + real function GetTopDriveTorqueLimitGauge() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveTorqueLimitGauge + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveTorqueLimitGauge' :: GetTopDriveTorqueLimitGauge + implicit none + GetTopDriveTorqueLimitGauge = data%EquipmentControl%TopDrivePanel%TopDriveTorqueLimitGauge + !GetTopDriveTorqueLimitGauge = 442 + end function + + real function GetTopDriveRpmGauge() + !DEC$ ATTRIBUTES DLLEXPORT :: GetTopDriveRpmGauge + !DEC$ ATTRIBUTES ALIAS: 'GetTopDriveRpmGauge' :: GetTopDriveRpmGauge + implicit none + GetTopDriveRpmGauge = data%EquipmentControl%TopDrivePanel%TopDriveRpmGauge + !GetTopDriveRpmGauge = 67 + end function + + + end module CTopDrivePanel diff --git a/CSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 b/CSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 index d133e2d..3431e49 100644 --- a/CSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 +++ b/CSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 @@ -1,44 +1,44 @@ -module CTopDrivePanelVariables - implicit none - public - - ! const - integer :: TdsPower_REV = 1 - integer :: TdsPower_OFF = 0 - integer :: TdsPower_FWD = -1 - - integer :: TdsMu_TORQ = 1 - integer :: TdsMu_SPINE = 0 - integer :: TdsMu_DRILL = -1 - - integer :: TdsLinkTilt_TILT = 1 - integer :: TdsLinkTilt_OFF = 0 - integer :: TdsLinkTilt_DRILL = -1 - - integer :: LED_OFF = 0 - integer :: LED_ON = 1 - integer :: LED_BLINK = 2 - - ! Input vars - Type::TopDrivePanelType - integer :: TopDriveTdsPowerState - logical :: TopDriveTorqueWrench - integer :: TopDriveDrillTorqueState - integer :: TopDriveLinkTiltState - logical :: TopDriveIbop - real :: TopDriveTorqueLimitKnob - real :: RpmKnob - - - ! Output vars - integer :: TopDriveOperationFaultLed - integer :: TopDriveTdsPowerLed - integer :: TopDriveTorqueWrenchLed - integer :: TopDriveLinkTiltLed - integer :: TopDriveIbopLed - real :: TopDriveTorqueLimitGauge - real :: TopDriveTorqueGauge - real :: TopDriveRpmGauge - end type TopDrivePanelType - contains +module CTopDrivePanelVariables + implicit none + public + + ! const + integer :: TdsPower_REV = 1 + integer :: TdsPower_OFF = 0 + integer :: TdsPower_FWD = -1 + + integer :: TdsMu_TORQ = 1 + integer :: TdsMu_SPINE = 0 + integer :: TdsMu_DRILL = -1 + + integer :: TdsLinkTilt_TILT = 1 + integer :: TdsLinkTilt_OFF = 0 + integer :: TdsLinkTilt_DRILL = -1 + + integer :: LED_OFF = 0 + integer :: LED_ON = 1 + integer :: LED_BLINK = 2 + + ! Input vars + Type::TopDrivePanelType + integer :: TopDriveTdsPowerState + logical :: TopDriveTorqueWrench + integer :: TopDriveDrillTorqueState + integer :: TopDriveLinkTiltState + logical :: TopDriveIbop + real :: TopDriveTorqueLimitKnob + real :: RpmKnob + + + ! Output vars + integer :: TopDriveOperationFaultLed + integer :: TopDriveTdsPowerLed + integer :: TopDriveTorqueWrenchLed + integer :: TopDriveLinkTiltLed + integer :: TopDriveIbopLed + real :: TopDriveTorqueLimitGauge + real :: TopDriveTorqueGauge + real :: TopDriveRpmGauge + end type TopDrivePanelType + contains end module CTopDrivePanelVariables \ No newline at end of file diff --git a/CSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 b/CSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 index 8a84e12..8134350 100644 --- a/CSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 +++ b/CSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 @@ -1,34 +1,34 @@ -module CDrillWatchVariables - implicit none - - public - - - ! Input vars - Type, Public::DrillingWatchType - ! Output vars - real(8) :: Depth - real(8) :: BitPosition - real(8) :: HookLoad - real(8) :: WeightOnBit - real(8) :: RPM - real(8) :: ROP - real(8) :: Torque - real(8) :: PumpPressure - real(8) :: SPM1 - real(8) :: SPM2 - !real(8) :: SPM3 - real(8) :: CasingPressure - real(8) :: PercentFlow - real(8) :: PitGainLose - real(8) :: PitVolume - real(8) :: KillMudVolume - real(8) :: TripTankVolume - real(8) :: MudWeightIn - real(8) :: FillVolume - real(8) :: MudWeightOut - End Type DrillingWatchType - - - +module CDrillWatchVariables + implicit none + + public + + + ! Input vars + Type, Public::DrillingWatchType + ! Output vars + real(8) :: Depth + real(8) :: BitPosition + real(8) :: HookLoad + real(8) :: WeightOnBit + real(8) :: RPM + real(8) :: ROP + real(8) :: Torque + real(8) :: PumpPressure + real(8) :: SPM1 + real(8) :: SPM2 + !real(8) :: SPM3 + real(8) :: CasingPressure + real(8) :: PercentFlow + real(8) :: PitGainLose + real(8) :: PitVolume + real(8) :: KillMudVolume + real(8) :: TripTankVolume + real(8) :: MudWeightIn + real(8) :: FillVolume + real(8) :: MudWeightOut + End Type DrillingWatchType + + + end module CDrillWatchVariables \ No newline at end of file diff --git a/CSharp/Equipments/MudPathFinding/CArrangement.f90 b/CSharp/Equipments/MudPathFinding/CArrangement.f90 index cac2891..1c37692 100644 --- a/CSharp/Equipments/MudPathFinding/CArrangement.f90 +++ b/CSharp/Equipments/MudPathFinding/CArrangement.f90 @@ -1,137 +1,137 @@ -module CArrangement - implicit none - public - - integer, parameter :: Normal = 0 - integer, parameter :: Relation = 1 - integer, parameter :: Input = 2 - integer, parameter :: Output = 3 - integer, parameter :: InputOutput = 4 - - - type, public :: Arrangement - integer, allocatable :: Adjacent(:) !adjacent valves that is connected to this valve - logical :: Status !valve status ... open/close ... true/false - integer :: ValveType ! Normal/Input/Output/InputOutput - integer :: Number - logical :: IsTraversed - contains - procedure :: Init => Init - procedure :: IsConnectedTo => IsConnectedTo - procedure :: IsSource => IsSource - procedure :: Length => Length - procedure :: AdjacentTo => AdjacentTo - procedure :: RemoveAdjacent => RemoveAdjacent - end type Arrangement - contains - - subroutine Init(this, value) - implicit none - class(Arrangement), intent(inout) :: this - integer, intent(in) :: value - if(allocated(this%Adjacent)) deallocate(this%Adjacent) - this%Status = .false. - this%IsTraversed = .false. - this%ValveType = Normal - this%Number = value - end subroutine - - integer function Length(this) - implicit none - class(Arrangement), intent(in) :: this - if(allocated(this%Adjacent)) then - Length = size(this%Adjacent) - return - end if - Length = 0 - end function - - subroutine AdjacentTo(this, value) - implicit none - class(Arrangement), intent(inout) :: this - integer, intent(in) :: value - integer, allocatable :: tempArr(:) - integer :: i, isize - - if(allocated(this%Adjacent)) then - isize = size(this%Adjacent) - - ! check to see if already AdjacentTo that valve# - do i=1,isize - if(this%Adjacent(i)==value) return - end do - - ! if value is a new entry then add it to the collection - allocate(tempArr(isize+1)) - do i=1,isize - tempArr(i) = this%Adjacent(i) - end do - tempArr(isize+1) = value - deallocate(this%Adjacent) - call move_alloc(tempArr, this%Adjacent) - else - allocate(this%Adjacent(1)) - this%Adjacent(1) = value - end if - end subroutine - - logical function IsConnectedTo(this, value) - implicit none - class(Arrangement), intent(in) :: this - integer, intent(in) :: value - if(.not.allocated(this%Adjacent)) then - IsConnectedTo = .false. - return - endif - IsConnectedTo = any(this%Adjacent == value) - return - end function - - logical function IsSource(this) - implicit none - class(Arrangement), intent(in) :: this - IsSource = this%ValveType > Relation - end function - - - - subroutine RemoveAdjacent(this, value) - implicit none - class(Arrangement), intent(inout) :: this - integer, intent(in) :: value - integer, allocatable :: tempArr(:) - integer :: i, index, isize - logical :: found - - if(.not.allocated(this%Adjacent))return - index = -1 - do i=1, size(this%Adjacent) - if(this%Adjacent(i)==value) then - index = i - exit - end if - end do - - if(index <= 0 .or. index > size(this%Adjacent)) return - - allocate(tempArr(size(this%Adjacent)-1)) - found = .false. - do i=1, size(this%Adjacent) - if(i==index) then - found = .true. - cycle - end if - if(found) then - tempArr(i-1) = this%Adjacent(i) - else - tempArr(i) = this%Adjacent(i) - endif - end do - deallocate(this%Adjacent) - call move_alloc(tempArr, this%Adjacent) - - - end subroutine - - +module CArrangement + implicit none + public + + integer, parameter :: Normal = 0 + integer, parameter :: Relation = 1 + integer, parameter :: Input = 2 + integer, parameter :: Output = 3 + integer, parameter :: InputOutput = 4 + + + type, public :: Arrangement + integer, allocatable :: Adjacent(:) !adjacent valves that is connected to this valve + logical :: Status !valve status ... open/close ... true/false + integer :: ValveType ! Normal/Input/Output/InputOutput + integer :: Number + logical :: IsTraversed + contains + procedure :: Init => Init + procedure :: IsConnectedTo => IsConnectedTo + procedure :: IsSource => IsSource + procedure :: Length => Length + procedure :: AdjacentTo => AdjacentTo + procedure :: RemoveAdjacent => RemoveAdjacent + end type Arrangement + contains + + subroutine Init(this, value) + implicit none + class(Arrangement), intent(inout) :: this + integer, intent(in) :: value + if(allocated(this%Adjacent)) deallocate(this%Adjacent) + this%Status = .false. + this%IsTraversed = .false. + this%ValveType = Normal + this%Number = value + end subroutine + + integer function Length(this) + implicit none + class(Arrangement), intent(in) :: this + if(allocated(this%Adjacent)) then + Length = size(this%Adjacent) + return + end if + Length = 0 + end function + + subroutine AdjacentTo(this, value) + implicit none + class(Arrangement), intent(inout) :: this + integer, intent(in) :: value + integer, allocatable :: tempArr(:) + integer :: i, isize + + if(allocated(this%Adjacent)) then + isize = size(this%Adjacent) + + ! check to see if already AdjacentTo that valve# + do i=1,isize + if(this%Adjacent(i)==value) return + end do + + ! if value is a new entry then add it to the collection + allocate(tempArr(isize+1)) + do i=1,isize + tempArr(i) = this%Adjacent(i) + end do + tempArr(isize+1) = value + deallocate(this%Adjacent) + call move_alloc(tempArr, this%Adjacent) + else + allocate(this%Adjacent(1)) + this%Adjacent(1) = value + end if + end subroutine + + logical function IsConnectedTo(this, value) + implicit none + class(Arrangement), intent(in) :: this + integer, intent(in) :: value + if(.not.allocated(this%Adjacent)) then + IsConnectedTo = .false. + return + endif + IsConnectedTo = any(this%Adjacent == value) + return + end function + + logical function IsSource(this) + implicit none + class(Arrangement), intent(in) :: this + IsSource = this%ValveType > Relation + end function + + + + subroutine RemoveAdjacent(this, value) + implicit none + class(Arrangement), intent(inout) :: this + integer, intent(in) :: value + integer, allocatable :: tempArr(:) + integer :: i, index, isize + logical :: found + + if(.not.allocated(this%Adjacent))return + index = -1 + do i=1, size(this%Adjacent) + if(this%Adjacent(i)==value) then + index = i + exit + end if + end do + + if(index <= 0 .or. index > size(this%Adjacent)) return + + allocate(tempArr(size(this%Adjacent)-1)) + found = .false. + do i=1, size(this%Adjacent) + if(i==index) then + found = .true. + cycle + end if + if(found) then + tempArr(i-1) = this%Adjacent(i) + else + tempArr(i) = this%Adjacent(i) + endif + end do + deallocate(this%Adjacent) + call move_alloc(tempArr, this%Adjacent) + + + end subroutine + + end module CArrangement \ No newline at end of file diff --git a/CSharp/Equipments/MudPathFinding/CManifolds.f90 b/CSharp/Equipments/MudPathFinding/CManifolds.f90 index c315d37..52334b9 100644 --- a/CSharp/Equipments/MudPathFinding/CManifolds.f90 +++ b/CSharp/Equipments/MudPathFinding/CManifolds.f90 @@ -1,1396 +1,1396 @@ -module CManifolds - use CStack - use CArrangement - ! use CPathChangeEvents - ! use CDrillingConsoleVariables - use SimulationVariables - ! use ConfigurationVariables, only: EquipmentControl - - implicit none - - public - integer, parameter :: ValveCount = 128 - integer, parameter :: MinSource = 71 - integer, parameter :: MaxSource = 90 - integer, parameter :: MinRelation = 91 - integer, parameter :: MaxRelation = 128 - - Type::ManifoldType - type(Arrangement) :: Valve(ValveCount) - type(Path), allocatable :: OpenPaths(:) - type(Stack) :: Fringe - logical :: IsRepititveOutput - - logical :: IsSafetyValveInstalled - logical :: IsSafetyValveInstalled_KellyMode - logical :: IsSafetyValveInstalled_TripMode - logical :: IsSafetyValveInstalled_TopDrive - logical :: SafetyValve - logical :: IsIBopInstalled - logical :: IBop - logical :: IsKellyCockInstalled - logical :: KellyCock - logical :: IsTopDriveIBopInstalled - logical :: TopDriveIBop - logical :: IsFloatValveInstalled - logical :: FloatValve - logical :: IsPathsDirty = .false. - logical :: IsTraverse = .false. - End type ManifoldType - type(ManifoldType)::Manifold - contains - - subroutine PathFinding_Setup() - ! use CSimulationVariables - implicit none - Manifold%IsTraverse = .false. - call Setup() - !call OnSimulationInitialization%Add(PathFinding_Init) - !call OnSimulationStop%Add(PathFinding_Init) - !!**call OnpPathFindingStep%Add(PathFinding_Step) - !!**call OnpPathFindingOutput%Add(PathFinding_Output) - ! !**call OnpPathFindingMain%Add(PathFindingMainBody) - end subroutine - - subroutine PathFinding_Init - implicit none - Manifold%IsTraverse = .false. - call Setup() - end subroutine PathFinding_Init - - subroutine PathFinding_Step - if (Manifold%IsPathsDirty) then - Manifold%IsPathsDirty = .false. - call Traverse() - endif -end subroutine PathFinding_Step - - ! subroutine PathFinding_Output - ! implicit none - ! end subroutine PathFinding_Output - - ! subroutine PathFindingMainBody - ! ! use CSimulationVariables - ! implicit none - ! loop : do - ! if(IsStopped) call Quit() - ! call sleepqq(50) - ! if (Manifold%IsPathsDirty) then - ! Manifold%IsPathsDirty = .false. - ! call Traverse() - ! endif - ! end do loop - ! end subroutine PathFindingMainBody - - subroutine Traverse() - use CLog5 - implicit none - integer :: i, Duration - integer, dimension(8) :: StartTime,EndTime !TODO: clean up - call DATE_AND_TIME(values=StartTime) !TODO: clean up - - !**call BeforeTraverse%RunAll() - - - if(allocated(Manifold%OpenPaths)) deallocate(Manifold%OpenPaths) - do i=MinSource, MaxSource - if(IsValveOpen(i)) then - call AddRootNode(i) - call AddChildren(Manifold%Valve(i)) - endif - enddo - - call PostProcess(Manifold%OpenPaths) - - !**call AfterTraverse%RunAll() - - Manifold%IsTraverse = .true. - - !TODO: clean up -#ifdef Log5 - CALL DATE_AND_TIME(values=EndTime) - Duration= EndTime(8) - StartTime(8) - !print*, 'Duration= ', Duration, 'ms' - call Log_5('Duration= ', Duration) - call DisplayOpenPaths() - - call Log_5('==========================================') -#endif - - endsubroutine - - subroutine PostProcess(pathArr) - implicit none - type(Path), allocatable, intent(inout) :: pathArr(:) - integer :: i - - if(.not.allocated(pathArr)) return - - i = 1 - do - call pathArr(i)%Purge(MinRelation, MaxRelation) - - if(pathArr(i)%Length() <= 2) then - call RemovePath(pathArr, i) - else - i = i + 1 - endif - - if(i > size(pathArr)) exit - enddo - - end subroutine - - subroutine AddRootNode(valve) - implicit none - integer, intent(in) :: valve - call Manifold%Fringe%Push(valve) - end subroutine - - recursive subroutine AddChildren(node) - implicit none - type(Arrangement), intent(inout) :: node - integer :: i,t - - do i=1, Manifold%Valve(node%Number)%Length() - t = Manifold%Valve(node%Number)%Adjacent(i) - - if(IsValveOpen(t)) then - - if(Manifold%Fringe%DoesHave(t)) cycle - - call Manifold%Fringe%Push(t) - - if(Manifold%Valve(t)%IsSource()) then - call AddPath(Manifold%OpenPaths, Manifold%Fringe%List) - call Manifold%Fringe%Pop() - cycle - endif - - call AddChildren(Manifold%Valve(node%Adjacent(i))) - - end if - enddo - call Manifold%Fringe%Pop() - end subroutine - - logical function IsValveOpen(no) - implicit none - integer, intent(in) :: no - - IsValveOpen = Manifold%Valve(no)%Status - - end function - - subroutine AddPath(pathArr, p) - implicit none - type(Path), intent(in) :: p - type(Path), allocatable, intent(inout) :: pathArr(:) - type(Path), allocatable :: tempArr(:) - integer :: i, isize - - if(p%IsNull()) return - if(p%Length()<=1) return - - !**call OnpPathOpen%RunAll(p%Valves) - - if(allocated(pathArr)) then - isize = size(pathArr) - - - ! check to see if already have a path same as p - do i=1,isize - if(pathArr(i)%First()==p%First() .and. pathArr(i)%Last()==p%Last()) then - ! if there is then - ! check to see if both have exacly a same length - if(pathArr(i)%Length()==p%Length())then - ! now they are the same so ignore adding this one - return - else - !if they have different lengths then choose the shorter one - if(pathArr(i)%Length()>p%Length())pathArr(i) = p - return - endif - - endif - end do - - - - !TODO: if p last valve is input source then ignore adding it - !TODO: if p start valve is output source then ignore adding it - - - - ! if p is a new entry then add it to the collections of found paths - allocate(tempArr(isize+1)) - do i=1,isize - tempArr(i) = pathArr(i) - end do - tempArr(isize+1) = p - deallocate(pathArr) - call move_alloc(tempArr, pathArr) - else - allocate(pathArr(1)) - pathArr(1) = p - end if - - endsubroutine - - subroutine RemovePath(pathArr, index) - implicit none - integer, intent(in) :: index - type(Path), allocatable, intent(inout) :: pathArr(:) - type(Path), allocatable :: tempArr(:) - integer :: i - logical :: found - - if(index <= 0 .or. index > size(pathArr)) return - if(.not.allocated(pathArr))return - allocate(tempArr(size(pathArr)-1)) - found = .false. - do i=1, size(pathArr) - if(i==index) then - found = .true. - cycle - end if - if(found) then - tempArr(i-1) = pathArr(i) - !!**call OnpPathClose%RunAll(pathArr(i)%Valves) - else - tempArr(i) = pathArr(i) - endif - end do - deallocate(pathArr) - call move_alloc(tempArr, pathArr) - - endsubroutine - - subroutine Setup() - implicit none - integer :: i - - ! initialize all valves - do i = 1, ValveCount - call Manifold%Valve(i)%init(i) - end do - - ! open source valves - do i = MinSource , MaxSource - Manifold%Valve(i)%Status = .true. - Manifold%Valve(i)%ValveType = InputOutput - end do - - do i = MinRelation , MaxRelation - Manifold%Valve(i)%Status = .true. - Manifold%Valve(i)%ValveType = Relation - end do - - - - ! make adjustments - call Manifold%Valve(1)%AdjacentTo(91) - - call Manifold%Valve(2)%AdjacentTo(92) - call Manifold%Valve(2)%AdjacentTo(117) - - call Manifold%Valve(3)%AdjacentTo(93) - call Manifold%Valve(3)%AdjacentTo(118) - - call Manifold%Valve(4)%AdjacentTo(94) - - call Manifold%Valve(5)%AdjacentTo(95) - - call Manifold%Valve(6)%AdjacentTo(91) - call Manifold%Valve(6)%AdjacentTo(92) - - call Manifold%Valve(7)%AdjacentTo(92) - call Manifold%Valve(7)%AdjacentTo(93) - - call Manifold%Valve(8)%AdjacentTo(93) - call Manifold%Valve(8)%AdjacentTo(94) - - call Manifold%Valve(9)%AdjacentTo(91) - call Manifold%Valve(9)%AdjacentTo(96) - - call Manifold%Valve(10)%AdjacentTo(94) - call Manifold%Valve(10)%AdjacentTo(98) - - call Manifold%Valve(11)%AdjacentTo(96) - call Manifold%Valve(11)%AdjacentTo(97) - - call Manifold%Valve(12)%AdjacentTo(97) - call Manifold%Valve(12)%AdjacentTo(98) - - call Manifold%Valve(13)%AdjacentTo(96) - call Manifold%Valve(13)%AdjacentTo(99) - - call Manifold%Valve(14)%AdjacentTo(78) - call Manifold%Valve(14)%AdjacentTo(97) - !call Valve(14)%AdjacentTo(126) - - call Manifold%Valve(15)%AdjacentTo(98) - call Manifold%Valve(15)%AdjacentTo(99) - - call Manifold%Valve(16)%AdjacentTo(121) - !call Valve(16)%AdjacentTo() - - call Manifold%Valve(17)%AdjacentTo(122) - !call Valve(17)%AdjacentTo() - - call Manifold%Valve(18)%AdjacentTo(123) - !call Valve(18)%AdjacentTo() - - call Manifold%Valve(19)%AdjacentTo(101) - call Manifold%Valve(19)%AdjacentTo(102) - - call Manifold%Valve(20)%AdjacentTo(100) - - call Manifold%Valve(21)%AdjacentTo(101) - - call Manifold%Valve(22)%AdjacentTo(102) - - call Manifold%Valve(23)%AdjacentTo(71) - - call Manifold%Valve(24)%AdjacentTo(71) - - call Manifold%Valve(25)%AdjacentTo(108) - call Manifold%Valve(25)%AdjacentTo(118) - - call Manifold%Valve(26)%AdjacentTo(109) - call Manifold%Valve(26)%AdjacentTo(117) - - call Manifold%Valve(27)%AdjacentTo(32) - call Manifold%Valve(27)%AdjacentTo(108) - - call Manifold%Valve(28)%AdjacentTo(33) - call Manifold%Valve(28)%AdjacentTo(108) - - call Manifold%Valve(29)%AdjacentTo(110) - call Manifold%Valve(29)%AdjacentTo(113) - - call Manifold%Valve(30)%AdjacentTo(34) - call Manifold%Valve(30)%AdjacentTo(109) - - call Manifold%Valve(31)%AdjacentTo(35) - call Manifold%Valve(31)%AdjacentTo(109) - - call Manifold%Valve(32)%AdjacentTo(27) - call Manifold%Valve(32)%AdjacentTo(61) - - call Manifold%Valve(33)%AdjacentTo(28) - call Manifold%Valve(33)%AdjacentTo(62) - - call Manifold%Valve(34)%AdjacentTo(30) - call Manifold%Valve(34)%AdjacentTo(63) - - call Manifold%Valve(35)%AdjacentTo(31) - call Manifold%Valve(35)%AdjacentTo(64) - - call Manifold%Valve(36)%AdjacentTo(116) - - call Manifold%Valve(37)%AdjacentTo(78) - - call Manifold%Valve(38)%AdjacentTo(71) - - call Manifold%Valve(39)%AdjacentTo(77) - - !call Valve(40)%AdjacentTo(105) - call Manifold%Valve(40)%AdjacentTo(80) - - call Manifold%Valve(41)%AdjacentTo(77) - - call Manifold%Valve(42)%AdjacentTo(71) - - call Manifold%Valve(43)%AdjacentTo(106) - - call Manifold%Valve(44)%AdjacentTo(77) - - call Manifold%Valve(45)%AdjacentTo(71) - - call Manifold%Valve(46)%AdjacentTo(104) - - call Manifold%Valve(47)%AdjacentTo(104) - call Manifold%Valve(47)%AdjacentTo(117) - - call Manifold%Valve(48)%AdjacentTo(69) - call Manifold%Valve(48)%AdjacentTo(79) - - call Manifold%Valve(49)%AdjacentTo(104) - call Manifold%Valve(49)%AdjacentTo(79) - - !call Valve(50)%AdjacentTo(48) - call Manifold%Valve(50)%AdjacentTo(51) - !call Valve(50)%AdjacentTo(54) - call Manifold%Valve(50)%AdjacentTo(104) - - call Manifold%Valve(51)%AdjacentTo(50) - call Manifold%Valve(51)%AdjacentTo(52) - - call Manifold%Valve(52)%AdjacentTo(51) - !call Valve(52)%AdjacentTo(127) - call Manifold%Valve(52)%AdjacentTo(80) - - !call Valve(53)%AdjacentTo(103) - !call Valve(53)%AdjacentTo(105) - call Manifold%Valve(53)%AdjacentTo(80) - - !call Valve(54)%AdjacentTo(69) - !call Valve(54)%AdjacentTo(124) - - !call Valve(55)%AdjacentTo(103) - !call Valve(55)%AdjacentTo(124) - - call Manifold%Valve(56)%AdjacentTo(128) - call Manifold%Valve(56)%AdjacentTo(127) - - !call Valve(57)%AdjacentTo(14) - !call Valve(57)%AdjacentTo(103) - !call Valve(57)%AdjacentTo(126) - - call Manifold%Valve(58)%AdjacentTo(78) - - call Manifold%Valve(59)%AdjacentTo(78) - - call Manifold%Valve(60)%AdjacentTo(78) - - call Manifold%Valve(61)%AdjacentTo(32) - call Manifold%Valve(61)%AdjacentTo(115) - - call Manifold%Valve(62)%AdjacentTo(33) - call Manifold%Valve(62)%AdjacentTo(114) - - call Manifold%Valve(63)%AdjacentTo(112) - call Manifold%Valve(63)%AdjacentTo(34) - - call Manifold%Valve(64)%AdjacentTo(35) - call Manifold%Valve(64)%AdjacentTo(111) - - call Manifold%Valve(65)%AdjacentTo(120) - - call Manifold%Valve(66)%AdjacentTo(120) - - call Manifold%Valve(67)%AdjacentTo(73) - - call Manifold%Valve(68)%AdjacentTo(125) - call Manifold%Valve(68)%AdjacentTo(126) - - call Manifold%Valve(69)%AdjacentTo(48) - call Manifold%Valve(69)%AdjacentTo(124) - - !call Valve(70)%AdjacentTo() - !call Valve(70)%AdjacentTo() - - call Manifold%Valve(71)%AdjacentTo(20) - call Manifold%Valve(71)%AdjacentTo(44) - call Manifold%Valve(71)%AdjacentTo(59) - - call Manifold%Valve(72)%AdjacentTo(21) - call Manifold%Valve(72)%AdjacentTo(23) - - call Manifold%Valve(73)%AdjacentTo(22) - - call Manifold%Valve(74)%AdjacentTo(24) - - !call Valve(75)%AdjacentTo() - - !call Valve(76)%AdjacentTo() - - call Manifold%Valve(77)%AdjacentTo(43) - call Manifold%Valve(77)%AdjacentTo(58) - - !call Valve(78)%AdjacentTo() - - call Manifold%Valve(79)%AdjacentTo(48) - call Manifold%Valve(79)%AdjacentTo(49) - - call Manifold%Valve(80)%AdjacentTo(52) - call Manifold%Valve(80)%AdjacentTo(107) - - call Manifold%Valve(81)%AdjacentTo(53) - - call Manifold%Valve(82)%AdjacentTo(16) - - call Manifold%Valve(83)%AdjacentTo(17) - - call Manifold%Valve(84)%AdjacentTo(18) - - !call Valve(85)%AdjacentTo() - - !call Valve(86)%AdjacentTo() - - !call Valve(87)%AdjacentTo() - - !call Valve(88)%AdjacentTo() - - !!call Valve(89)%AdjacentTo() - - !call Valve(90)%AdjacentTo() - - call Manifold%Valve(91)%AdjacentTo(6) - call Manifold%Valve(91)%AdjacentTo(9) - call Manifold%Valve(91)%AdjacentTo(75) - - call Manifold%Valve(92)%AdjacentTo(6) - call Manifold%Valve(92)%AdjacentTo(7) - call Manifold%Valve(92)%AdjacentTo(2) - - call Manifold%Valve(93)%AdjacentTo(3) - call Manifold%Valve(93)%AdjacentTo(7) - call Manifold%Valve(93)%AdjacentTo(8) - - call Manifold%Valve(94)%AdjacentTo(8) - call Manifold%Valve(94)%AdjacentTo(10) - call Manifold%Valve(94)%AdjacentTo(95) - - call Manifold%Valve(95)%AdjacentTo(76) - call Manifold%Valve(95)%AdjacentTo(94) - - call Manifold%Valve(96)%AdjacentTo(9) - call Manifold%Valve(96)%AdjacentTo(11) - call Manifold%Valve(96)%AdjacentTo(13) - - call Manifold%Valve(97)%AdjacentTo(11) - call Manifold%Valve(97)%AdjacentTo(12) - call Manifold%Valve(97)%AdjacentTo(14) - - call Manifold%Valve(98)%AdjacentTo(10) - call Manifold%Valve(98)%AdjacentTo(12) - call Manifold%Valve(98)%AdjacentTo(15) - - call Manifold%Valve(99)%AdjacentTo(13) - call Manifold%Valve(99)%AdjacentTo(15) - call Manifold%Valve(99)%AdjacentTo(125) - - !call Valve(100)%AdjacentTo(16) - call Manifold%Valve(100)%AdjacentTo(82) - call Manifold%Valve(100)%AdjacentTo(101) - - !call Valve(101)%AdjacentTo(17) - call Manifold%Valve(101)%AdjacentTo(19) - call Manifold%Valve(101)%AdjacentTo(83) - call Manifold%Valve(101)%AdjacentTo(100) - - !call Valve(102)%AdjacentTo(18) - call Manifold%Valve(102)%AdjacentTo(19) - call Manifold%Valve(102)%AdjacentTo(84) - - !call Valve(103)%AdjacentTo(53) - !call Valve(103)%AdjacentTo(56) - call Manifold%Valve(103)%AdjacentTo(124) - !call Valve(103)%AdjacentTo(56) - !call Valve(103)%AdjacentTo(78) - - call Manifold%Valve(104)%AdjacentTo(46) - call Manifold%Valve(104)%AdjacentTo(47) - call Manifold%Valve(104)%AdjacentTo(49) - call Manifold%Valve(104)%AdjacentTo(50) - - !call Valve(105)%AdjacentTo(53) - !call Valve(105)%AdjacentTo(107) - !call Valve(105)%AdjacentTo(127) - - call Manifold%Valve(106)%AdjacentTo(40) - call Manifold%Valve(106)%AdjacentTo(45) - - - call Manifold%Valve(107)%AdjacentTo(41) - !call Valve(107)%AdjacentTo(105) - call Manifold%Valve(107)%AdjacentTo(119) - !call Valve(107)%AdjacentTo(42) - - call Manifold%Valve(108)%AdjacentTo(25) - call Manifold%Valve(108)%AdjacentTo(27) - call Manifold%Valve(108)%AdjacentTo(28) - call Manifold%Valve(108)%AdjacentTo(110) - - call Manifold%Valve(109)%AdjacentTo(26) - call Manifold%Valve(109)%AdjacentTo(30) - call Manifold%Valve(109)%AdjacentTo(31) - call Manifold%Valve(109)%AdjacentTo(110) - - call Manifold%Valve(110)%AdjacentTo(29) - call Manifold%Valve(110)%AdjacentTo(85) - call Manifold%Valve(110)%AdjacentTo(108) - call Manifold%Valve(110)%AdjacentTo(109) - - call Manifold%Valve(111)%AdjacentTo(37) - call Manifold%Valve(111)%AdjacentTo(64) - call Manifold%Valve(111)%AdjacentTo(112) - - call Manifold%Valve(112)%AdjacentTo(63) - call Manifold%Valve(112)%AdjacentTo(111) - call Manifold%Valve(112)%AdjacentTo(113) - - call Manifold%Valve(113)%AdjacentTo(29) - call Manifold%Valve(113)%AdjacentTo(112) - call Manifold%Valve(113)%AdjacentTo(114) - - call Manifold%Valve(114)%AdjacentTo(62) - call Manifold%Valve(114)%AdjacentTo(113) - call Manifold%Valve(114)%AdjacentTo(115) - - call Manifold%Valve(115)%AdjacentTo(36) - call Manifold%Valve(115)%AdjacentTo(61) - call Manifold%Valve(115)%AdjacentTo(114) - - call Manifold%Valve(116)%AdjacentTo(38) - call Manifold%Valve(116)%AdjacentTo(39) - - call Manifold%Valve(117)%AdjacentTo(2) - call Manifold%Valve(117)%AdjacentTo(26) - call Manifold%Valve(117)%AdjacentTo(47) - - call Manifold%Valve(118)%AdjacentTo(3) - call Manifold%Valve(118)%AdjacentTo(25) - call Manifold%Valve(118)%AdjacentTo(46) - - call Manifold%Valve(119)%AdjacentTo(42) - call Manifold%Valve(119)%AdjacentTo(60) - call Manifold%Valve(119)%AdjacentTo(107) - - call Manifold%Valve(120)%AdjacentTo(71) - - !call Valve(121)%AdjacentTo(16) - call Manifold%Valve(121)%AdjacentTo(1) - call Manifold%Valve(121)%AdjacentTo(65) - - !call Valve(122)%AdjacentTo(17) - call Manifold%Valve(122)%AdjacentTo(4) - call Manifold%Valve(122)%AdjacentTo(66) - - !call Valve(123)%AdjacentTo(18) - call Manifold%Valve(123)%AdjacentTo(5) - call Manifold%Valve(123)%AdjacentTo(67) - - !call Valve(124)%AdjacentTo(54) - !call Valve(124)%AdjacentTo(55) - call Manifold%Valve(124)%AdjacentTo(69) - call Manifold%Valve(124)%AdjacentTo(103) - - call Manifold%Valve(125)%AdjacentTo(68) - call Manifold%Valve(125)%AdjacentTo(99) - ! call Valve(125)%AdjacentTo(126) - - call Manifold%Valve(126)%AdjacentTo(128) - call Manifold%Valve(126)%AdjacentTo(68) - !call Valve(126)%AdjacentTo(125) - - call Manifold%Valve(127)%AdjacentTo(56) - call Manifold%Valve(127)%AdjacentTo(78) - !call Valve(127)%AdjacentTo(105) - - call Manifold%Valve(128)%AdjacentTo(56) - call Manifold%Valve(128)%AdjacentTo(126) - - - ! initialization - call ChangeValve(60, .true.) - call RemoveIBop() - call ToggleFillupHead(.false.) - call ToggleMudBox(.false.) - call RemoveTopDriveIBop() - call InstallSafetyValve_KellyMode() - call KellyDisconnected() - end subroutine - - - - subroutine KellyConnected() - !use CLog3 - implicit none - - call Manifold%Valve(127)%RemoveAdjacent(78) - - call Manifold%Valve(127)%AdjacentTo(103) - call Manifold%Valve(103)%AdjacentTo(127) - -#ifdef deb - print*, 'KellyConnected()' - !call Log_3( 'KellyConnected()') -#endif - Manifold%IsPathsDirty = .true. - end subroutine - - subroutine KellyDisconnected() - !use CLog3 - implicit none - - call Manifold%Valve(127)%RemoveAdjacent(103) - call Manifold%Valve(103)%RemoveAdjacent(127) - - call Manifold%Valve(127)%AdjacentTo(78) - -#ifdef deb - print*, 'KellyDisconnected()' - !call Log_3( 'KellyDisconnected()') -#endif - - Manifold%IsPathsDirty = .true. - - end subroutine - - - - - - - - - - subroutine InstallSafetyValve_KellyMode() - implicit none - Manifold%IsSafetyValveInstalled_KellyMode = .true. - - call RemoveTopDriveIBop() - - ! Remove Safey Valve (54) - call Manifold%Valve(124)%RemoveAdjacent(54) - call Manifold%Valve(54)%RemoveAdjacent(124) - - call Manifold%Valve(69)%RemoveAdjacent(54) - call Manifold%Valve(54)%RemoveAdjacent(69) - - ! Remove 126-103 cnn - call Manifold%Valve(128)%RemoveAdjacent(127) - call Manifold%Valve(127)%RemoveAdjacent(128) - - ! now make cnn - call Manifold%Valve(124)%AdjacentTo(69) - call Manifold%Valve(69)%AdjacentTo(124) - - call Manifold%Valve(128)%AdjacentTo(56) - - call Manifold%Valve(56)%AdjacentTo(128) - call Manifold%Valve(56)%AdjacentTo(127) - - call Manifold%Valve(127)%AdjacentTo(56) - -#ifdef deb - print*, 'InstallSafetyValve_KellyMode()' -#endif - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 - call OpenSafetyValve_KellyMode() - end subroutine - - subroutine RemoveSafetyValve_KellyMode() - implicit none - Manifold%IsSafetyValveInstalled_KellyMode = .false. - - call Manifold%Valve(128)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(128) - - call Manifold%Valve(127)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(127) - - call Manifold%Valve(127)%AdjacentTo(128) - call Manifold%Valve(128)%AdjacentTo(127) - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 - call CloseSafetyValve_KellyMode() - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - -#ifdef deb - print*, 'RemoveSafetyValve_KellyMode()' -#endif - - end subroutine - - subroutine OpenSafetyValve_KellyMode() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_KellyMode) return - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - Manifold%SafetyValve = .true. - call ChangeValve(56, Manifold%SafetyValve) - -#ifdef deb - print*, 'OpenSafetyValve_KellyMode()' -#endif - - end subroutine - - subroutine CloseSafetyValve_KellyMode() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_KellyMode) return - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - Manifold%SafetyValve = .false. - call ChangeValve(56, Manifold%SafetyValve) - -#ifdef deb - print*, 'CloseSafetyValve_KellyMode()' -#endif - - end subroutine - - - - - - - - - - - subroutine InstallSafetyValve_TripMode() - implicit none - Manifold%IsSafetyValveInstalled_TripMode = .true. - - call Manifold%Valve(128)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(128) - - call Manifold%Valve(127)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(127) - - call Manifold%Valve(69)%RemoveAdjacent(124) - call Manifold%Valve(124)%RemoveAdjacent(69) - - - call Manifold%Valve(127)%AdjacentTo(128) - call Manifold%Valve(128)%AdjacentTo(127) - - call Manifold%Valve(124)%AdjacentTo(54) - call Manifold%Valve(54)%AdjacentTo(124) - - call Manifold%Valve(54)%AdjacentTo(69) - call Manifold%Valve(69)%AdjacentTo(54) - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 - call OpenSafetyValve_TripMode() - -#ifdef deb - print*, 'InstallSafetyValve_TripMode()' -#endif - - end subroutine - - subroutine RemoveSafetyValve_TripMode() - implicit none - Manifold%IsSafetyValveInstalled_TripMode = .false. - - call Manifold%Valve(124)%RemoveAdjacent(54) - call Manifold%Valve(54)%RemoveAdjacent(124) - - call Manifold%Valve(54)%RemoveAdjacent(69) - call Manifold%Valve(69)%RemoveAdjacent(54) - - call Manifold%Valve(124)%AdjacentTo(69) - call Manifold%Valve(69)%AdjacentTo(124) - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 - call CloseSafetyValve_TripMode() - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - -#ifdef deb - print*, 'RemoveSafetyValve_TripMode()' -#endif - - end subroutine - - subroutine OpenSafetyValve_TripMode() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_TripMode) return - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - Manifold%SafetyValve = .true. - call ChangeValve(54, Manifold%SafetyValve) - -#ifdef deb - print*, 'OpenSafetyValve_TripMode()' -#endif - - end subroutine - - subroutine CloseSafetyValve_TripMode() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_TripMode) return - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - Manifold%SafetyValve = .false. - call ChangeValve(54, Manifold%SafetyValve) - -#ifdef deb - print*, 'CloseSafetyValve_TripMode()' -#endif - - end subroutine - - - - - - - - - subroutine InstallSafetyValve_TopDrive() - implicit none - Manifold%IsSafetyValveInstalled_TopDrive = .true. - - call Manifold%Valve(128)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(128) - - call Manifold%Valve(127)%RemoveAdjacent(56) - call Manifold%Valve(56)%RemoveAdjacent(127) - - call Manifold%Valve(69)%RemoveAdjacent(124) - call Manifold%Valve(124)%RemoveAdjacent(69) - - call Manifold%Valve(124)%AdjacentTo(54) - call Manifold%Valve(54)%AdjacentTo(124) - - call Manifold%Valve(54)%AdjacentTo(69) - call Manifold%Valve(69)%AdjacentTo(54) - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 - call OpenSafetyValve_TopDrive() - -#ifdef deb - print*, 'InstallSafetyValve_TopDrive()' -#endif - - end subroutine - - subroutine RemoveSafetyValve_TopDrive() - implicit none - Manifold%IsSafetyValveInstalled_TopDrive = .false. - - call Manifold%Valve(124)%RemoveAdjacent(54) - call Manifold%Valve(54)%RemoveAdjacent(124) - - call Manifold%Valve(54)%RemoveAdjacent(69) - call Manifold%Valve(69)%RemoveAdjacent(54) - - call Manifold%Valve(124)%AdjacentTo(69) - call Manifold%Valve(69)%AdjacentTo(124) - - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 - call CloseSafetyValve_TopDrive() - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - -#ifdef deb - print*, 'RemoveSafetyValve_TopDrive()' -#endif - - end subroutine - - subroutine OpenSafetyValve_TopDrive() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_TopDrive) return - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 - Manifold%SafetyValve = .true. - -#ifdef deb - print*, 'OpenSafetyValve_TopDrive()' -#endif - - call ChangeValve(54, Manifold%SafetyValve) - end subroutine - - subroutine CloseSafetyValve_TopDrive() - implicit none - if(.not.Manifold%IsSafetyValveInstalled_TopDrive) return - data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 - data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 - Manifold%SafetyValve = .false. - -#ifdef deb - print*, 'CloseSafetyValve_TopDrive()' -#endif - - call ChangeValve(54, Manifold%SafetyValve) - end subroutine - - - - - - - - - - subroutine InstallIBop() - implicit none - Manifold%IsIBopInstalled = .true. - - call Manifold%Valve(103)%RemoveAdjacent(124) - call Manifold%Valve(124)%RemoveAdjacent(103) - - call Manifold%Valve(55)%AdjacentTo(103) - call Manifold%Valve(55)%AdjacentTo(124) - - call Manifold%Valve(103)%AdjacentTo(55) - call Manifold%Valve(124)%AdjacentTo(55) - -#ifdef deb - print*, 'InstallIBop()' -#endif - - data%EquipmentControl%DrillingConsole%IRIBopLed = 1 - call OpenIBop() - end subroutine - - subroutine RemoveIBop() - implicit none - Manifold%IsIBopInstalled = .false. - - call Manifold%Valve(55)%RemoveAdjacent(103) - call Manifold%Valve(55)%RemoveAdjacent(124) - - call Manifold%Valve(103)%RemoveAdjacent(55) - call Manifold%Valve(124)%RemoveAdjacent(55) - - call Manifold%Valve(103)%AdjacentTo(124) - call Manifold%Valve(124)%AdjacentTo(103) - -#ifdef deb - print*, 'RemoveIBop()' -#endif - - data%EquipmentControl%DrillingConsole%IRIBopLed = 0 - Manifold%IBop = .false. - call ChangeValve(55, Manifold%IBop) - end subroutine - - subroutine OpenIBop() - implicit none - if(.not.Manifold%IsIBopInstalled) return - Manifold%IBop = .true. - -#ifdef deb - print*, 'OpenIBop()' -#endif - - call ChangeValve(55, Manifold%IBop) - end subroutine - - subroutine CloseIBop() - implicit none - if(.not.Manifold%IsIBopInstalled) return - Manifold%IBop = .false. - -#ifdef deb - print*, 'CloseIBop()' -#endif - - call ChangeValve(55, Manifold%IBop) - end subroutine - - - - - - - subroutine InstallKellyCock() - implicit none - Manifold%IsKellyCockInstalled = .true. - - call Manifold%Valve(125)%RemoveAdjacent(126) - call Manifold%Valve(126)%RemoveAdjacent(125) - - call Manifold%Valve(125)%AdjacentTo(68) - - call Manifold%Valve(68)%AdjacentTo(125) - call Manifold%Valve(68)%AdjacentTo(126) - - call Manifold%Valve(126)%AdjacentTo(68) - -#ifdef deb - print*, 'InstallKellyCock()' -#endif - - call OpenKellyCock() - end subroutine - - subroutine RemoveKellyCock() - implicit none - Manifold%IsKellyCockInstalled = .false. - - call Manifold%Valve(125)%RemoveAdjacent(68) - call Manifold%Valve(126)%RemoveAdjacent(68) - - call Manifold%Valve(68)%RemoveAdjacent(125) - call Manifold%Valve(68)%RemoveAdjacent(126) - - call Manifold%Valve(125)%AdjacentTo(126) - call Manifold%Valve(126)%AdjacentTo(125) - - Manifold%KellyCock = .false. - call ChangeValve(68, Manifold%KellyCock) - data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 0 - data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 0 - -#ifdef deb - print*, 'RemoveKellyCock()' -#endif - - end subroutine - - subroutine OpenKellyCock() - implicit none - if(.not.Manifold%IsKellyCockInstalled) return - data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 1 - data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 0 - Manifold%KellyCock = .true. - -#ifdef deb - print*, 'OpenKellyCock()' -#endif - - call ChangeValve(68, Manifold%KellyCock) - end subroutine - - subroutine CloseKellyCock() - implicit none - if(.not.Manifold%IsKellyCockInstalled) return - data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 1 - data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 0 - Manifold%KellyCock = .false. - -#ifdef deb - print*, 'CloseKellyCock()' -#endif - - call ChangeValve(68, Manifold%KellyCock) - end subroutine - - - - - - - - - subroutine InstallTopDriveIBop() - implicit none - Manifold%IsTopDriveIBopInstalled = .true. - - call Manifold%Valve(126)%RemoveAdjacent(128) - call Manifold%Valve(128)%RemoveAdjacent(126) - - - call Manifold%Valve(126)%AdjacentTo(70) - call Manifold%Valve(70)%AdjacentTo(126) - - call Manifold%Valve(128)%AdjacentTo(70) - call Manifold%Valve(70)%AdjacentTo(128) - -#ifdef deb - print*, 'InstallTopDriveIBop()' -#endif - call OpenTopDriveIBop() - end subroutine - - subroutine RemoveTopDriveIBop() - implicit none - Manifold%IsTopDriveIBopInstalled = .false. - - call Manifold%Valve(126)%RemoveAdjacent(70) - call Manifold%Valve(70)%RemoveAdjacent(126) - - call Manifold%Valve(128)%RemoveAdjacent(70) - call Manifold%Valve(70)%RemoveAdjacent(128) - - call Manifold%Valve(126)%AdjacentTo(128) - call Manifold%Valve(128)%AdjacentTo(126) - -#ifdef deb - print*, 'RemoveTopDriveIBop()' -#endif - Manifold%TopDriveIBop = .false. - call ChangeValve(70, Manifold%TopDriveIBop) - end subroutine - - subroutine OpenTopDriveIBop() - implicit none - if(.not.Manifold%IsTopDriveIBopInstalled) return - Manifold%TopDriveIBop = .true. - call ChangeValve(70, Manifold%TopDriveIBop) -#ifdef deb - print*, 'OpenTopDriveIBop()' -#endif - end subroutine - - subroutine CloseTopDriveIBop() - implicit none - if(.not.Manifold%IsTopDriveIBopInstalled) return - Manifold%TopDriveIBop = .false. - call ChangeValve(70, Manifold%TopDriveIBop) -#ifdef deb - print*, 'CloseTopDriveIBop()' -#endif - end subroutine - - - - - - - - - - subroutine InstallFloatValve() - implicit none - Manifold%IsFloatValveInstalled = .true. - - call Manifold%Valve(69)%RemoveAdjacent(79) - call Manifold%Valve(79)%RemoveAdjacent(69) - - call Manifold%Valve(48)%AdjacentTo(69) - call Manifold%Valve(48)%AdjacentTo(79) - - call Manifold%Valve(69)%AdjacentTo(48) - call Manifold%Valve(79)%AdjacentTo(48) -#ifdef deb - print*, 'InstallFloatValve()' -#endif - call OpenFloatValve() - end subroutine - - subroutine RemoveFloatValve() - implicit none - Manifold%IsFloatValveInstalled = .false. - - call Manifold%Valve(48)%RemoveAdjacent(69) - call Manifold%Valve(48)%RemoveAdjacent(79) - - call Manifold%Valve(69)%RemoveAdjacent(48) - call Manifold%Valve(79)%RemoveAdjacent(48) - - call Manifold%Valve(69)%AdjacentTo(79) - call Manifold%Valve(79)%AdjacentTo(69) -#ifdef deb - print*, 'RemoveFloatValve()' -#endif - Manifold%FloatValve = .false. - call ChangeValve(48, Manifold%FloatValve) - end subroutine - - subroutine OpenFloatValve() - implicit none - if(.not.Manifold%IsFloatValveInstalled) return - Manifold%FloatValve = .true. -#ifdef deb - print*, 'OpenFloatValve()' -#endif - call ChangeValve(48, Manifold%FloatValve) - end subroutine - - subroutine CloseFloatValve() - implicit none - if(.not.Manifold%IsFloatValveInstalled) return - Manifold%FloatValve = .false. -#ifdef deb - print*, 'CloseFloatValve()' -#endif - call ChangeValve(48, Manifold%FloatValve) - end subroutine - - - - - - - - subroutine ToggleFillupHead(v) - implicit none - logical, intent(in) :: v - if(v) then - call Manifold%Valve(14)%RemoveAdjacent(78) - - call Manifold%Valve(14)%AdjacentTo(57) - call Manifold%Valve(57)%AdjacentTo(14) - call Manifold%Valve(57)%AdjacentTo(103) - call Manifold%Valve(103)%AdjacentTo(57) - - else - call Manifold%Valve(14)%RemoveAdjacent(57) - call Manifold%Valve(57)%RemoveAdjacent(14) - call Manifold%Valve(57)%RemoveAdjacent(103) - call Manifold%Valve(103)%RemoveAdjacent(57) - - call Manifold%Valve(14)%AdjacentTo(78) - endif - Manifold%IsPathsDirty = .true. - call ChangeValve(57, .true.) - end subroutine - - subroutine ToggleMudBox(v) - implicit none - logical, intent(in) :: v - call ChangeValve(53, v) - end subroutine - - - - - - - - - - subroutine ToggleMiddleRams(v) - implicit none - logical, intent(in) :: v - Manifold%Valve(50)%Status = v - call ChangeValve(69, v) - end subroutine - - - - - - - - - subroutine ChangeValve(i, state) - implicit none - integer, intent(in) :: i - logical, intent(in) :: state - - if(Manifold%Valve(i)%Status==state) return - Manifold%Valve(i)%Status = state - if(i == 41 .or. i == 42) then - if(Manifold%Valve(41)%Status == .false. .and. Manifold%Valve(42)%Status == .false.) then - Manifold%Valve(60)%Status = .true. - else - Manifold%Valve(60)%Status = .false. - endif - endif -#ifdef deb - print*, 'Valve(', i, ') = ', state -#endif - !call Traverse() - Manifold%IsPathsDirty = .true. - end subroutine - - - - - - subroutine DisplayOpenPaths() - implicit none - integer :: i - if(allocated(Manifold%OpenPaths)) then - do i = 1, size(Manifold%OpenPaths) - call Manifold%OpenPaths(i)%Display() - end do - end if - end subroutine - - subroutine DisplayOpenPathsWrite() - implicit none - integer :: i - if(allocated(Manifold%OpenPaths)) then - do i = 1, size(Manifold%OpenPaths) - call Manifold%OpenPaths(i)%DisplayWrite() - end do - end if - end subroutine - +module CManifolds + use CStack + use CArrangement + ! use CPathChangeEvents + ! use CDrillingConsoleVariables + use SimulationVariables + ! use ConfigurationVariables, only: EquipmentControl + + implicit none + + public + integer, parameter :: ValveCount = 128 + integer, parameter :: MinSource = 71 + integer, parameter :: MaxSource = 90 + integer, parameter :: MinRelation = 91 + integer, parameter :: MaxRelation = 128 + + Type::ManifoldType + type(Arrangement) :: Valve(ValveCount) + type(Path), allocatable :: OpenPaths(:) + type(Stack) :: Fringe + logical :: IsRepititveOutput + + logical :: IsSafetyValveInstalled + logical :: IsSafetyValveInstalled_KellyMode + logical :: IsSafetyValveInstalled_TripMode + logical :: IsSafetyValveInstalled_TopDrive + logical :: SafetyValve + logical :: IsIBopInstalled + logical :: IBop + logical :: IsKellyCockInstalled + logical :: KellyCock + logical :: IsTopDriveIBopInstalled + logical :: TopDriveIBop + logical :: IsFloatValveInstalled + logical :: FloatValve + logical :: IsPathsDirty = .false. + logical :: IsTraverse = .false. + End type ManifoldType + type(ManifoldType)::Manifold + contains + + subroutine PathFinding_Setup() + ! use CSimulationVariables + implicit none + Manifold%IsTraverse = .false. + call Setup() + !call OnSimulationInitialization%Add(PathFinding_Init) + !call OnSimulationStop%Add(PathFinding_Init) + !!**call OnpPathFindingStep%Add(PathFinding_Step) + !!**call OnpPathFindingOutput%Add(PathFinding_Output) + ! !**call OnpPathFindingMain%Add(PathFindingMainBody) + end subroutine + + subroutine PathFinding_Init + implicit none + Manifold%IsTraverse = .false. + call Setup() + end subroutine PathFinding_Init + + subroutine PathFinding_Step + if (Manifold%IsPathsDirty) then + Manifold%IsPathsDirty = .false. + call Traverse() + endif +end subroutine PathFinding_Step + + ! subroutine PathFinding_Output + ! implicit none + ! end subroutine PathFinding_Output + + ! subroutine PathFindingMainBody + ! ! use CSimulationVariables + ! implicit none + ! loop : do + ! if(IsStopped) call Quit() + ! call sleepqq(50) + ! if (Manifold%IsPathsDirty) then + ! Manifold%IsPathsDirty = .false. + ! call Traverse() + ! endif + ! end do loop + ! end subroutine PathFindingMainBody + + subroutine Traverse() + use CLog5 + implicit none + integer :: i, Duration + integer, dimension(8) :: StartTime,EndTime !TODO: clean up + call DATE_AND_TIME(values=StartTime) !TODO: clean up + + !**call BeforeTraverse%RunAll() + + + if(allocated(Manifold%OpenPaths)) deallocate(Manifold%OpenPaths) + do i=MinSource, MaxSource + if(IsValveOpen(i)) then + call AddRootNode(i) + call AddChildren(Manifold%Valve(i)) + endif + enddo + + call PostProcess(Manifold%OpenPaths) + + !**call AfterTraverse%RunAll() + + Manifold%IsTraverse = .true. + + !TODO: clean up +#ifdef Log5 + CALL DATE_AND_TIME(values=EndTime) + Duration= EndTime(8) - StartTime(8) + !print*, 'Duration= ', Duration, 'ms' + call Log_5('Duration= ', Duration) + call DisplayOpenPaths() + + call Log_5('==========================================') +#endif + + endsubroutine + + subroutine PostProcess(pathArr) + implicit none + type(Path), allocatable, intent(inout) :: pathArr(:) + integer :: i + + if(.not.allocated(pathArr)) return + + i = 1 + do + call pathArr(i)%Purge(MinRelation, MaxRelation) + + if(pathArr(i)%Length() <= 2) then + call RemovePath(pathArr, i) + else + i = i + 1 + endif + + if(i > size(pathArr)) exit + enddo + + end subroutine + + subroutine AddRootNode(valve) + implicit none + integer, intent(in) :: valve + call Manifold%Fringe%Push(valve) + end subroutine + + recursive subroutine AddChildren(node) + implicit none + type(Arrangement), intent(inout) :: node + integer :: i,t + + do i=1, Manifold%Valve(node%Number)%Length() + t = Manifold%Valve(node%Number)%Adjacent(i) + + if(IsValveOpen(t)) then + + if(Manifold%Fringe%DoesHave(t)) cycle + + call Manifold%Fringe%Push(t) + + if(Manifold%Valve(t)%IsSource()) then + call AddPath(Manifold%OpenPaths, Manifold%Fringe%List) + call Manifold%Fringe%Pop() + cycle + endif + + call AddChildren(Manifold%Valve(node%Adjacent(i))) + + end if + enddo + call Manifold%Fringe%Pop() + end subroutine + + logical function IsValveOpen(no) + implicit none + integer, intent(in) :: no + + IsValveOpen = Manifold%Valve(no)%Status + + end function + + subroutine AddPath(pathArr, p) + implicit none + type(Path), intent(in) :: p + type(Path), allocatable, intent(inout) :: pathArr(:) + type(Path), allocatable :: tempArr(:) + integer :: i, isize + + if(p%IsNull()) return + if(p%Length()<=1) return + + !**call OnpPathOpen%RunAll(p%Valves) + + if(allocated(pathArr)) then + isize = size(pathArr) + + + ! check to see if already have a path same as p + do i=1,isize + if(pathArr(i)%First()==p%First() .and. pathArr(i)%Last()==p%Last()) then + ! if there is then + ! check to see if both have exacly a same length + if(pathArr(i)%Length()==p%Length())then + ! now they are the same so ignore adding this one + return + else + !if they have different lengths then choose the shorter one + if(pathArr(i)%Length()>p%Length())pathArr(i) = p + return + endif + + endif + end do + + + + !TODO: if p last valve is input source then ignore adding it + !TODO: if p start valve is output source then ignore adding it + + + + ! if p is a new entry then add it to the collections of found paths + allocate(tempArr(isize+1)) + do i=1,isize + tempArr(i) = pathArr(i) + end do + tempArr(isize+1) = p + deallocate(pathArr) + call move_alloc(tempArr, pathArr) + else + allocate(pathArr(1)) + pathArr(1) = p + end if + + endsubroutine + + subroutine RemovePath(pathArr, index) + implicit none + integer, intent(in) :: index + type(Path), allocatable, intent(inout) :: pathArr(:) + type(Path), allocatable :: tempArr(:) + integer :: i + logical :: found + + if(index <= 0 .or. index > size(pathArr)) return + if(.not.allocated(pathArr))return + allocate(tempArr(size(pathArr)-1)) + found = .false. + do i=1, size(pathArr) + if(i==index) then + found = .true. + cycle + end if + if(found) then + tempArr(i-1) = pathArr(i) + !!**call OnpPathClose%RunAll(pathArr(i)%Valves) + else + tempArr(i) = pathArr(i) + endif + end do + deallocate(pathArr) + call move_alloc(tempArr, pathArr) + + endsubroutine + + subroutine Setup() + implicit none + integer :: i + + ! initialize all valves + do i = 1, ValveCount + call Manifold%Valve(i)%init(i) + end do + + ! open source valves + do i = MinSource , MaxSource + Manifold%Valve(i)%Status = .true. + Manifold%Valve(i)%ValveType = InputOutput + end do + + do i = MinRelation , MaxRelation + Manifold%Valve(i)%Status = .true. + Manifold%Valve(i)%ValveType = Relation + end do + + + + ! make adjustments + call Manifold%Valve(1)%AdjacentTo(91) + + call Manifold%Valve(2)%AdjacentTo(92) + call Manifold%Valve(2)%AdjacentTo(117) + + call Manifold%Valve(3)%AdjacentTo(93) + call Manifold%Valve(3)%AdjacentTo(118) + + call Manifold%Valve(4)%AdjacentTo(94) + + call Manifold%Valve(5)%AdjacentTo(95) + + call Manifold%Valve(6)%AdjacentTo(91) + call Manifold%Valve(6)%AdjacentTo(92) + + call Manifold%Valve(7)%AdjacentTo(92) + call Manifold%Valve(7)%AdjacentTo(93) + + call Manifold%Valve(8)%AdjacentTo(93) + call Manifold%Valve(8)%AdjacentTo(94) + + call Manifold%Valve(9)%AdjacentTo(91) + call Manifold%Valve(9)%AdjacentTo(96) + + call Manifold%Valve(10)%AdjacentTo(94) + call Manifold%Valve(10)%AdjacentTo(98) + + call Manifold%Valve(11)%AdjacentTo(96) + call Manifold%Valve(11)%AdjacentTo(97) + + call Manifold%Valve(12)%AdjacentTo(97) + call Manifold%Valve(12)%AdjacentTo(98) + + call Manifold%Valve(13)%AdjacentTo(96) + call Manifold%Valve(13)%AdjacentTo(99) + + call Manifold%Valve(14)%AdjacentTo(78) + call Manifold%Valve(14)%AdjacentTo(97) + !call Valve(14)%AdjacentTo(126) + + call Manifold%Valve(15)%AdjacentTo(98) + call Manifold%Valve(15)%AdjacentTo(99) + + call Manifold%Valve(16)%AdjacentTo(121) + !call Valve(16)%AdjacentTo() + + call Manifold%Valve(17)%AdjacentTo(122) + !call Valve(17)%AdjacentTo() + + call Manifold%Valve(18)%AdjacentTo(123) + !call Valve(18)%AdjacentTo() + + call Manifold%Valve(19)%AdjacentTo(101) + call Manifold%Valve(19)%AdjacentTo(102) + + call Manifold%Valve(20)%AdjacentTo(100) + + call Manifold%Valve(21)%AdjacentTo(101) + + call Manifold%Valve(22)%AdjacentTo(102) + + call Manifold%Valve(23)%AdjacentTo(71) + + call Manifold%Valve(24)%AdjacentTo(71) + + call Manifold%Valve(25)%AdjacentTo(108) + call Manifold%Valve(25)%AdjacentTo(118) + + call Manifold%Valve(26)%AdjacentTo(109) + call Manifold%Valve(26)%AdjacentTo(117) + + call Manifold%Valve(27)%AdjacentTo(32) + call Manifold%Valve(27)%AdjacentTo(108) + + call Manifold%Valve(28)%AdjacentTo(33) + call Manifold%Valve(28)%AdjacentTo(108) + + call Manifold%Valve(29)%AdjacentTo(110) + call Manifold%Valve(29)%AdjacentTo(113) + + call Manifold%Valve(30)%AdjacentTo(34) + call Manifold%Valve(30)%AdjacentTo(109) + + call Manifold%Valve(31)%AdjacentTo(35) + call Manifold%Valve(31)%AdjacentTo(109) + + call Manifold%Valve(32)%AdjacentTo(27) + call Manifold%Valve(32)%AdjacentTo(61) + + call Manifold%Valve(33)%AdjacentTo(28) + call Manifold%Valve(33)%AdjacentTo(62) + + call Manifold%Valve(34)%AdjacentTo(30) + call Manifold%Valve(34)%AdjacentTo(63) + + call Manifold%Valve(35)%AdjacentTo(31) + call Manifold%Valve(35)%AdjacentTo(64) + + call Manifold%Valve(36)%AdjacentTo(116) + + call Manifold%Valve(37)%AdjacentTo(78) + + call Manifold%Valve(38)%AdjacentTo(71) + + call Manifold%Valve(39)%AdjacentTo(77) + + !call Valve(40)%AdjacentTo(105) + call Manifold%Valve(40)%AdjacentTo(80) + + call Manifold%Valve(41)%AdjacentTo(77) + + call Manifold%Valve(42)%AdjacentTo(71) + + call Manifold%Valve(43)%AdjacentTo(106) + + call Manifold%Valve(44)%AdjacentTo(77) + + call Manifold%Valve(45)%AdjacentTo(71) + + call Manifold%Valve(46)%AdjacentTo(104) + + call Manifold%Valve(47)%AdjacentTo(104) + call Manifold%Valve(47)%AdjacentTo(117) + + call Manifold%Valve(48)%AdjacentTo(69) + call Manifold%Valve(48)%AdjacentTo(79) + + call Manifold%Valve(49)%AdjacentTo(104) + call Manifold%Valve(49)%AdjacentTo(79) + + !call Valve(50)%AdjacentTo(48) + call Manifold%Valve(50)%AdjacentTo(51) + !call Valve(50)%AdjacentTo(54) + call Manifold%Valve(50)%AdjacentTo(104) + + call Manifold%Valve(51)%AdjacentTo(50) + call Manifold%Valve(51)%AdjacentTo(52) + + call Manifold%Valve(52)%AdjacentTo(51) + !call Valve(52)%AdjacentTo(127) + call Manifold%Valve(52)%AdjacentTo(80) + + !call Valve(53)%AdjacentTo(103) + !call Valve(53)%AdjacentTo(105) + call Manifold%Valve(53)%AdjacentTo(80) + + !call Valve(54)%AdjacentTo(69) + !call Valve(54)%AdjacentTo(124) + + !call Valve(55)%AdjacentTo(103) + !call Valve(55)%AdjacentTo(124) + + call Manifold%Valve(56)%AdjacentTo(128) + call Manifold%Valve(56)%AdjacentTo(127) + + !call Valve(57)%AdjacentTo(14) + !call Valve(57)%AdjacentTo(103) + !call Valve(57)%AdjacentTo(126) + + call Manifold%Valve(58)%AdjacentTo(78) + + call Manifold%Valve(59)%AdjacentTo(78) + + call Manifold%Valve(60)%AdjacentTo(78) + + call Manifold%Valve(61)%AdjacentTo(32) + call Manifold%Valve(61)%AdjacentTo(115) + + call Manifold%Valve(62)%AdjacentTo(33) + call Manifold%Valve(62)%AdjacentTo(114) + + call Manifold%Valve(63)%AdjacentTo(112) + call Manifold%Valve(63)%AdjacentTo(34) + + call Manifold%Valve(64)%AdjacentTo(35) + call Manifold%Valve(64)%AdjacentTo(111) + + call Manifold%Valve(65)%AdjacentTo(120) + + call Manifold%Valve(66)%AdjacentTo(120) + + call Manifold%Valve(67)%AdjacentTo(73) + + call Manifold%Valve(68)%AdjacentTo(125) + call Manifold%Valve(68)%AdjacentTo(126) + + call Manifold%Valve(69)%AdjacentTo(48) + call Manifold%Valve(69)%AdjacentTo(124) + + !call Valve(70)%AdjacentTo() + !call Valve(70)%AdjacentTo() + + call Manifold%Valve(71)%AdjacentTo(20) + call Manifold%Valve(71)%AdjacentTo(44) + call Manifold%Valve(71)%AdjacentTo(59) + + call Manifold%Valve(72)%AdjacentTo(21) + call Manifold%Valve(72)%AdjacentTo(23) + + call Manifold%Valve(73)%AdjacentTo(22) + + call Manifold%Valve(74)%AdjacentTo(24) + + !call Valve(75)%AdjacentTo() + + !call Valve(76)%AdjacentTo() + + call Manifold%Valve(77)%AdjacentTo(43) + call Manifold%Valve(77)%AdjacentTo(58) + + !call Valve(78)%AdjacentTo() + + call Manifold%Valve(79)%AdjacentTo(48) + call Manifold%Valve(79)%AdjacentTo(49) + + call Manifold%Valve(80)%AdjacentTo(52) + call Manifold%Valve(80)%AdjacentTo(107) + + call Manifold%Valve(81)%AdjacentTo(53) + + call Manifold%Valve(82)%AdjacentTo(16) + + call Manifold%Valve(83)%AdjacentTo(17) + + call Manifold%Valve(84)%AdjacentTo(18) + + !call Valve(85)%AdjacentTo() + + !call Valve(86)%AdjacentTo() + + !call Valve(87)%AdjacentTo() + + !call Valve(88)%AdjacentTo() + + !!call Valve(89)%AdjacentTo() + + !call Valve(90)%AdjacentTo() + + call Manifold%Valve(91)%AdjacentTo(6) + call Manifold%Valve(91)%AdjacentTo(9) + call Manifold%Valve(91)%AdjacentTo(75) + + call Manifold%Valve(92)%AdjacentTo(6) + call Manifold%Valve(92)%AdjacentTo(7) + call Manifold%Valve(92)%AdjacentTo(2) + + call Manifold%Valve(93)%AdjacentTo(3) + call Manifold%Valve(93)%AdjacentTo(7) + call Manifold%Valve(93)%AdjacentTo(8) + + call Manifold%Valve(94)%AdjacentTo(8) + call Manifold%Valve(94)%AdjacentTo(10) + call Manifold%Valve(94)%AdjacentTo(95) + + call Manifold%Valve(95)%AdjacentTo(76) + call Manifold%Valve(95)%AdjacentTo(94) + + call Manifold%Valve(96)%AdjacentTo(9) + call Manifold%Valve(96)%AdjacentTo(11) + call Manifold%Valve(96)%AdjacentTo(13) + + call Manifold%Valve(97)%AdjacentTo(11) + call Manifold%Valve(97)%AdjacentTo(12) + call Manifold%Valve(97)%AdjacentTo(14) + + call Manifold%Valve(98)%AdjacentTo(10) + call Manifold%Valve(98)%AdjacentTo(12) + call Manifold%Valve(98)%AdjacentTo(15) + + call Manifold%Valve(99)%AdjacentTo(13) + call Manifold%Valve(99)%AdjacentTo(15) + call Manifold%Valve(99)%AdjacentTo(125) + + !call Valve(100)%AdjacentTo(16) + call Manifold%Valve(100)%AdjacentTo(82) + call Manifold%Valve(100)%AdjacentTo(101) + + !call Valve(101)%AdjacentTo(17) + call Manifold%Valve(101)%AdjacentTo(19) + call Manifold%Valve(101)%AdjacentTo(83) + call Manifold%Valve(101)%AdjacentTo(100) + + !call Valve(102)%AdjacentTo(18) + call Manifold%Valve(102)%AdjacentTo(19) + call Manifold%Valve(102)%AdjacentTo(84) + + !call Valve(103)%AdjacentTo(53) + !call Valve(103)%AdjacentTo(56) + call Manifold%Valve(103)%AdjacentTo(124) + !call Valve(103)%AdjacentTo(56) + !call Valve(103)%AdjacentTo(78) + + call Manifold%Valve(104)%AdjacentTo(46) + call Manifold%Valve(104)%AdjacentTo(47) + call Manifold%Valve(104)%AdjacentTo(49) + call Manifold%Valve(104)%AdjacentTo(50) + + !call Valve(105)%AdjacentTo(53) + !call Valve(105)%AdjacentTo(107) + !call Valve(105)%AdjacentTo(127) + + call Manifold%Valve(106)%AdjacentTo(40) + call Manifold%Valve(106)%AdjacentTo(45) + + + call Manifold%Valve(107)%AdjacentTo(41) + !call Valve(107)%AdjacentTo(105) + call Manifold%Valve(107)%AdjacentTo(119) + !call Valve(107)%AdjacentTo(42) + + call Manifold%Valve(108)%AdjacentTo(25) + call Manifold%Valve(108)%AdjacentTo(27) + call Manifold%Valve(108)%AdjacentTo(28) + call Manifold%Valve(108)%AdjacentTo(110) + + call Manifold%Valve(109)%AdjacentTo(26) + call Manifold%Valve(109)%AdjacentTo(30) + call Manifold%Valve(109)%AdjacentTo(31) + call Manifold%Valve(109)%AdjacentTo(110) + + call Manifold%Valve(110)%AdjacentTo(29) + call Manifold%Valve(110)%AdjacentTo(85) + call Manifold%Valve(110)%AdjacentTo(108) + call Manifold%Valve(110)%AdjacentTo(109) + + call Manifold%Valve(111)%AdjacentTo(37) + call Manifold%Valve(111)%AdjacentTo(64) + call Manifold%Valve(111)%AdjacentTo(112) + + call Manifold%Valve(112)%AdjacentTo(63) + call Manifold%Valve(112)%AdjacentTo(111) + call Manifold%Valve(112)%AdjacentTo(113) + + call Manifold%Valve(113)%AdjacentTo(29) + call Manifold%Valve(113)%AdjacentTo(112) + call Manifold%Valve(113)%AdjacentTo(114) + + call Manifold%Valve(114)%AdjacentTo(62) + call Manifold%Valve(114)%AdjacentTo(113) + call Manifold%Valve(114)%AdjacentTo(115) + + call Manifold%Valve(115)%AdjacentTo(36) + call Manifold%Valve(115)%AdjacentTo(61) + call Manifold%Valve(115)%AdjacentTo(114) + + call Manifold%Valve(116)%AdjacentTo(38) + call Manifold%Valve(116)%AdjacentTo(39) + + call Manifold%Valve(117)%AdjacentTo(2) + call Manifold%Valve(117)%AdjacentTo(26) + call Manifold%Valve(117)%AdjacentTo(47) + + call Manifold%Valve(118)%AdjacentTo(3) + call Manifold%Valve(118)%AdjacentTo(25) + call Manifold%Valve(118)%AdjacentTo(46) + + call Manifold%Valve(119)%AdjacentTo(42) + call Manifold%Valve(119)%AdjacentTo(60) + call Manifold%Valve(119)%AdjacentTo(107) + + call Manifold%Valve(120)%AdjacentTo(71) + + !call Valve(121)%AdjacentTo(16) + call Manifold%Valve(121)%AdjacentTo(1) + call Manifold%Valve(121)%AdjacentTo(65) + + !call Valve(122)%AdjacentTo(17) + call Manifold%Valve(122)%AdjacentTo(4) + call Manifold%Valve(122)%AdjacentTo(66) + + !call Valve(123)%AdjacentTo(18) + call Manifold%Valve(123)%AdjacentTo(5) + call Manifold%Valve(123)%AdjacentTo(67) + + !call Valve(124)%AdjacentTo(54) + !call Valve(124)%AdjacentTo(55) + call Manifold%Valve(124)%AdjacentTo(69) + call Manifold%Valve(124)%AdjacentTo(103) + + call Manifold%Valve(125)%AdjacentTo(68) + call Manifold%Valve(125)%AdjacentTo(99) + ! call Valve(125)%AdjacentTo(126) + + call Manifold%Valve(126)%AdjacentTo(128) + call Manifold%Valve(126)%AdjacentTo(68) + !call Valve(126)%AdjacentTo(125) + + call Manifold%Valve(127)%AdjacentTo(56) + call Manifold%Valve(127)%AdjacentTo(78) + !call Valve(127)%AdjacentTo(105) + + call Manifold%Valve(128)%AdjacentTo(56) + call Manifold%Valve(128)%AdjacentTo(126) + + + ! initialization + call ChangeValve(60, .true.) + call RemoveIBop() + call ToggleFillupHead(.false.) + call ToggleMudBox(.false.) + call RemoveTopDriveIBop() + call InstallSafetyValve_KellyMode() + call KellyDisconnected() + end subroutine + + + + subroutine KellyConnected() + !use CLog3 + implicit none + + call Manifold%Valve(127)%RemoveAdjacent(78) + + call Manifold%Valve(127)%AdjacentTo(103) + call Manifold%Valve(103)%AdjacentTo(127) + +#ifdef deb + print*, 'KellyConnected()' + !call Log_3( 'KellyConnected()') +#endif + Manifold%IsPathsDirty = .true. + end subroutine + + subroutine KellyDisconnected() + !use CLog3 + implicit none + + call Manifold%Valve(127)%RemoveAdjacent(103) + call Manifold%Valve(103)%RemoveAdjacent(127) + + call Manifold%Valve(127)%AdjacentTo(78) + +#ifdef deb + print*, 'KellyDisconnected()' + !call Log_3( 'KellyDisconnected()') +#endif + + Manifold%IsPathsDirty = .true. + + end subroutine + + + + + + + + + + subroutine InstallSafetyValve_KellyMode() + implicit none + Manifold%IsSafetyValveInstalled_KellyMode = .true. + + call RemoveTopDriveIBop() + + ! Remove Safey Valve (54) + call Manifold%Valve(124)%RemoveAdjacent(54) + call Manifold%Valve(54)%RemoveAdjacent(124) + + call Manifold%Valve(69)%RemoveAdjacent(54) + call Manifold%Valve(54)%RemoveAdjacent(69) + + ! Remove 126-103 cnn + call Manifold%Valve(128)%RemoveAdjacent(127) + call Manifold%Valve(127)%RemoveAdjacent(128) + + ! now make cnn + call Manifold%Valve(124)%AdjacentTo(69) + call Manifold%Valve(69)%AdjacentTo(124) + + call Manifold%Valve(128)%AdjacentTo(56) + + call Manifold%Valve(56)%AdjacentTo(128) + call Manifold%Valve(56)%AdjacentTo(127) + + call Manifold%Valve(127)%AdjacentTo(56) + +#ifdef deb + print*, 'InstallSafetyValve_KellyMode()' +#endif + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 + call OpenSafetyValve_KellyMode() + end subroutine + + subroutine RemoveSafetyValve_KellyMode() + implicit none + Manifold%IsSafetyValveInstalled_KellyMode = .false. + + call Manifold%Valve(128)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(128) + + call Manifold%Valve(127)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(127) + + call Manifold%Valve(127)%AdjacentTo(128) + call Manifold%Valve(128)%AdjacentTo(127) + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 + call CloseSafetyValve_KellyMode() + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + +#ifdef deb + print*, 'RemoveSafetyValve_KellyMode()' +#endif + + end subroutine + + subroutine OpenSafetyValve_KellyMode() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_KellyMode) return + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + Manifold%SafetyValve = .true. + call ChangeValve(56, Manifold%SafetyValve) + +#ifdef deb + print*, 'OpenSafetyValve_KellyMode()' +#endif + + end subroutine + + subroutine CloseSafetyValve_KellyMode() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_KellyMode) return + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + Manifold%SafetyValve = .false. + call ChangeValve(56, Manifold%SafetyValve) + +#ifdef deb + print*, 'CloseSafetyValve_KellyMode()' +#endif + + end subroutine + + + + + + + + + + + subroutine InstallSafetyValve_TripMode() + implicit none + Manifold%IsSafetyValveInstalled_TripMode = .true. + + call Manifold%Valve(128)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(128) + + call Manifold%Valve(127)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(127) + + call Manifold%Valve(69)%RemoveAdjacent(124) + call Manifold%Valve(124)%RemoveAdjacent(69) + + + call Manifold%Valve(127)%AdjacentTo(128) + call Manifold%Valve(128)%AdjacentTo(127) + + call Manifold%Valve(124)%AdjacentTo(54) + call Manifold%Valve(54)%AdjacentTo(124) + + call Manifold%Valve(54)%AdjacentTo(69) + call Manifold%Valve(69)%AdjacentTo(54) + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 + call OpenSafetyValve_TripMode() + +#ifdef deb + print*, 'InstallSafetyValve_TripMode()' +#endif + + end subroutine + + subroutine RemoveSafetyValve_TripMode() + implicit none + Manifold%IsSafetyValveInstalled_TripMode = .false. + + call Manifold%Valve(124)%RemoveAdjacent(54) + call Manifold%Valve(54)%RemoveAdjacent(124) + + call Manifold%Valve(54)%RemoveAdjacent(69) + call Manifold%Valve(69)%RemoveAdjacent(54) + + call Manifold%Valve(124)%AdjacentTo(69) + call Manifold%Valve(69)%AdjacentTo(124) + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 + call CloseSafetyValve_TripMode() + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + +#ifdef deb + print*, 'RemoveSafetyValve_TripMode()' +#endif + + end subroutine + + subroutine OpenSafetyValve_TripMode() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_TripMode) return + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + Manifold%SafetyValve = .true. + call ChangeValve(54, Manifold%SafetyValve) + +#ifdef deb + print*, 'OpenSafetyValve_TripMode()' +#endif + + end subroutine + + subroutine CloseSafetyValve_TripMode() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_TripMode) return + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + Manifold%SafetyValve = .false. + call ChangeValve(54, Manifold%SafetyValve) + +#ifdef deb + print*, 'CloseSafetyValve_TripMode()' +#endif + + end subroutine + + + + + + + + + subroutine InstallSafetyValve_TopDrive() + implicit none + Manifold%IsSafetyValveInstalled_TopDrive = .true. + + call Manifold%Valve(128)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(128) + + call Manifold%Valve(127)%RemoveAdjacent(56) + call Manifold%Valve(56)%RemoveAdjacent(127) + + call Manifold%Valve(69)%RemoveAdjacent(124) + call Manifold%Valve(124)%RemoveAdjacent(69) + + call Manifold%Valve(124)%AdjacentTo(54) + call Manifold%Valve(54)%AdjacentTo(124) + + call Manifold%Valve(54)%AdjacentTo(69) + call Manifold%Valve(69)%AdjacentTo(54) + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 + call OpenSafetyValve_TopDrive() + +#ifdef deb + print*, 'InstallSafetyValve_TopDrive()' +#endif + + end subroutine + + subroutine RemoveSafetyValve_TopDrive() + implicit none + Manifold%IsSafetyValveInstalled_TopDrive = .false. + + call Manifold%Valve(124)%RemoveAdjacent(54) + call Manifold%Valve(54)%RemoveAdjacent(124) + + call Manifold%Valve(54)%RemoveAdjacent(69) + call Manifold%Valve(69)%RemoveAdjacent(54) + + call Manifold%Valve(124)%AdjacentTo(69) + call Manifold%Valve(69)%AdjacentTo(124) + + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 + call CloseSafetyValve_TopDrive() + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + +#ifdef deb + print*, 'RemoveSafetyValve_TopDrive()' +#endif + + end subroutine + + subroutine OpenSafetyValve_TopDrive() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_TopDrive) return + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 0 + Manifold%SafetyValve = .true. + +#ifdef deb + print*, 'OpenSafetyValve_TopDrive()' +#endif + + call ChangeValve(54, Manifold%SafetyValve) + end subroutine + + subroutine CloseSafetyValve_TopDrive() + implicit none + if(.not.Manifold%IsSafetyValveInstalled_TopDrive) return + data%EquipmentControl%DrillingConsole%CloseSafetyValveLed = 1 + data%EquipmentControl%DrillingConsole%OpenSafetyValveLed = 0 + Manifold%SafetyValve = .false. + +#ifdef deb + print*, 'CloseSafetyValve_TopDrive()' +#endif + + call ChangeValve(54, Manifold%SafetyValve) + end subroutine + + + + + + + + + + subroutine InstallIBop() + implicit none + Manifold%IsIBopInstalled = .true. + + call Manifold%Valve(103)%RemoveAdjacent(124) + call Manifold%Valve(124)%RemoveAdjacent(103) + + call Manifold%Valve(55)%AdjacentTo(103) + call Manifold%Valve(55)%AdjacentTo(124) + + call Manifold%Valve(103)%AdjacentTo(55) + call Manifold%Valve(124)%AdjacentTo(55) + +#ifdef deb + print*, 'InstallIBop()' +#endif + + data%EquipmentControl%DrillingConsole%IRIBopLed = 1 + call OpenIBop() + end subroutine + + subroutine RemoveIBop() + implicit none + Manifold%IsIBopInstalled = .false. + + call Manifold%Valve(55)%RemoveAdjacent(103) + call Manifold%Valve(55)%RemoveAdjacent(124) + + call Manifold%Valve(103)%RemoveAdjacent(55) + call Manifold%Valve(124)%RemoveAdjacent(55) + + call Manifold%Valve(103)%AdjacentTo(124) + call Manifold%Valve(124)%AdjacentTo(103) + +#ifdef deb + print*, 'RemoveIBop()' +#endif + + data%EquipmentControl%DrillingConsole%IRIBopLed = 0 + Manifold%IBop = .false. + call ChangeValve(55, Manifold%IBop) + end subroutine + + subroutine OpenIBop() + implicit none + if(.not.Manifold%IsIBopInstalled) return + Manifold%IBop = .true. + +#ifdef deb + print*, 'OpenIBop()' +#endif + + call ChangeValve(55, Manifold%IBop) + end subroutine + + subroutine CloseIBop() + implicit none + if(.not.Manifold%IsIBopInstalled) return + Manifold%IBop = .false. + +#ifdef deb + print*, 'CloseIBop()' +#endif + + call ChangeValve(55, Manifold%IBop) + end subroutine + + + + + + + subroutine InstallKellyCock() + implicit none + Manifold%IsKellyCockInstalled = .true. + + call Manifold%Valve(125)%RemoveAdjacent(126) + call Manifold%Valve(126)%RemoveAdjacent(125) + + call Manifold%Valve(125)%AdjacentTo(68) + + call Manifold%Valve(68)%AdjacentTo(125) + call Manifold%Valve(68)%AdjacentTo(126) + + call Manifold%Valve(126)%AdjacentTo(68) + +#ifdef deb + print*, 'InstallKellyCock()' +#endif + + call OpenKellyCock() + end subroutine + + subroutine RemoveKellyCock() + implicit none + Manifold%IsKellyCockInstalled = .false. + + call Manifold%Valve(125)%RemoveAdjacent(68) + call Manifold%Valve(126)%RemoveAdjacent(68) + + call Manifold%Valve(68)%RemoveAdjacent(125) + call Manifold%Valve(68)%RemoveAdjacent(126) + + call Manifold%Valve(125)%AdjacentTo(126) + call Manifold%Valve(126)%AdjacentTo(125) + + Manifold%KellyCock = .false. + call ChangeValve(68, Manifold%KellyCock) + data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 0 + data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 0 + +#ifdef deb + print*, 'RemoveKellyCock()' +#endif + + end subroutine + + subroutine OpenKellyCock() + implicit none + if(.not.Manifold%IsKellyCockInstalled) return + data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 1 + data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 0 + Manifold%KellyCock = .true. + +#ifdef deb + print*, 'OpenKellyCock()' +#endif + + call ChangeValve(68, Manifold%KellyCock) + end subroutine + + subroutine CloseKellyCock() + implicit none + if(.not.Manifold%IsKellyCockInstalled) return + data%EquipmentControl%DrillingConsole%CloseKellyCockLed = 1 + data%EquipmentControl%DrillingConsole%OpenKellyCockLed = 0 + Manifold%KellyCock = .false. + +#ifdef deb + print*, 'CloseKellyCock()' +#endif + + call ChangeValve(68, Manifold%KellyCock) + end subroutine + + + + + + + + + subroutine InstallTopDriveIBop() + implicit none + Manifold%IsTopDriveIBopInstalled = .true. + + call Manifold%Valve(126)%RemoveAdjacent(128) + call Manifold%Valve(128)%RemoveAdjacent(126) + + + call Manifold%Valve(126)%AdjacentTo(70) + call Manifold%Valve(70)%AdjacentTo(126) + + call Manifold%Valve(128)%AdjacentTo(70) + call Manifold%Valve(70)%AdjacentTo(128) + +#ifdef deb + print*, 'InstallTopDriveIBop()' +#endif + call OpenTopDriveIBop() + end subroutine + + subroutine RemoveTopDriveIBop() + implicit none + Manifold%IsTopDriveIBopInstalled = .false. + + call Manifold%Valve(126)%RemoveAdjacent(70) + call Manifold%Valve(70)%RemoveAdjacent(126) + + call Manifold%Valve(128)%RemoveAdjacent(70) + call Manifold%Valve(70)%RemoveAdjacent(128) + + call Manifold%Valve(126)%AdjacentTo(128) + call Manifold%Valve(128)%AdjacentTo(126) + +#ifdef deb + print*, 'RemoveTopDriveIBop()' +#endif + Manifold%TopDriveIBop = .false. + call ChangeValve(70, Manifold%TopDriveIBop) + end subroutine + + subroutine OpenTopDriveIBop() + implicit none + if(.not.Manifold%IsTopDriveIBopInstalled) return + Manifold%TopDriveIBop = .true. + call ChangeValve(70, Manifold%TopDriveIBop) +#ifdef deb + print*, 'OpenTopDriveIBop()' +#endif + end subroutine + + subroutine CloseTopDriveIBop() + implicit none + if(.not.Manifold%IsTopDriveIBopInstalled) return + Manifold%TopDriveIBop = .false. + call ChangeValve(70, Manifold%TopDriveIBop) +#ifdef deb + print*, 'CloseTopDriveIBop()' +#endif + end subroutine + + + + + + + + + + subroutine InstallFloatValve() + implicit none + Manifold%IsFloatValveInstalled = .true. + + call Manifold%Valve(69)%RemoveAdjacent(79) + call Manifold%Valve(79)%RemoveAdjacent(69) + + call Manifold%Valve(48)%AdjacentTo(69) + call Manifold%Valve(48)%AdjacentTo(79) + + call Manifold%Valve(69)%AdjacentTo(48) + call Manifold%Valve(79)%AdjacentTo(48) +#ifdef deb + print*, 'InstallFloatValve()' +#endif + call OpenFloatValve() + end subroutine + + subroutine RemoveFloatValve() + implicit none + Manifold%IsFloatValveInstalled = .false. + + call Manifold%Valve(48)%RemoveAdjacent(69) + call Manifold%Valve(48)%RemoveAdjacent(79) + + call Manifold%Valve(69)%RemoveAdjacent(48) + call Manifold%Valve(79)%RemoveAdjacent(48) + + call Manifold%Valve(69)%AdjacentTo(79) + call Manifold%Valve(79)%AdjacentTo(69) +#ifdef deb + print*, 'RemoveFloatValve()' +#endif + Manifold%FloatValve = .false. + call ChangeValve(48, Manifold%FloatValve) + end subroutine + + subroutine OpenFloatValve() + implicit none + if(.not.Manifold%IsFloatValveInstalled) return + Manifold%FloatValve = .true. +#ifdef deb + print*, 'OpenFloatValve()' +#endif + call ChangeValve(48, Manifold%FloatValve) + end subroutine + + subroutine CloseFloatValve() + implicit none + if(.not.Manifold%IsFloatValveInstalled) return + Manifold%FloatValve = .false. +#ifdef deb + print*, 'CloseFloatValve()' +#endif + call ChangeValve(48, Manifold%FloatValve) + end subroutine + + + + + + + + subroutine ToggleFillupHead(v) + implicit none + logical, intent(in) :: v + if(v) then + call Manifold%Valve(14)%RemoveAdjacent(78) + + call Manifold%Valve(14)%AdjacentTo(57) + call Manifold%Valve(57)%AdjacentTo(14) + call Manifold%Valve(57)%AdjacentTo(103) + call Manifold%Valve(103)%AdjacentTo(57) + + else + call Manifold%Valve(14)%RemoveAdjacent(57) + call Manifold%Valve(57)%RemoveAdjacent(14) + call Manifold%Valve(57)%RemoveAdjacent(103) + call Manifold%Valve(103)%RemoveAdjacent(57) + + call Manifold%Valve(14)%AdjacentTo(78) + endif + Manifold%IsPathsDirty = .true. + call ChangeValve(57, .true.) + end subroutine + + subroutine ToggleMudBox(v) + implicit none + logical, intent(in) :: v + call ChangeValve(53, v) + end subroutine + + + + + + + + + + subroutine ToggleMiddleRams(v) + implicit none + logical, intent(in) :: v + Manifold%Valve(50)%Status = v + call ChangeValve(69, v) + end subroutine + + + + + + + + + subroutine ChangeValve(i, state) + implicit none + integer, intent(in) :: i + logical, intent(in) :: state + + if(Manifold%Valve(i)%Status==state) return + Manifold%Valve(i)%Status = state + if(i == 41 .or. i == 42) then + if(Manifold%Valve(41)%Status == .false. .and. Manifold%Valve(42)%Status == .false.) then + Manifold%Valve(60)%Status = .true. + else + Manifold%Valve(60)%Status = .false. + endif + endif +#ifdef deb + print*, 'Valve(', i, ') = ', state +#endif + !call Traverse() + Manifold%IsPathsDirty = .true. + end subroutine + + + + + + subroutine DisplayOpenPaths() + implicit none + integer :: i + if(allocated(Manifold%OpenPaths)) then + do i = 1, size(Manifold%OpenPaths) + call Manifold%OpenPaths(i)%Display() + end do + end if + end subroutine + + subroutine DisplayOpenPathsWrite() + implicit none + integer :: i + if(allocated(Manifold%OpenPaths)) then + do i = 1, size(Manifold%OpenPaths) + call Manifold%OpenPaths(i)%DisplayWrite() + end do + end if + end subroutine + end module CManifolds \ No newline at end of file diff --git a/CSharp/Equipments/MudPathFinding/CPath.f90 b/CSharp/Equipments/MudPathFinding/CPath.f90 index a0f99b3..99ab4ed 100644 --- a/CSharp/Equipments/MudPathFinding/CPath.f90 +++ b/CSharp/Equipments/MudPathFinding/CPath.f90 @@ -1,231 +1,231 @@ -module CPath - use CLog5 - implicit none - public - - type, public :: Path - integer, allocatable :: Valves(:) - logical :: IsClosed - contains - procedure :: Display => Display - procedure :: DisplayWrite => DisplayWrite - procedure :: First => First - procedure :: Last => Last - procedure :: Length => Length - procedure :: Get => Get - procedure :: Add => Add - procedure :: Remove => Remove - procedure :: Purge => Purge - procedure :: Copy => Copy - procedure :: MakeNull => MakeNull - procedure :: IsNull => IsNull - procedure :: Equal => Equal - procedure :: Find => Find - end type Path - - contains - - - subroutine DisplayWrite(this) - implicit none - class(Path), intent(in) :: this - character(len=512) :: temp - integer :: i - if(allocated(this%valves)) then - write(temp, '(a1,i0,a3,i0,a4,9999(g0))') '(', this%First(), '<=>', this%Last(), ') : ', (this%Valves(i), ", ",i=1,size(this%Valves)) - write(*,*) temp - end if - end subroutine - - subroutine Display(this) - implicit none - class(Path), intent(in) :: this - character(len=512) :: temp - integer :: i - if(allocated(this%valves)) then - write(temp, '(a1,i0,a3,i0,a4,9999(g0))') '(', this%First(), '<=>', this%Last(), ') : ', (this%Valves(i), ", ",i=1,size(this%Valves)) - call Log_5(temp) - end if - end subroutine - - integer function First(this) - implicit none - class(Path), intent(in) :: this - if(allocated(this%Valves) .and. size(this%Valves) > 0) then - First = this%Valves(1) - return - end if - First = 0 - end function - - integer function Last(this) - implicit none - class(Path), intent(in) :: this - if(allocated(this%Valves) .and. size(this%Valves) > 0) then - Last = this%Valves(size(this%Valves)) - return - end if - Last = 0 - end function - - integer function Length(this) - implicit none - class(Path), intent(in) :: this - if(allocated(this%Valves)) then - Length = size(this%Valves) - return - end if - Length = 0 - end function - - integer function Get(this, index) - implicit none - class(Path), intent(in) :: this - integer, intent(in) :: index - if(allocated(this%Valves)) then - - if(index < 1 .or. index > size(this%Valves)) then - Get = -1 - return - endif - - Get = this%Valves(index) - return - end if - get = -1 - end function - - subroutine Add(this, value) - implicit none - class(Path), intent(inout) :: this - integer, allocatable :: tempArr(:) - integer, intent(in) :: value - integer :: i, isize - - if(allocated(this%Valves)) then - isize = size(this%Valves) - allocate(tempArr(isize+1)) - do i=1,isize - tempArr(i) = this%Valves(i) - end do - tempArr(isize+1) = value - deallocate(this%Valves) - call move_alloc(tempArr, this%Valves) - else - allocate(this%Valves(1)) - this%Valves(1) = value - end if - - end subroutine - - subroutine Remove(this, index) - implicit none - class(Path), intent(inout) :: this - integer, intent(in) :: index - integer, allocatable :: tempArr(:) - integer :: i - logical :: found - - if(index <= 0 .or. index > size(this%Valves)) return - if(.not.allocated(this%Valves))return - allocate(tempArr(size(this%Valves)-1)) - found = .false. - do i=1, size(this%Valves) - if(i==index) then - found = .true. - cycle - end if - if(found) then - tempArr(i-1) = this%Valves(i) - else - tempArr(i) = this%Valves(i) - endif - end do - deallocate(this%valves) - call move_alloc(tempArr, this%valves) - end subroutine - - - subroutine Purge(this, min, max) - implicit none - class(Path), intent(inout) :: this - integer, intent(in) :: min - integer, intent(in) :: max - integer :: i - - i = 1 - do - ! - if(this%Valves(i) >= min .and. this%Valves(i) <= max) then - call this%Remove(i) - else - i = i + 1 - endif - - if(i > this%Length()) exit - enddo - - end subroutine - - - subroutine Copy(this, from) - implicit none - class(Path), intent(inout) :: this - class(Path), intent(in) :: from - if(allocated(from%Valves)) then - if(allocated(this%Valves)) deallocate(this%Valves) - allocate(this%Valves(size(from%Valves))) - this%Valves(:) = from%Valves(:) - end if - end subroutine - - subroutine MakeNull(this) - implicit none - class(Path), intent(inout) :: this - if(allocated(this%Valves)) deallocate(this%Valves) - end subroutine - - logical function IsNull(this) - implicit none - class(Path), intent(in) :: this - IsNull = .not.allocated(this%Valves) - return - end function - - logical function Equal(this, otherPath) - implicit none - class(Path), intent(inout) :: this - class(Path), intent(in) :: otherPath - integer :: i, sizeThis, sizeOtherPath - - sizeThis = size(this%Valves) - sizeOtherPath = size(otherPath%Valves) - - if(sizeThis /= sizeOtherPath) then - Equal = .false. - return - end if - - do i = 1, sizeThis - if(this%Valves(i) /= otherPath%Valves(i)) then - Equal = .false. - return - end if - end do - - Equal = .true. - return - end function - - logical function Find(this, value) - implicit none - class(Path), intent(in) :: this - integer, intent(in) :: value - if(allocated(this%Valves)) then - Find = any(this%Valves == value) - return - end if - Find = .false. - end function - +module CPath + use CLog5 + implicit none + public + + type, public :: Path + integer, allocatable :: Valves(:) + logical :: IsClosed + contains + procedure :: Display => Display + procedure :: DisplayWrite => DisplayWrite + procedure :: First => First + procedure :: Last => Last + procedure :: Length => Length + procedure :: Get => Get + procedure :: Add => Add + procedure :: Remove => Remove + procedure :: Purge => Purge + procedure :: Copy => Copy + procedure :: MakeNull => MakeNull + procedure :: IsNull => IsNull + procedure :: Equal => Equal + procedure :: Find => Find + end type Path + + contains + + + subroutine DisplayWrite(this) + implicit none + class(Path), intent(in) :: this + character(len=512) :: temp + integer :: i + if(allocated(this%valves)) then + write(temp, '(a1,i0,a3,i0,a4,9999(g0))') '(', this%First(), '<=>', this%Last(), ') : ', (this%Valves(i), ", ",i=1,size(this%Valves)) + write(*,*) temp + end if + end subroutine + + subroutine Display(this) + implicit none + class(Path), intent(in) :: this + character(len=512) :: temp + integer :: i + if(allocated(this%valves)) then + write(temp, '(a1,i0,a3,i0,a4,9999(g0))') '(', this%First(), '<=>', this%Last(), ') : ', (this%Valves(i), ", ",i=1,size(this%Valves)) + call Log_5(temp) + end if + end subroutine + + integer function First(this) + implicit none + class(Path), intent(in) :: this + if(allocated(this%Valves) .and. size(this%Valves) > 0) then + First = this%Valves(1) + return + end if + First = 0 + end function + + integer function Last(this) + implicit none + class(Path), intent(in) :: this + if(allocated(this%Valves) .and. size(this%Valves) > 0) then + Last = this%Valves(size(this%Valves)) + return + end if + Last = 0 + end function + + integer function Length(this) + implicit none + class(Path), intent(in) :: this + if(allocated(this%Valves)) then + Length = size(this%Valves) + return + end if + Length = 0 + end function + + integer function Get(this, index) + implicit none + class(Path), intent(in) :: this + integer, intent(in) :: index + if(allocated(this%Valves)) then + + if(index < 1 .or. index > size(this%Valves)) then + Get = -1 + return + endif + + Get = this%Valves(index) + return + end if + get = -1 + end function + + subroutine Add(this, value) + implicit none + class(Path), intent(inout) :: this + integer, allocatable :: tempArr(:) + integer, intent(in) :: value + integer :: i, isize + + if(allocated(this%Valves)) then + isize = size(this%Valves) + allocate(tempArr(isize+1)) + do i=1,isize + tempArr(i) = this%Valves(i) + end do + tempArr(isize+1) = value + deallocate(this%Valves) + call move_alloc(tempArr, this%Valves) + else + allocate(this%Valves(1)) + this%Valves(1) = value + end if + + end subroutine + + subroutine Remove(this, index) + implicit none + class(Path), intent(inout) :: this + integer, intent(in) :: index + integer, allocatable :: tempArr(:) + integer :: i + logical :: found + + if(index <= 0 .or. index > size(this%Valves)) return + if(.not.allocated(this%Valves))return + allocate(tempArr(size(this%Valves)-1)) + found = .false. + do i=1, size(this%Valves) + if(i==index) then + found = .true. + cycle + end if + if(found) then + tempArr(i-1) = this%Valves(i) + else + tempArr(i) = this%Valves(i) + endif + end do + deallocate(this%valves) + call move_alloc(tempArr, this%valves) + end subroutine + + + subroutine Purge(this, min, max) + implicit none + class(Path), intent(inout) :: this + integer, intent(in) :: min + integer, intent(in) :: max + integer :: i + + i = 1 + do + ! + if(this%Valves(i) >= min .and. this%Valves(i) <= max) then + call this%Remove(i) + else + i = i + 1 + endif + + if(i > this%Length()) exit + enddo + + end subroutine + + + subroutine Copy(this, from) + implicit none + class(Path), intent(inout) :: this + class(Path), intent(in) :: from + if(allocated(from%Valves)) then + if(allocated(this%Valves)) deallocate(this%Valves) + allocate(this%Valves(size(from%Valves))) + this%Valves(:) = from%Valves(:) + end if + end subroutine + + subroutine MakeNull(this) + implicit none + class(Path), intent(inout) :: this + if(allocated(this%Valves)) deallocate(this%Valves) + end subroutine + + logical function IsNull(this) + implicit none + class(Path), intent(in) :: this + IsNull = .not.allocated(this%Valves) + return + end function + + logical function Equal(this, otherPath) + implicit none + class(Path), intent(inout) :: this + class(Path), intent(in) :: otherPath + integer :: i, sizeThis, sizeOtherPath + + sizeThis = size(this%Valves) + sizeOtherPath = size(otherPath%Valves) + + if(sizeThis /= sizeOtherPath) then + Equal = .false. + return + end if + + do i = 1, sizeThis + if(this%Valves(i) /= otherPath%Valves(i)) then + Equal = .false. + return + end if + end do + + Equal = .true. + return + end function + + logical function Find(this, value) + implicit none + class(Path), intent(in) :: this + integer, intent(in) :: value + if(allocated(this%Valves)) then + Find = any(this%Valves == value) + return + end if + Find = .false. + end function + end module CPath \ No newline at end of file diff --git a/CSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 b/CSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 index 12bdcdc..35928a8 100644 --- a/CSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 +++ b/CSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 @@ -1,12 +1,12 @@ -module CPathChangeEvents - ! use CIntegerArrayEventHandlerCollection - ! use CVoidEventHandlerCollection - implicit none - public - - ! type(VoidEventHandlerCollection) :: BeforeTraverse - ! type(VoidEventHandlerCollection) :: AfterTraverse - ! type(IntegerArrayEventHandlerCollection) :: OnPathOpen - - contains +module CPathChangeEvents + ! use CIntegerArrayEventHandlerCollection + ! use CVoidEventHandlerCollection + implicit none + public + + ! type(VoidEventHandlerCollection) :: BeforeTraverse + ! type(VoidEventHandlerCollection) :: AfterTraverse + ! type(IntegerArrayEventHandlerCollection) :: OnPathOpen + + contains end module CPathChangeEvents \ No newline at end of file diff --git a/CSharp/Equipments/MudPathFinding/CStack.f90 b/CSharp/Equipments/MudPathFinding/CStack.f90 index b75aeaf..eba9655 100644 --- a/CSharp/Equipments/MudPathFinding/CStack.f90 +++ b/CSharp/Equipments/MudPathFinding/CStack.f90 @@ -1,42 +1,42 @@ -module CStack - use CPath,Only:Path - implicit none - public - - type, public :: Stack - type(Path) :: List - contains - procedure :: Clear => Clear - procedure :: Push => Push - procedure :: Pop => Pop - procedure :: DoesHave => DoesHave - end type Stack - contains - - subroutine Clear(this) - implicit none - class(Stack), intent(inout) :: this - call this%List%MakeNull() - end subroutine - - subroutine Push(this, value) - implicit none - class(Stack), intent(inout) :: this - integer, intent(in) :: value - call this%List%Add(value) - end subroutine - - subroutine Pop(this) - implicit none - class(Stack), intent(inout) :: this - call this%List%Remove(this%List%Length()) - end subroutine - - logical function DoesHave(this, value) - implicit none - class(Stack), intent(in) :: this - integer, intent(in) :: value - DoesHave = this%List%Find(value) - end function - +module CStack + use CPath,Only:Path + implicit none + public + + type, public :: Stack + type(Path) :: List + contains + procedure :: Clear => Clear + procedure :: Push => Push + procedure :: Pop => Pop + procedure :: DoesHave => DoesHave + end type Stack + contains + + subroutine Clear(this) + implicit none + class(Stack), intent(inout) :: this + call this%List%MakeNull() + end subroutine + + subroutine Push(this, value) + implicit none + class(Stack), intent(inout) :: this + integer, intent(in) :: value + call this%List%Add(value) + end subroutine + + subroutine Pop(this) + implicit none + class(Stack), intent(inout) :: this + call this%List%Remove(this%List%Length()) + end subroutine + + logical function DoesHave(this, value) + implicit none + class(Stack), intent(in) :: this + integer, intent(in) :: value + DoesHave = this%List%Find(value) + end function + end module CStack \ No newline at end of file diff --git a/CSharp/Equipments/Tanks/CTanks.f90 b/CSharp/Equipments/Tanks/CTanks.f90 index b1342ec..633eff4 100644 --- a/CSharp/Equipments/Tanks/CTanks.f90 +++ b/CSharp/Equipments/Tanks/CTanks.f90 @@ -1,20 +1,20 @@ - - module CTanks - use SimulationVariables - use CManifolds - implicit none - public - contains - subroutine Set_ManualPumpPower(v) - use CManifolds, only:ChangeValve - implicit none - logical, intent(in) :: v - data%EquipmentControl%Tank%ManualPumpPower = v - call ChangeValve(43, v) - #ifdef deb - print*, 'ManualPumpPower=', data%EquipmentControl%Tank%ManualPumpPower - #endif - end subroutine - - + + module CTanks + use SimulationVariables + use CManifolds + implicit none + public + contains + subroutine Set_ManualPumpPower(v) + use CManifolds, only:ChangeValve + implicit none + logical, intent(in) :: v + data%EquipmentControl%Tank%ManualPumpPower = v + call ChangeValve(43, v) + #ifdef deb + print*, 'ManualPumpPower=', data%EquipmentControl%Tank%ManualPumpPower + #endif + end subroutine + + end module CTanks \ No newline at end of file diff --git a/CSharp/Equipments/Tanks/CTanksVariables.f90 b/CSharp/Equipments/Tanks/CTanksVariables.f90 index b268851..2454af0 100644 --- a/CSharp/Equipments/Tanks/CTanksVariables.f90 +++ b/CSharp/Equipments/Tanks/CTanksVariables.f90 @@ -1,29 +1,29 @@ -module CTanksVariables - implicit none - public - Type :: TankType - ! Input vars - real(8) :: WaterRate - real(8) :: CementTankVolume - real(8) :: CementTankDensity - real(8) :: TripTankVolume - real(8) :: TripTankDensity - logical :: ManualPumpPower - logical :: Valve1 - logical :: Valve2 - logical :: Valve3 - logical :: Valve4 - logical :: Valve5 - - logical :: Valve6 - logical :: Valve7 - logical :: Valve8 - logical :: Valve9 - logical :: Valve10 - logical :: Valve11 - End Type TankType - - contains - - +module CTanksVariables + implicit none + public + Type :: TankType + ! Input vars + real(8) :: WaterRate + real(8) :: CementTankVolume + real(8) :: CementTankDensity + real(8) :: TripTankVolume + real(8) :: TripTankDensity + logical :: ManualPumpPower + logical :: Valve1 + logical :: Valve2 + logical :: Valve3 + logical :: Valve4 + logical :: Valve5 + + logical :: Valve6 + logical :: Valve7 + logical :: Valve8 + logical :: Valve9 + logical :: Valve10 + logical :: Valve11 + End Type TankType + + contains + + end module CTanksVariables \ No newline at end of file diff --git a/CSharp/ErrorLog/CError.f90 b/CSharp/ErrorLog/CError.f90 index f6d379f..fa63da4 100644 --- a/CSharp/ErrorLog/CError.f90 +++ b/CSharp/ErrorLog/CError.f90 @@ -1,303 +1,303 @@ -module CError - use CIActionReference - implicit none - public - interface Error - module procedure :: Error1, Error2, Error3, Error4, Error5 - end interface - - interface ErrorStop - module procedure :: ErrorStop1, ErrorStop2, ErrorStop3, ErrorStop4, ErrorStop5 - end interface - - procedure (ActionString), pointer :: ErrorMessagePtr - procedure (ActionStringInt), pointer :: ErrorMessageIntPtr - procedure (ActionStringFloat), pointer :: ErrorMessageFloatPtr - procedure (ActionStringDouble), pointer :: ErrorMessageDoublePtr - procedure (ActionStringBool), pointer :: ErrorMessageBoolPtr - - procedure (ActionString), pointer :: ErrorStopPtr - procedure (ActionStringInt), pointer :: ErrorStopIntPtr - procedure (ActionStringFloat), pointer :: ErrorStopFloatPtr - procedure (ActionStringDouble), pointer :: ErrorStopDoublePtr - procedure (ActionStringBool), pointer :: ErrorStopBoolPtr - contains - - subroutine Error1(message) - implicit none - character(len=*), intent(in) :: message - if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message) - end subroutine - - subroutine Error2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) - if(associated(ErrorMessageIntPtr)) call ErrorMessageIntPtr(message, value) - end subroutine - - subroutine Error3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) - if(associated(ErrorMessageFloatPtr)) call ErrorMessageFloatPtr(message, value) - end subroutine - - subroutine Error4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) - if(associated(ErrorMessageDoublePtr)) call ErrorMessageDoublePtr(message, value) - end subroutine - - subroutine Error5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value - !if(value) then - ! if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message//' '//'TRUE') - !else - ! if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message//' '//'FALSE') - !endif - if(associated(ErrorMessageBoolPtr)) call ErrorMessageBoolPtr(message, value) - end subroutine - - - - - - - - - - - - - - subroutine ErrorStop1(message) - !use ifmt - implicit none - character(len=*), intent(in) :: message - if(associated(ErrorStopPtr)) then - call ErrorStopPtr(message) - ! call ExitThread(0) - end if - end subroutine - - subroutine ErrorStop2(message, value) - !use ifmt - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorStopPtr)) then - ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) - ! ! call ExitThread(0) - !end if - if(associated(ErrorStopIntPtr)) then - call ErrorStopIntPtr(message, value) - ! call ExitThread(0) - end if - end subroutine - - subroutine ErrorStop3(message, value) - !use ifmt - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorStopPtr)) then - ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) - ! ! call ExitThread(0) - !end if - if(associated(ErrorStopFloatPtr)) then - call ErrorStopFloatPtr(message, value) - ! ! call ExitThread(0) - end if - end subroutine - - subroutine ErrorStop4(message, value) - ! use ifmt - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value - !character(len=256) :: temp - !temp(:)=' ' - !write(temp,*) value - !if(associated(ErrorStopPtr)) then - ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) - ! ! call ExitThread(0) - !end if - if(associated(ErrorStopDoublePtr)) then - call ErrorStopDoublePtr(message, value) - ! ! call ExitThread(0) - end if - end subroutine - - subroutine ErrorStop5(message, value) - !use ifmt - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value - !if(value) then - ! if(associated(ErrorStopPtr)) then - ! call ErrorStopPtr(message//' '//'TRUE') - ! ! ! call ExitThread(0) - ! end if - !else - ! if(associated(ErrorStopPtr)) then - ! call ErrorStopPtr(message//' '//'FALSE') - ! ! ! call ExitThread(0) - ! end if - !endif - if(associated(ErrorStopBoolPtr)) then - call ErrorStopBoolPtr(message, value) - ! call ExitThread(0) - end if - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeErrorMessage(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessage - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessage' :: SubscribeErrorMessage - implicit none - procedure (ActionString) :: a - ErrorMessagePtr => a - end subroutine - - - subroutine SubscribeErrorMessageInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageInt' :: SubscribeErrorMessageInt - implicit none - procedure (ActionStringInt) :: a - ErrorMessageIntPtr => a - end subroutine - - subroutine SubscribeErrorMessageFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageFloat' :: SubscribeErrorMessageFloat - implicit none - procedure (ActionStringFloat) :: a - ErrorMessageFloatPtr => a - end subroutine - - subroutine SubscribeErrorMessageDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageDouble' :: SubscribeErrorMessageDouble - implicit none - procedure (ActionStringDouble) :: a - ErrorMessageDoublePtr => a - end subroutine - - subroutine SubscribeErrorMessageBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageBool' :: SubscribeErrorMessageBool - implicit none - procedure (ActionStringBool) :: a - ErrorMessageBoolPtr => a - end subroutine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - subroutine SubscribeErrorStop(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStop - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStop' :: SubscribeErrorStop - implicit none - procedure (ActionString) :: a - ErrorStopPtr => a - end subroutine - - subroutine SubscribeErrorStopInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopInt' :: SubscribeErrorStopInt - implicit none - procedure (ActionStringInt) :: a - ErrorStopIntPtr => a - end subroutine - - - subroutine SubscribeErrorStopFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopFloat' :: SubscribeErrorStopFloat - implicit none - procedure (ActionStringFloat) :: a - ErrorStopFloatPtr => a - end subroutine - - subroutine SubscribeErrorStopDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopDouble' :: SubscribeErrorStopDouble - implicit none - procedure (ActionStringDouble) :: a - ErrorStopDoublePtr => a - end subroutine - - subroutine SubscribeErrorStopBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopBool' :: SubscribeErrorStopBool - implicit none - procedure (ActionStringBool) :: a - ErrorStopBoolPtr => a - end subroutine - +module CError + use CIActionReference + implicit none + public + interface Error + module procedure :: Error1, Error2, Error3, Error4, Error5 + end interface + + interface ErrorStop + module procedure :: ErrorStop1, ErrorStop2, ErrorStop3, ErrorStop4, ErrorStop5 + end interface + + procedure (ActionString), pointer :: ErrorMessagePtr + procedure (ActionStringInt), pointer :: ErrorMessageIntPtr + procedure (ActionStringFloat), pointer :: ErrorMessageFloatPtr + procedure (ActionStringDouble), pointer :: ErrorMessageDoublePtr + procedure (ActionStringBool), pointer :: ErrorMessageBoolPtr + + procedure (ActionString), pointer :: ErrorStopPtr + procedure (ActionStringInt), pointer :: ErrorStopIntPtr + procedure (ActionStringFloat), pointer :: ErrorStopFloatPtr + procedure (ActionStringDouble), pointer :: ErrorStopDoublePtr + procedure (ActionStringBool), pointer :: ErrorStopBoolPtr + contains + + subroutine Error1(message) + implicit none + character(len=*), intent(in) :: message + if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message) + end subroutine + + subroutine Error2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) + if(associated(ErrorMessageIntPtr)) call ErrorMessageIntPtr(message, value) + end subroutine + + subroutine Error3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) + if(associated(ErrorMessageFloatPtr)) call ErrorMessageFloatPtr(message, value) + end subroutine + + subroutine Error4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorMessagePtr)) call ErrorMessagePtr(trim(message//' '//adjustl(temp))) + if(associated(ErrorMessageDoublePtr)) call ErrorMessageDoublePtr(message, value) + end subroutine + + subroutine Error5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value + !if(value) then + ! if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message//' '//'TRUE') + !else + ! if(associated(ErrorMessagePtr)) call ErrorMessagePtr(message//' '//'FALSE') + !endif + if(associated(ErrorMessageBoolPtr)) call ErrorMessageBoolPtr(message, value) + end subroutine + + + + + + + + + + + + + + subroutine ErrorStop1(message) + !use ifmt + implicit none + character(len=*), intent(in) :: message + if(associated(ErrorStopPtr)) then + call ErrorStopPtr(message) + ! call ExitThread(0) + end if + end subroutine + + subroutine ErrorStop2(message, value) + !use ifmt + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorStopPtr)) then + ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) + ! ! call ExitThread(0) + !end if + if(associated(ErrorStopIntPtr)) then + call ErrorStopIntPtr(message, value) + ! call ExitThread(0) + end if + end subroutine + + subroutine ErrorStop3(message, value) + !use ifmt + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorStopPtr)) then + ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) + ! ! call ExitThread(0) + !end if + if(associated(ErrorStopFloatPtr)) then + call ErrorStopFloatPtr(message, value) + ! ! call ExitThread(0) + end if + end subroutine + + subroutine ErrorStop4(message, value) + ! use ifmt + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value + !character(len=256) :: temp + !temp(:)=' ' + !write(temp,*) value + !if(associated(ErrorStopPtr)) then + ! call ErrorStopPtr(trim(message//' '//adjustl(temp))) + ! ! call ExitThread(0) + !end if + if(associated(ErrorStopDoublePtr)) then + call ErrorStopDoublePtr(message, value) + ! ! call ExitThread(0) + end if + end subroutine + + subroutine ErrorStop5(message, value) + !use ifmt + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value + !if(value) then + ! if(associated(ErrorStopPtr)) then + ! call ErrorStopPtr(message//' '//'TRUE') + ! ! ! call ExitThread(0) + ! end if + !else + ! if(associated(ErrorStopPtr)) then + ! call ErrorStopPtr(message//' '//'FALSE') + ! ! ! call ExitThread(0) + ! end if + !endif + if(associated(ErrorStopBoolPtr)) then + call ErrorStopBoolPtr(message, value) + ! call ExitThread(0) + end if + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeErrorMessage(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessage + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessage' :: SubscribeErrorMessage + implicit none + procedure (ActionString) :: a + ErrorMessagePtr => a + end subroutine + + + subroutine SubscribeErrorMessageInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageInt' :: SubscribeErrorMessageInt + implicit none + procedure (ActionStringInt) :: a + ErrorMessageIntPtr => a + end subroutine + + subroutine SubscribeErrorMessageFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageFloat' :: SubscribeErrorMessageFloat + implicit none + procedure (ActionStringFloat) :: a + ErrorMessageFloatPtr => a + end subroutine + + subroutine SubscribeErrorMessageDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageDouble' :: SubscribeErrorMessageDouble + implicit none + procedure (ActionStringDouble) :: a + ErrorMessageDoublePtr => a + end subroutine + + subroutine SubscribeErrorMessageBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorMessageBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorMessageBool' :: SubscribeErrorMessageBool + implicit none + procedure (ActionStringBool) :: a + ErrorMessageBoolPtr => a + end subroutine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + subroutine SubscribeErrorStop(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStop + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStop' :: SubscribeErrorStop + implicit none + procedure (ActionString) :: a + ErrorStopPtr => a + end subroutine + + subroutine SubscribeErrorStopInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopInt' :: SubscribeErrorStopInt + implicit none + procedure (ActionStringInt) :: a + ErrorStopIntPtr => a + end subroutine + + + subroutine SubscribeErrorStopFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopFloat' :: SubscribeErrorStopFloat + implicit none + procedure (ActionStringFloat) :: a + ErrorStopFloatPtr => a + end subroutine + + subroutine SubscribeErrorStopDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopDouble' :: SubscribeErrorStopDouble + implicit none + procedure (ActionStringDouble) :: a + ErrorStopDoublePtr => a + end subroutine + + subroutine SubscribeErrorStopBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeErrorStopBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeErrorStopBool' :: SubscribeErrorStopBool + implicit none + procedure (ActionStringBool) :: a + ErrorStopBoolPtr => a + end subroutine + end module CError \ No newline at end of file diff --git a/CSharp/ErrorLog/CLog1.f90 b/CSharp/ErrorLog/CLog1.f90 index a95afd6..4b8597e 100644 --- a/CSharp/ErrorLog/CLog1.f90 +++ b/CSharp/ErrorLog/CLog1.f90 @@ -1,113 +1,113 @@ -module CLog1 - use CIActionReference - implicit none - public - interface Log_1 - module procedure :: Log1Log1, Log1Log2, Log1Log3, Log1Log4, Log1Log5 - end interface - - procedure (ActionString), pointer :: Log1MsgPtr - procedure (ActionStringInt), pointer :: Log1MsgIntPtr - procedure (ActionStringFloat), pointer :: Log1MsgFloatPtr - procedure (ActionStringDouble), pointer :: Log1MsgDoublePtr - procedure (ActionStringBool), pointer :: Log1MsgBoolPtr - contains - - subroutine Log1Log1(message) - implicit none - character(len=*), intent(in) :: message -#ifdef Log1 - if(associated(Log1MsgPtr)) call Log1MsgPtr(message) -#endif - end subroutine - - subroutine Log1Log2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value -#ifdef Log1 - if(associated(Log1MsgIntPtr)) call Log1MsgIntPtr(message, value) -#endif - end subroutine - - subroutine Log1Log3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value -#ifdef Log1 - if(associated(Log1MsgFloatPtr)) call Log1MsgFloatPtr(message, value) -#endif - end subroutine - - subroutine Log1Log4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value -#ifdef Log1 - if(associated(Log1MsgDoublePtr)) call Log1MsgDoublePtr(message, value) -#endif - end subroutine - - subroutine Log1Log5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value -#ifdef Log1 - if(associated(Log1MsgBoolPtr)) call Log1MsgBoolPtr(message, value) -#endif - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeLog1Message(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1Message - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1Message' :: SubscribeLog1Message - implicit none - procedure (ActionString) :: a - Log1MsgPtr => a - end subroutine - - subroutine SubscribeLog1MsgInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgInt' :: SubscribeLog1MsgInt - implicit none - procedure (ActionStringInt) :: a - Log1MsgIntPtr => a - end subroutine - - subroutine SubscribeLog1MsgFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgFloat' :: SubscribeLog1MsgFloat - implicit none - procedure (ActionStringFloat) :: a - Log1MsgFloatPtr => a - end subroutine - - subroutine SubscribeLog1MsgDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgDouble' :: SubscribeLog1MsgDouble - implicit none - procedure (ActionStringDouble) :: a - Log1MsgDoublePtr => a - end subroutine - - subroutine SubscribeLog1MsgBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgBool' :: SubscribeLog1MsgBool - implicit none - procedure (ActionStringBool) :: a - Log1MsgBoolPtr => a - end subroutine - +module CLog1 + use CIActionReference + implicit none + public + interface Log_1 + module procedure :: Log1Log1, Log1Log2, Log1Log3, Log1Log4, Log1Log5 + end interface + + procedure (ActionString), pointer :: Log1MsgPtr + procedure (ActionStringInt), pointer :: Log1MsgIntPtr + procedure (ActionStringFloat), pointer :: Log1MsgFloatPtr + procedure (ActionStringDouble), pointer :: Log1MsgDoublePtr + procedure (ActionStringBool), pointer :: Log1MsgBoolPtr + contains + + subroutine Log1Log1(message) + implicit none + character(len=*), intent(in) :: message +#ifdef Log1 + if(associated(Log1MsgPtr)) call Log1MsgPtr(message) +#endif + end subroutine + + subroutine Log1Log2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value +#ifdef Log1 + if(associated(Log1MsgIntPtr)) call Log1MsgIntPtr(message, value) +#endif + end subroutine + + subroutine Log1Log3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value +#ifdef Log1 + if(associated(Log1MsgFloatPtr)) call Log1MsgFloatPtr(message, value) +#endif + end subroutine + + subroutine Log1Log4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value +#ifdef Log1 + if(associated(Log1MsgDoublePtr)) call Log1MsgDoublePtr(message, value) +#endif + end subroutine + + subroutine Log1Log5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value +#ifdef Log1 + if(associated(Log1MsgBoolPtr)) call Log1MsgBoolPtr(message, value) +#endif + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeLog1Message(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1Message + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1Message' :: SubscribeLog1Message + implicit none + procedure (ActionString) :: a + Log1MsgPtr => a + end subroutine + + subroutine SubscribeLog1MsgInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgInt' :: SubscribeLog1MsgInt + implicit none + procedure (ActionStringInt) :: a + Log1MsgIntPtr => a + end subroutine + + subroutine SubscribeLog1MsgFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgFloat' :: SubscribeLog1MsgFloat + implicit none + procedure (ActionStringFloat) :: a + Log1MsgFloatPtr => a + end subroutine + + subroutine SubscribeLog1MsgDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgDouble' :: SubscribeLog1MsgDouble + implicit none + procedure (ActionStringDouble) :: a + Log1MsgDoublePtr => a + end subroutine + + subroutine SubscribeLog1MsgBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog1MsgBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog1MsgBool' :: SubscribeLog1MsgBool + implicit none + procedure (ActionStringBool) :: a + Log1MsgBoolPtr => a + end subroutine + end module CLog1 \ No newline at end of file diff --git a/CSharp/ErrorLog/CLog2.f90 b/CSharp/ErrorLog/CLog2.f90 index 7db07dd..06055e2 100644 --- a/CSharp/ErrorLog/CLog2.f90 +++ b/CSharp/ErrorLog/CLog2.f90 @@ -1,113 +1,113 @@ -module CLog2 - use CIActionReference - implicit none - public - interface Log_2 - module procedure :: Log2Log1, Log2Log2, Log2Log3, Log2Log4, Log2Log5 - end interface - - procedure (ActionString), pointer :: Log2MsgPtr - procedure (ActionStringInt), pointer :: Log2MsgIntPtr - procedure (ActionStringFloat), pointer :: Log2MsgFloatPtr - procedure (ActionStringDouble), pointer :: Log2MsgDoublePtr - procedure (ActionStringBool), pointer :: Log2MsgBoolPtr - contains - - subroutine Log2Log1(message) - implicit none - character(len=*), intent(in) :: message -#ifdef Log2 - if(associated(Log2MsgPtr)) call Log2MsgPtr(message) -#endif - end subroutine - - subroutine Log2Log2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value -#ifdef Log2 - if(associated(Log2MsgIntPtr)) call Log2MsgIntPtr(message, value) -#endif - end subroutine - - subroutine Log2Log3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value -#ifdef Log2 - if(associated(Log2MsgFloatPtr)) call Log2MsgFloatPtr(message, value) -#endif - end subroutine - - subroutine Log2Log4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value -#ifdef Log2 - if(associated(Log2MsgDoublePtr)) call Log2MsgDoublePtr(message, value) -#endif - end subroutine - - subroutine Log2Log5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value -#ifdef Log2 - if(associated(Log2MsgBoolPtr)) call Log2MsgBoolPtr(message, value) -#endif - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeLog2Message(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2Message - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2Message' :: SubscribeLog2Message - implicit none - procedure (ActionString) :: a - Log2MsgPtr => a - end subroutine - - subroutine SubscribeLog2MsgInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgInt' :: SubscribeLog2MsgInt - implicit none - procedure (ActionStringInt) :: a - Log2MsgIntPtr => a - end subroutine - - subroutine SubscribeLog2MsgFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgFloat' :: SubscribeLog2MsgFloat - implicit none - procedure (ActionStringFloat) :: a - Log2MsgFloatPtr => a - end subroutine - - subroutine SubscribeLog2MsgDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgDouble' :: SubscribeLog2MsgDouble - implicit none - procedure (ActionStringDouble) :: a - Log2MsgDoublePtr => a - end subroutine - - subroutine SubscribeLog2MsgBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgBool' :: SubscribeLog2MsgBool - implicit none - procedure (ActionStringBool) :: a - Log2MsgBoolPtr => a - end subroutine - +module CLog2 + use CIActionReference + implicit none + public + interface Log_2 + module procedure :: Log2Log1, Log2Log2, Log2Log3, Log2Log4, Log2Log5 + end interface + + procedure (ActionString), pointer :: Log2MsgPtr + procedure (ActionStringInt), pointer :: Log2MsgIntPtr + procedure (ActionStringFloat), pointer :: Log2MsgFloatPtr + procedure (ActionStringDouble), pointer :: Log2MsgDoublePtr + procedure (ActionStringBool), pointer :: Log2MsgBoolPtr + contains + + subroutine Log2Log1(message) + implicit none + character(len=*), intent(in) :: message +#ifdef Log2 + if(associated(Log2MsgPtr)) call Log2MsgPtr(message) +#endif + end subroutine + + subroutine Log2Log2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value +#ifdef Log2 + if(associated(Log2MsgIntPtr)) call Log2MsgIntPtr(message, value) +#endif + end subroutine + + subroutine Log2Log3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value +#ifdef Log2 + if(associated(Log2MsgFloatPtr)) call Log2MsgFloatPtr(message, value) +#endif + end subroutine + + subroutine Log2Log4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value +#ifdef Log2 + if(associated(Log2MsgDoublePtr)) call Log2MsgDoublePtr(message, value) +#endif + end subroutine + + subroutine Log2Log5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value +#ifdef Log2 + if(associated(Log2MsgBoolPtr)) call Log2MsgBoolPtr(message, value) +#endif + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeLog2Message(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2Message + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2Message' :: SubscribeLog2Message + implicit none + procedure (ActionString) :: a + Log2MsgPtr => a + end subroutine + + subroutine SubscribeLog2MsgInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgInt' :: SubscribeLog2MsgInt + implicit none + procedure (ActionStringInt) :: a + Log2MsgIntPtr => a + end subroutine + + subroutine SubscribeLog2MsgFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgFloat' :: SubscribeLog2MsgFloat + implicit none + procedure (ActionStringFloat) :: a + Log2MsgFloatPtr => a + end subroutine + + subroutine SubscribeLog2MsgDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgDouble' :: SubscribeLog2MsgDouble + implicit none + procedure (ActionStringDouble) :: a + Log2MsgDoublePtr => a + end subroutine + + subroutine SubscribeLog2MsgBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog2MsgBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog2MsgBool' :: SubscribeLog2MsgBool + implicit none + procedure (ActionStringBool) :: a + Log2MsgBoolPtr => a + end subroutine + end module CLog2 \ No newline at end of file diff --git a/CSharp/ErrorLog/CLog3.f90 b/CSharp/ErrorLog/CLog3.f90 index 866aaa0..f553c5e 100644 --- a/CSharp/ErrorLog/CLog3.f90 +++ b/CSharp/ErrorLog/CLog3.f90 @@ -1,113 +1,113 @@ -module CLog3 - use CIActionReference - implicit none - public - interface Log_3 - module procedure :: Log3Log1, Log3Log2, Log3Log3, Log3Log4, Log3Log5 - end interface - - procedure (ActionString), pointer :: Log3MsgPtr - procedure (ActionStringInt), pointer :: Log3MsgIntPtr - procedure (ActionStringFloat), pointer :: Log3MsgFloatPtr - procedure (ActionStringDouble), pointer :: Log3MsgDoublePtr - procedure (ActionStringBool), pointer :: Log3MsgBoolPtr - contains - - subroutine Log3Log1(message) - implicit none - character(len=*), intent(in) :: message -#ifdef Log3 - if(associated(Log3MsgPtr)) call Log3MsgPtr(message) -#endif - end subroutine - - subroutine Log3Log2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value -#ifdef Log3 - if(associated(Log3MsgIntPtr)) call Log3MsgIntPtr(message, value) -#endif - end subroutine - - subroutine Log3Log3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value -#ifdef Log3 - if(associated(Log3MsgFloatPtr)) call Log3MsgFloatPtr(message, value) -#endif - end subroutine - - subroutine Log3Log4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value -#ifdef Log3 - if(associated(Log3MsgDoublePtr)) call Log3MsgDoublePtr(message, value) -#endif - end subroutine - - subroutine Log3Log5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value -#ifdef Log3 - if(associated(Log3MsgBoolPtr)) call Log3MsgBoolPtr(message, value) -#endif - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeLog3Message(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3Message - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3Message' :: SubscribeLog3Message - implicit none - procedure (ActionString) :: a - Log3MsgPtr => a - end subroutine - - subroutine SubscribeLog3MsgInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgInt' :: SubscribeLog3MsgInt - implicit none - procedure (ActionStringInt) :: a - Log3MsgIntPtr => a - end subroutine - - subroutine SubscribeLog3MsgFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgFloat' :: SubscribeLog3MsgFloat - implicit none - procedure (ActionStringFloat) :: a - Log3MsgFloatPtr => a - end subroutine - - subroutine SubscribeLog3MsgDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgDouble' :: SubscribeLog3MsgDouble - implicit none - procedure (ActionStringDouble) :: a - Log3MsgDoublePtr => a - end subroutine - - subroutine SubscribeLog3MsgBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgBool' :: SubscribeLog3MsgBool - implicit none - procedure (ActionStringBool) :: a - Log3MsgBoolPtr => a - end subroutine - +module CLog3 + use CIActionReference + implicit none + public + interface Log_3 + module procedure :: Log3Log1, Log3Log2, Log3Log3, Log3Log4, Log3Log5 + end interface + + procedure (ActionString), pointer :: Log3MsgPtr + procedure (ActionStringInt), pointer :: Log3MsgIntPtr + procedure (ActionStringFloat), pointer :: Log3MsgFloatPtr + procedure (ActionStringDouble), pointer :: Log3MsgDoublePtr + procedure (ActionStringBool), pointer :: Log3MsgBoolPtr + contains + + subroutine Log3Log1(message) + implicit none + character(len=*), intent(in) :: message +#ifdef Log3 + if(associated(Log3MsgPtr)) call Log3MsgPtr(message) +#endif + end subroutine + + subroutine Log3Log2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value +#ifdef Log3 + if(associated(Log3MsgIntPtr)) call Log3MsgIntPtr(message, value) +#endif + end subroutine + + subroutine Log3Log3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value +#ifdef Log3 + if(associated(Log3MsgFloatPtr)) call Log3MsgFloatPtr(message, value) +#endif + end subroutine + + subroutine Log3Log4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value +#ifdef Log3 + if(associated(Log3MsgDoublePtr)) call Log3MsgDoublePtr(message, value) +#endif + end subroutine + + subroutine Log3Log5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value +#ifdef Log3 + if(associated(Log3MsgBoolPtr)) call Log3MsgBoolPtr(message, value) +#endif + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeLog3Message(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3Message + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3Message' :: SubscribeLog3Message + implicit none + procedure (ActionString) :: a + Log3MsgPtr => a + end subroutine + + subroutine SubscribeLog3MsgInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgInt' :: SubscribeLog3MsgInt + implicit none + procedure (ActionStringInt) :: a + Log3MsgIntPtr => a + end subroutine + + subroutine SubscribeLog3MsgFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgFloat' :: SubscribeLog3MsgFloat + implicit none + procedure (ActionStringFloat) :: a + Log3MsgFloatPtr => a + end subroutine + + subroutine SubscribeLog3MsgDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgDouble' :: SubscribeLog3MsgDouble + implicit none + procedure (ActionStringDouble) :: a + Log3MsgDoublePtr => a + end subroutine + + subroutine SubscribeLog3MsgBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog3MsgBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog3MsgBool' :: SubscribeLog3MsgBool + implicit none + procedure (ActionStringBool) :: a + Log3MsgBoolPtr => a + end subroutine + end module CLog3 \ No newline at end of file diff --git a/CSharp/ErrorLog/CLog4.f90 b/CSharp/ErrorLog/CLog4.f90 index 16241bd..a95c583 100644 --- a/CSharp/ErrorLog/CLog4.f90 +++ b/CSharp/ErrorLog/CLog4.f90 @@ -1,113 +1,113 @@ -module CLog4 - use CIActionReference - implicit none - public - interface Log_4 - module procedure :: Log4Log1, Log4Log2, Log4Log3, Log4Log4, Log4Log5 - end interface - - procedure (ActionString), pointer :: Log4MsgPtr - procedure (ActionStringInt), pointer :: Log4MsgIntPtr - procedure (ActionStringFloat), pointer :: Log4MsgFloatPtr - procedure (ActionStringDouble), pointer :: Log4MsgDoublePtr - procedure (ActionStringBool), pointer :: Log4MsgBoolPtr - contains - - subroutine Log4Log1(message) - implicit none - character(len=*), intent(in) :: message -#ifdef Log4 - if(associated(Log4MsgPtr)) call Log4MsgPtr(message) -#endif - end subroutine - - subroutine Log4Log2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value -#ifdef Log4 - if(associated(Log4MsgIntPtr)) call Log4MsgIntPtr(message, value) -#endif - end subroutine - - subroutine Log4Log3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value -#ifdef Log4 - if(associated(Log4MsgFloatPtr)) call Log4MsgFloatPtr(message, value) -#endif - end subroutine - - subroutine Log4Log4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value -#ifdef Log4 - if(associated(Log4MsgDoublePtr)) call Log4MsgDoublePtr(message, value) -#endif - end subroutine - - subroutine Log4Log5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value -#ifdef Log4 - if(associated(Log4MsgBoolPtr)) call Log4MsgBoolPtr(message, value) -#endif - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeLog4Message(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4Message - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4Message' :: SubscribeLog4Message - implicit none - procedure (ActionString) :: a - Log4MsgPtr => a - end subroutine - - subroutine SubscribeLog4MsgInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgInt' :: SubscribeLog4MsgInt - implicit none - procedure (ActionStringInt) :: a - Log4MsgIntPtr => a - end subroutine - - subroutine SubscribeLog4MsgFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgFloat' :: SubscribeLog4MsgFloat - implicit none - procedure (ActionStringFloat) :: a - Log4MsgFloatPtr => a - end subroutine - - subroutine SubscribeLog4MsgDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgDouble' :: SubscribeLog4MsgDouble - implicit none - procedure (ActionStringDouble) :: a - Log4MsgDoublePtr => a - end subroutine - - subroutine SubscribeLog4MsgBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgBool' :: SubscribeLog4MsgBool - implicit none - procedure (ActionStringBool) :: a - Log4MsgBoolPtr => a - end subroutine - +module CLog4 + use CIActionReference + implicit none + public + interface Log_4 + module procedure :: Log4Log1, Log4Log2, Log4Log3, Log4Log4, Log4Log5 + end interface + + procedure (ActionString), pointer :: Log4MsgPtr + procedure (ActionStringInt), pointer :: Log4MsgIntPtr + procedure (ActionStringFloat), pointer :: Log4MsgFloatPtr + procedure (ActionStringDouble), pointer :: Log4MsgDoublePtr + procedure (ActionStringBool), pointer :: Log4MsgBoolPtr + contains + + subroutine Log4Log1(message) + implicit none + character(len=*), intent(in) :: message +#ifdef Log4 + if(associated(Log4MsgPtr)) call Log4MsgPtr(message) +#endif + end subroutine + + subroutine Log4Log2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value +#ifdef Log4 + if(associated(Log4MsgIntPtr)) call Log4MsgIntPtr(message, value) +#endif + end subroutine + + subroutine Log4Log3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value +#ifdef Log4 + if(associated(Log4MsgFloatPtr)) call Log4MsgFloatPtr(message, value) +#endif + end subroutine + + subroutine Log4Log4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value +#ifdef Log4 + if(associated(Log4MsgDoublePtr)) call Log4MsgDoublePtr(message, value) +#endif + end subroutine + + subroutine Log4Log5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value +#ifdef Log4 + if(associated(Log4MsgBoolPtr)) call Log4MsgBoolPtr(message, value) +#endif + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeLog4Message(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4Message + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4Message' :: SubscribeLog4Message + implicit none + procedure (ActionString) :: a + Log4MsgPtr => a + end subroutine + + subroutine SubscribeLog4MsgInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgInt' :: SubscribeLog4MsgInt + implicit none + procedure (ActionStringInt) :: a + Log4MsgIntPtr => a + end subroutine + + subroutine SubscribeLog4MsgFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgFloat' :: SubscribeLog4MsgFloat + implicit none + procedure (ActionStringFloat) :: a + Log4MsgFloatPtr => a + end subroutine + + subroutine SubscribeLog4MsgDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgDouble' :: SubscribeLog4MsgDouble + implicit none + procedure (ActionStringDouble) :: a + Log4MsgDoublePtr => a + end subroutine + + subroutine SubscribeLog4MsgBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog4MsgBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog4MsgBool' :: SubscribeLog4MsgBool + implicit none + procedure (ActionStringBool) :: a + Log4MsgBoolPtr => a + end subroutine + end module CLog4 \ No newline at end of file diff --git a/CSharp/ErrorLog/CLog5.f90 b/CSharp/ErrorLog/CLog5.f90 index 50c9ef1..b330a77 100644 --- a/CSharp/ErrorLog/CLog5.f90 +++ b/CSharp/ErrorLog/CLog5.f90 @@ -1,113 +1,113 @@ -module CLog5 - use CIActionReference - implicit none - public - interface Log_5 - module procedure :: Log5Log1, Log5Log2, Log5Log3, Log5Log4, Log5Log5 - end interface - - procedure (ActionString), pointer :: Log5MsgPtr - procedure (ActionStringInt), pointer :: Log5MsgIntPtr - procedure (ActionStringFloat), pointer :: Log5MsgFloatPtr - procedure (ActionStringDouble), pointer :: Log5MsgDoublePtr - procedure (ActionStringBool), pointer :: Log5MsgBoolPtr - contains - - subroutine Log5Log1(message) - implicit none - character(len=*), intent(in) :: message -#ifdef Log5 - if(associated(Log5MsgPtr)) call Log5MsgPtr(message) -#endif - end subroutine - - subroutine Log5Log2(message, value) - implicit none - character(len=*), intent(in) :: message - integer, intent(in) :: value -#ifdef Log5 - if(associated(Log5MsgIntPtr)) call Log5MsgIntPtr(message, value) -#endif - end subroutine - - subroutine Log5Log3(message, value) - implicit none - character(len=*), intent(in) :: message - real, intent(in) :: value -#ifdef Log5 - if(associated(Log5MsgFloatPtr)) call Log5MsgFloatPtr(message, value) -#endif - end subroutine - - subroutine Log5Log4(message, value) - implicit none - character(len=*), intent(in) :: message - real(8), intent(in) :: value -#ifdef Log5 - if(associated(Log5MsgDoublePtr)) call Log5MsgDoublePtr(message, value) -#endif - end subroutine - - subroutine Log5Log5(message, value) - implicit none - character(len=*), intent(in) :: message - logical, intent(in) :: value -#ifdef Log5 - if(associated(Log5MsgBoolPtr)) call Log5MsgBoolPtr(message, value) -#endif - end subroutine - - - - - - - - - - - - - - - subroutine SubscribeLog5Message(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5Message - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5Message' :: SubscribeLog5Message - implicit none - procedure (ActionString) :: a - Log5MsgPtr => a - end subroutine - - subroutine SubscribeLog5MsgInt(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgInt - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgInt' :: SubscribeLog5MsgInt - implicit none - procedure (ActionStringInt) :: a - Log5MsgIntPtr => a - end subroutine - - subroutine SubscribeLog5MsgFloat(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgFloat - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgFloat' :: SubscribeLog5MsgFloat - implicit none - procedure (ActionStringFloat) :: a - Log5MsgFloatPtr => a - end subroutine - - subroutine SubscribeLog5MsgDouble(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgDouble - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgDouble' :: SubscribeLog5MsgDouble - implicit none - procedure (ActionStringDouble) :: a - Log5MsgDoublePtr => a - end subroutine - - subroutine SubscribeLog5MsgBool(a) - !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgBool - !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgBool' :: SubscribeLog5MsgBool - implicit none - procedure (ActionStringBool) :: a - Log5MsgBoolPtr => a - end subroutine - +module CLog5 + use CIActionReference + implicit none + public + interface Log_5 + module procedure :: Log5Log1, Log5Log2, Log5Log3, Log5Log4, Log5Log5 + end interface + + procedure (ActionString), pointer :: Log5MsgPtr + procedure (ActionStringInt), pointer :: Log5MsgIntPtr + procedure (ActionStringFloat), pointer :: Log5MsgFloatPtr + procedure (ActionStringDouble), pointer :: Log5MsgDoublePtr + procedure (ActionStringBool), pointer :: Log5MsgBoolPtr + contains + + subroutine Log5Log1(message) + implicit none + character(len=*), intent(in) :: message +#ifdef Log5 + if(associated(Log5MsgPtr)) call Log5MsgPtr(message) +#endif + end subroutine + + subroutine Log5Log2(message, value) + implicit none + character(len=*), intent(in) :: message + integer, intent(in) :: value +#ifdef Log5 + if(associated(Log5MsgIntPtr)) call Log5MsgIntPtr(message, value) +#endif + end subroutine + + subroutine Log5Log3(message, value) + implicit none + character(len=*), intent(in) :: message + real, intent(in) :: value +#ifdef Log5 + if(associated(Log5MsgFloatPtr)) call Log5MsgFloatPtr(message, value) +#endif + end subroutine + + subroutine Log5Log4(message, value) + implicit none + character(len=*), intent(in) :: message + real(8), intent(in) :: value +#ifdef Log5 + if(associated(Log5MsgDoublePtr)) call Log5MsgDoublePtr(message, value) +#endif + end subroutine + + subroutine Log5Log5(message, value) + implicit none + character(len=*), intent(in) :: message + logical, intent(in) :: value +#ifdef Log5 + if(associated(Log5MsgBoolPtr)) call Log5MsgBoolPtr(message, value) +#endif + end subroutine + + + + + + + + + + + + + + + subroutine SubscribeLog5Message(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5Message + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5Message' :: SubscribeLog5Message + implicit none + procedure (ActionString) :: a + Log5MsgPtr => a + end subroutine + + subroutine SubscribeLog5MsgInt(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgInt + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgInt' :: SubscribeLog5MsgInt + implicit none + procedure (ActionStringInt) :: a + Log5MsgIntPtr => a + end subroutine + + subroutine SubscribeLog5MsgFloat(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgFloat + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgFloat' :: SubscribeLog5MsgFloat + implicit none + procedure (ActionStringFloat) :: a + Log5MsgFloatPtr => a + end subroutine + + subroutine SubscribeLog5MsgDouble(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgDouble + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgDouble' :: SubscribeLog5MsgDouble + implicit none + procedure (ActionStringDouble) :: a + Log5MsgDoublePtr => a + end subroutine + + subroutine SubscribeLog5MsgBool(a) + !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLog5MsgBool + !DEC$ ATTRIBUTES ALIAS: 'SubscribeLog5MsgBool' :: SubscribeLog5MsgBool + implicit none + procedure (ActionStringBool) :: a + Log5MsgBoolPtr => a + end subroutine + end module CLog5 \ No newline at end of file diff --git a/CSharp/OperationScenarios/Common/COperationScenariosMain.f90 b/CSharp/OperationScenarios/Common/COperationScenariosMain.f90 index 27e3774..40b0063 100644 --- a/CSharp/OperationScenarios/Common/COperationScenariosMain.f90 +++ b/CSharp/OperationScenarios/Common/COperationScenariosMain.f90 @@ -1,462 +1,462 @@ -module COperationScenariosMain - use CIActionReference - implicit none - public - ! procedure (ActionVoid), pointer :: UpdateUnityPtr - contains - - subroutine OperationScenarios_Step - ! use CSimulationVariables - use OperationScenariosModule - use CElevatorConnectionEnum - use CCloseKellyCockLedNotification - use CCloseSafetyValveLedNotification - use CFillMouseHoleLedNotification - use CIrIBopLedNotification - use CIrSafetyValveLedNotification - use CLatchLedNotification - use COpenKellyCockLedNotification - use COpenSafetyValveLedNotification - use CSlipsNotification - use CSwingLedNotification - use CTongNotification - use CUnlatchLedNotification - use CInstallFillupHeadPermission - use CInstallMudBucketPermission - use CIrIbopPermission - use CIrSafetyValvePermission - use CRemoveFillupHeadPermission - use CRemoveMudBucketPermission - use SoftwareInputsVariables - ! use CHookHeight - ! use CIbopHeight - ! use CNearFloorConnection - ! use CSafetyValveHeight - ! use CSlackOff - ! use CStandRack - ! use CStringPressure - ! use CZeroStringSpeed - use CUnityInputs, only: & - Get_ElevatorConnectionPossible, & - Get_JointConnectionPossible, & - Get_ElevatorPickup, & - Get_NearFloorPosition, & - Get_SingleSetInMouseHole - ! use CBucketEnum - ! use UnitySignalsModule - use CElevatorEnum - ! use CHeadEnum - use CIbopEnum - use CKellyEnum - use CMouseHoleEnum - use UnitySignalsModule - use CSafetyValveEnum - use CSlipsEnum - use CSwingEnum - use CTongEnum - ! use CStringUpdate - use CFlowPipeDisconnectEnum - use CFlowKellyDisconnectEnum - use CFillupHeadPermission - use CSwingDrillPermission - use CSwingOffPermission - use CSwingTiltPermission - ! use CTdsStemJointHeight - ! use UnitySignalsModule !for CTdsConnectionModesEnum - use CTdsElevatorModesEnum - use CTdsSpineEnum - use CTdsSwingEnum - use CTdsTongEnum - use CTdsBackupClamp - use CTdsIbopLedNotification - use CTdsPowerLedNotification - use CTdsTorqueWrenchLedNotification - - implicit none - - call Evaluate_KellyConnection() - call Evaluate_ElevatorConnection() - - call Evaluate_CloseKellyCockLed() - call Evaluate_CloseSafetyValveLed() - call Evaluate_FillMouseHoleLed() - call Evaluate_IrIBopLed() - call Evaluate_IrSafetyValveLed() - call Evaluate_LatchLed() - call Evaluate_OpenKellyCockLed() - call Evaluate_OpenSafetyValveLed() - call Evaluate_SlipsNotification() - call Evaluate_SwingLed() - call Evaluate_TongNotification() - call Evaluate_UnlatchLed() - - call Evaluate_InstallFillupHeadPermission() - call Evaluate_InstallMudBucketPermission() - call Evaluate_IrIbopPermission() - call Evaluate_IrSafetyValvePermission() - call Evaluate_RemoveFillupHeadPermission() - call Evaluate_RemoveMudBucketPermission() - - call Evaluate_MudBucket() - call Evaluate_Elevator() - call Evaluate_FillupHead() - call Evaluate_Ibop() - call Evaluate_Kelly() - call Evaluate_MouseHole() - call Evaluate_MouseHole() - call Evaluate_OperationCondition() - call Evaluate_SafetyValve() - call Evaluate_Slips() - call Evaluate_Swing() - call Evaluate_Tong() - - ! call Evaluate_StringUpdate() - - call Evaluate_FlowKellyDisconnect() - call Evaluate_FlowPipeDisconnect() - - !if(Get_FillMouseHoleLed()) then - ! call Set_MouseHole(MOUSE_HOLE_FILL) - !else - ! if((Get_KellyConnection() == KELLY_CONNECTION_SINGLE .or.& - ! Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) .and.& - ! Get_HookHeight() >= 95.0 ) then - ! call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - ! else - ! call Set_MouseHole(MOUSE_HOLE_EMPTY) - ! endif - !endif - - - - - - - - - !topdrive - call Evaluate_TdsElevatorModes() - call Evaluate_TdsConnectionModes() - call Evaluate_SwingTiltPermission() - call Evaluate_SwingOffPermission() - call Evaluate_SwingDrillPermission() - call Evaluate_FillupHeadPermission() - call Evaluate_TdsTong() - call Evaluate_TdsBackupClamp() - call Evaluate_TdsSwing() - call Evaluate_TdsSpine() - - call Evaluate_PowerLed() - call Evaluate_IbopLed() - - call Evaluate_TorqueWrenchLed() - - end subroutine OperationScenarios_Step - - ! subroutine UpdateUnity() - ! implicit none - ! if(associated(UpdateUnityPtr)) call UpdateUnityPtr() - ! end subroutine - - subroutine Kelly_ConnectionNothing - ! use CSwingEnumVariables - ! use CSlipsEnumVariables - use UnitySignalVariables - use UnitySignalsModule - use CHook - use SimulationVariables - implicit none - - call Set_HookHeight(75.0) - call sleep(1) - - ! first wait for unity to get to starting point - loop1: do - if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 - call sleepqq(100) - enddo loop1 - call sleep(1) - - !TODO: possibly goto a position to activate swing - - ! goto preferred swing position - if(data%State%unitySignals%Swing_S == SWING_MOUSE_HOLE_END) then - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - !@call UpdateUnity() - loop2: do - if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 - call sleepqq(100) - enddo loop2 - elseif (data%State%unitySignals%Swing_S == SWING_RAT_HOLE_END) then - call Set_Swing(SWING_RAT_HOLE_BEGIN) - !@call UpdateUnity() - loop3: do - if(Get_Swing() == SWING_RAT_HOLE_END) exit loop3 - call sleepqq(100) - enddo loop3 - !elseif (Swing_S == SWING_WELL_END) then - ! call Set_Swing(SWING_WELL_BEGIN) - ! !@call UpdateUnity() - ! loop4: do - ! if(Get_Swing() == SWING_WELL_END) exit loop4 - ! call sleepqq(100) - ! enddo loop4 - endif - call sleep(3) - - ! move to final hook height - call Update_HookHeight_From_Snapshot() - call sleep(3) - - end subroutine Kelly_ConnectionNothing - - - - - - subroutine Kelly_ConnectionString - ! use CSwingEnumVariables - ! use CSlipsEnumVariables - use UnitySignalVariables - use UnitySignalsModule - use CHook - use SimulationVariables - ! use CTongEnumVariables - implicit none - - call Set_HookHeight(75.0) - call sleep(1) - - ! first wait for unity to get to starting point - loop1: do - if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 - call sleepqq(100) - enddo loop1 - call sleep(1) - - ! goto connection to string position - call Set_HookHeight_S(66.7) - call sleep(1) - - ! start tong makeup - call Set_Tong(TONG_MAKEUP_BEGIN) - !@call UpdateUnity() - loop2: do - if(Get_Tong() == TONG_MAKEUP_END) exit loop2 - call sleepqq(100) - enddo loop2 - call sleepqq(100) - - ! release slips - call Set_Slips(SLIPS_UNSET_BEGIN) - !@call UpdateUnity() - loop3: do - if(Get_Slips() == SLIPS_UNSET_END) exit loop3 - call sleepqq(100) - enddo loop3 - call sleepqq(100) - - ! move to final hook height - call Update_HookHeight_From_Snapshot() - call sleep(3) - - - ! put slips to saved position - if(data%State%unitySignals%Slips_S == SLIPS_SET_END) then - - call Set_Slips(SLIPS_SET_BEGIN) - !@call UpdateUnity() - loop4: do - if(Get_Slips() == SLIPS_SET_END) exit loop4 - call sleepqq(100) - enddo loop4 - call sleep(1) - endif - - - end subroutine Kelly_ConnectionString - - - - - subroutine Kelly_ConnectionSingle - ! use CSwingEnumVariables - ! use CSlipsEnumVariables - ! use CTongEnumVariables - use UnitySignalVariables - use UnitySignalsModule - use CHook - use SimulationVariables - implicit none - - call Set_HookHeight(75.0) - call sleep(1) - - ! first wait for unity to get to starting point - loop1: do - if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 - call sleepqq(100) - enddo loop1 - call sleep(1) - - - ! goto swing mouse hole position - call Set_HookHeight_S(70.0) - call sleep(1) - - ! swing mouse hole - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - !@call UpdateUnity() - loop2: do - if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 - call sleepqq(100) - enddo loop2 - call sleepqq(100) - - - ! goto makeup pipe location - call Set_HookHeight_S(65.0) - call sleep(1) - - - ! start tong makeup - call Set_Tong(TONG_MAKEUP_BEGIN) - !@call UpdateUnity() - loop3: do - if(Get_Tong() == TONG_MAKEUP_END) exit loop3 - call sleepqq(100) - enddo loop3 - call sleepqq(100) - - - - if (data%State%unitySignals%Swing_S == SWING_WELL_END) then ! already in mouse hole - - ! goto swing location - call Set_HookHeight_S(98.0) - call sleep(1) - - ! goto preferred swing position - call Set_Swing(SWING_WELL_BEGIN) - !@call UpdateUnity() - loop4: do - if(Get_Swing() == SWING_WELL_END) exit loop4 - call sleepqq(100) - enddo loop4 - call sleep(2) - - endif - - - ! move to final hook height - call Update_HookHeight_From_Snapshot() - call sleep(3) - - end subroutine Kelly_ConnectionSingle - - subroutine Elevator_ConnectionNothing - ! use CSwingEnumVariables - ! use CSlipsEnumVariables - use UnitySignalVariables - use UnitySignalsModule - use CHook - use SimulationVariables - ! use CKellyEnumVariables - implicit none - - call Set_HookHeight(75.0) - call sleep(1) - - ! first wait for unity to get to starting point - loop1: do - if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 - call sleepqq(100) - enddo loop1 - call sleep(1) - - - !TODO: possibly goto a position to activate swing - - !! first goto mouse hole - !call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - !!@call UpdateUnity() - !loop2: do - ! if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 - ! call sleepqq(100) - !enddo loop2 - !call sleep(1) - ! - !! then goto rat hole - !call Set_Swing(SWING_RAT_HOLE_BEGIN) - !!@call UpdateUnity() - !loop3: do - ! if(Get_Swing() == SWING_RAT_HOLE_END) exit loop3 - ! call sleepqq(100) - !enddo loop3 - !call sleep(1) - - ! kelly back - call Set_Kelly(KELLY_REMOVE) - call sleepqq(100) - - ! goto preferred swing position - if(data%State%unitySignals%Swing_S == SWING_MOUSE_HOLE_END) then - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - !@call UpdateUnity() - loop4: do - if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop4 - call sleepqq(100) - enddo loop4 - elseif (data%State%unitySignals%Swing_S == SWING_RAT_HOLE_END) then - call Set_Swing(SWING_RAT_HOLE_BEGIN) - !@call UpdateUnity() - loop5: do - if(Get_Swing() == SWING_RAT_HOLE_END) exit loop5 - call sleepqq(100) - enddo loop5 - elseif (data%State%unitySignals%Swing_S == SWING_WELL_END) then - call Set_Swing(SWING_WELL_BEGIN) - !@call UpdateUnity() - loop6: do - if(Get_Swing() == SWING_WELL_END) exit loop6 - call sleepqq(100) - enddo loop6 - endif - call sleepqq(100) - - - - ! move to final hook height - call Update_HookHeight_From_Snapshot() - call sleep(3) - - end subroutine Elevator_ConnectionNothing - - - - - - subroutine Elevator_ConnectionString - implicit none - end subroutine Elevator_ConnectionString - - - - - - - - subroutine Elevator_ConnectionStand - implicit none - end subroutine Elevator_ConnectionStand - - - - - - - subroutine Elevator_ConnectionSingle - implicit none - end subroutine Elevator_ConnectionSingle - +module COperationScenariosMain + use CIActionReference + implicit none + public + ! procedure (ActionVoid), pointer :: UpdateUnityPtr + contains + + subroutine OperationScenarios_Step + ! use CSimulationVariables + use OperationScenariosModule + use CElevatorConnectionEnum + use CCloseKellyCockLedNotification + use CCloseSafetyValveLedNotification + use CFillMouseHoleLedNotification + use CIrIBopLedNotification + use CIrSafetyValveLedNotification + use CLatchLedNotification + use COpenKellyCockLedNotification + use COpenSafetyValveLedNotification + use CSlipsNotification + use CSwingLedNotification + use CTongNotification + use CUnlatchLedNotification + use CInstallFillupHeadPermission + use CInstallMudBucketPermission + use CIrIbopPermission + use CIrSafetyValvePermission + use CRemoveFillupHeadPermission + use CRemoveMudBucketPermission + use SoftwareInputsVariables + ! use CHookHeight + ! use CIbopHeight + ! use CNearFloorConnection + ! use CSafetyValveHeight + ! use CSlackOff + ! use CStandRack + ! use CStringPressure + ! use CZeroStringSpeed + use CUnityInputs, only: & + Get_ElevatorConnectionPossible, & + Get_JointConnectionPossible, & + Get_ElevatorPickup, & + Get_NearFloorPosition, & + Get_SingleSetInMouseHole + ! use CBucketEnum + ! use UnitySignalsModule + use CElevatorEnum + ! use CHeadEnum + use CIbopEnum + use CKellyEnum + use CMouseHoleEnum + use UnitySignalsModule + use CSafetyValveEnum + use CSlipsEnum + use CSwingEnum + use CTongEnum + ! use CStringUpdate + use CFlowPipeDisconnectEnum + use CFlowKellyDisconnectEnum + use CFillupHeadPermission + use CSwingDrillPermission + use CSwingOffPermission + use CSwingTiltPermission + ! use CTdsStemJointHeight + ! use UnitySignalsModule !for CTdsConnectionModesEnum + use CTdsElevatorModesEnum + use CTdsSpineEnum + use CTdsSwingEnum + use CTdsTongEnum + use CTdsBackupClamp + use CTdsIbopLedNotification + use CTdsPowerLedNotification + use CTdsTorqueWrenchLedNotification + + implicit none + + call Evaluate_KellyConnection() + call Evaluate_ElevatorConnection() + + call Evaluate_CloseKellyCockLed() + call Evaluate_CloseSafetyValveLed() + call Evaluate_FillMouseHoleLed() + call Evaluate_IrIBopLed() + call Evaluate_IrSafetyValveLed() + call Evaluate_LatchLed() + call Evaluate_OpenKellyCockLed() + call Evaluate_OpenSafetyValveLed() + call Evaluate_SlipsNotification() + call Evaluate_SwingLed() + call Evaluate_TongNotification() + call Evaluate_UnlatchLed() + + call Evaluate_InstallFillupHeadPermission() + call Evaluate_InstallMudBucketPermission() + call Evaluate_IrIbopPermission() + call Evaluate_IrSafetyValvePermission() + call Evaluate_RemoveFillupHeadPermission() + call Evaluate_RemoveMudBucketPermission() + + call Evaluate_MudBucket() + call Evaluate_Elevator() + call Evaluate_FillupHead() + call Evaluate_Ibop() + call Evaluate_Kelly() + call Evaluate_MouseHole() + call Evaluate_MouseHole() + call Evaluate_OperationCondition() + call Evaluate_SafetyValve() + call Evaluate_Slips() + call Evaluate_Swing() + call Evaluate_Tong() + + ! call Evaluate_StringUpdate() + + call Evaluate_FlowKellyDisconnect() + call Evaluate_FlowPipeDisconnect() + + !if(Get_FillMouseHoleLed()) then + ! call Set_MouseHole(MOUSE_HOLE_FILL) + !else + ! if((Get_KellyConnection() == KELLY_CONNECTION_SINGLE .or.& + ! Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) .and.& + ! Get_HookHeight() >= 95.0 ) then + ! call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + ! else + ! call Set_MouseHole(MOUSE_HOLE_EMPTY) + ! endif + !endif + + + + + + + + + !topdrive + call Evaluate_TdsElevatorModes() + call Evaluate_TdsConnectionModes() + call Evaluate_SwingTiltPermission() + call Evaluate_SwingOffPermission() + call Evaluate_SwingDrillPermission() + call Evaluate_FillupHeadPermission() + call Evaluate_TdsTong() + call Evaluate_TdsBackupClamp() + call Evaluate_TdsSwing() + call Evaluate_TdsSpine() + + call Evaluate_PowerLed() + call Evaluate_IbopLed() + + call Evaluate_TorqueWrenchLed() + + end subroutine OperationScenarios_Step + + ! subroutine UpdateUnity() + ! implicit none + ! if(associated(UpdateUnityPtr)) call UpdateUnityPtr() + ! end subroutine + + subroutine Kelly_ConnectionNothing + ! use CSwingEnumVariables + ! use CSlipsEnumVariables + use UnitySignalVariables + use UnitySignalsModule + use CHook + use SimulationVariables + implicit none + + call Set_HookHeight(75.0) + call sleep(1) + + ! first wait for unity to get to starting point + loop1: do + if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 + call sleepqq(100) + enddo loop1 + call sleep(1) + + !TODO: possibly goto a position to activate swing + + ! goto preferred swing position + if(data%State%unitySignals%Swing_S == SWING_MOUSE_HOLE_END) then + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + !@call UpdateUnity() + loop2: do + if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 + call sleepqq(100) + enddo loop2 + elseif (data%State%unitySignals%Swing_S == SWING_RAT_HOLE_END) then + call Set_Swing(SWING_RAT_HOLE_BEGIN) + !@call UpdateUnity() + loop3: do + if(Get_Swing() == SWING_RAT_HOLE_END) exit loop3 + call sleepqq(100) + enddo loop3 + !elseif (Swing_S == SWING_WELL_END) then + ! call Set_Swing(SWING_WELL_BEGIN) + ! !@call UpdateUnity() + ! loop4: do + ! if(Get_Swing() == SWING_WELL_END) exit loop4 + ! call sleepqq(100) + ! enddo loop4 + endif + call sleep(3) + + ! move to final hook height + call Update_HookHeight_From_Snapshot() + call sleep(3) + + end subroutine Kelly_ConnectionNothing + + + + + + subroutine Kelly_ConnectionString + ! use CSwingEnumVariables + ! use CSlipsEnumVariables + use UnitySignalVariables + use UnitySignalsModule + use CHook + use SimulationVariables + ! use CTongEnumVariables + implicit none + + call Set_HookHeight(75.0) + call sleep(1) + + ! first wait for unity to get to starting point + loop1: do + if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 + call sleepqq(100) + enddo loop1 + call sleep(1) + + ! goto connection to string position + call Set_HookHeight_S(66.7) + call sleep(1) + + ! start tong makeup + call Set_Tong(TONG_MAKEUP_BEGIN) + !@call UpdateUnity() + loop2: do + if(Get_Tong() == TONG_MAKEUP_END) exit loop2 + call sleepqq(100) + enddo loop2 + call sleepqq(100) + + ! release slips + call Set_Slips(SLIPS_UNSET_BEGIN) + !@call UpdateUnity() + loop3: do + if(Get_Slips() == SLIPS_UNSET_END) exit loop3 + call sleepqq(100) + enddo loop3 + call sleepqq(100) + + ! move to final hook height + call Update_HookHeight_From_Snapshot() + call sleep(3) + + + ! put slips to saved position + if(data%State%unitySignals%Slips_S == SLIPS_SET_END) then + + call Set_Slips(SLIPS_SET_BEGIN) + !@call UpdateUnity() + loop4: do + if(Get_Slips() == SLIPS_SET_END) exit loop4 + call sleepqq(100) + enddo loop4 + call sleep(1) + endif + + + end subroutine Kelly_ConnectionString + + + + + subroutine Kelly_ConnectionSingle + ! use CSwingEnumVariables + ! use CSlipsEnumVariables + ! use CTongEnumVariables + use UnitySignalVariables + use UnitySignalsModule + use CHook + use SimulationVariables + implicit none + + call Set_HookHeight(75.0) + call sleep(1) + + ! first wait for unity to get to starting point + loop1: do + if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 + call sleepqq(100) + enddo loop1 + call sleep(1) + + + ! goto swing mouse hole position + call Set_HookHeight_S(70.0) + call sleep(1) + + ! swing mouse hole + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + !@call UpdateUnity() + loop2: do + if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 + call sleepqq(100) + enddo loop2 + call sleepqq(100) + + + ! goto makeup pipe location + call Set_HookHeight_S(65.0) + call sleep(1) + + + ! start tong makeup + call Set_Tong(TONG_MAKEUP_BEGIN) + !@call UpdateUnity() + loop3: do + if(Get_Tong() == TONG_MAKEUP_END) exit loop3 + call sleepqq(100) + enddo loop3 + call sleepqq(100) + + + + if (data%State%unitySignals%Swing_S == SWING_WELL_END) then ! already in mouse hole + + ! goto swing location + call Set_HookHeight_S(98.0) + call sleep(1) + + ! goto preferred swing position + call Set_Swing(SWING_WELL_BEGIN) + !@call UpdateUnity() + loop4: do + if(Get_Swing() == SWING_WELL_END) exit loop4 + call sleepqq(100) + enddo loop4 + call sleep(2) + + endif + + + ! move to final hook height + call Update_HookHeight_From_Snapshot() + call sleep(3) + + end subroutine Kelly_ConnectionSingle + + subroutine Elevator_ConnectionNothing + ! use CSwingEnumVariables + ! use CSlipsEnumVariables + use UnitySignalVariables + use UnitySignalsModule + use CHook + use SimulationVariables + ! use CKellyEnumVariables + implicit none + + call Set_HookHeight(75.0) + call sleep(1) + + ! first wait for unity to get to starting point + loop1: do + if(Get_Swing() == SWING_WELL_END .and. Get_Slips() == SLIPS_SET_END) exit loop1 + call sleepqq(100) + enddo loop1 + call sleep(1) + + + !TODO: possibly goto a position to activate swing + + !! first goto mouse hole + !call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + !!@call UpdateUnity() + !loop2: do + ! if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop2 + ! call sleepqq(100) + !enddo loop2 + !call sleep(1) + ! + !! then goto rat hole + !call Set_Swing(SWING_RAT_HOLE_BEGIN) + !!@call UpdateUnity() + !loop3: do + ! if(Get_Swing() == SWING_RAT_HOLE_END) exit loop3 + ! call sleepqq(100) + !enddo loop3 + !call sleep(1) + + ! kelly back + call Set_Kelly(KELLY_REMOVE) + call sleepqq(100) + + ! goto preferred swing position + if(data%State%unitySignals%Swing_S == SWING_MOUSE_HOLE_END) then + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + !@call UpdateUnity() + loop4: do + if(Get_Swing() == SWING_MOUSE_HOLE_END) exit loop4 + call sleepqq(100) + enddo loop4 + elseif (data%State%unitySignals%Swing_S == SWING_RAT_HOLE_END) then + call Set_Swing(SWING_RAT_HOLE_BEGIN) + !@call UpdateUnity() + loop5: do + if(Get_Swing() == SWING_RAT_HOLE_END) exit loop5 + call sleepqq(100) + enddo loop5 + elseif (data%State%unitySignals%Swing_S == SWING_WELL_END) then + call Set_Swing(SWING_WELL_BEGIN) + !@call UpdateUnity() + loop6: do + if(Get_Swing() == SWING_WELL_END) exit loop6 + call sleepqq(100) + enddo loop6 + endif + call sleepqq(100) + + + + ! move to final hook height + call Update_HookHeight_From_Snapshot() + call sleep(3) + + end subroutine Elevator_ConnectionNothing + + + + + + subroutine Elevator_ConnectionString + implicit none + end subroutine Elevator_ConnectionString + + + + + + + + subroutine Elevator_ConnectionStand + implicit none + end subroutine Elevator_ConnectionStand + + + + + + + subroutine Elevator_ConnectionSingle + implicit none + end subroutine Elevator_ConnectionSingle + end module COperationScenariosMain \ No newline at end of file diff --git a/CSharp/OperationScenarios/Common/COperationScenariosSettings.f90 b/CSharp/OperationScenarios/Common/COperationScenariosSettings.f90 index a5faec2..a9812ee 100644 --- a/CSharp/OperationScenarios/Common/COperationScenariosSettings.f90 +++ b/CSharp/OperationScenarios/Common/COperationScenariosSettings.f90 @@ -1,489 +1,489 @@ -module COperationScenariosSettings - implicit none - public - contains - - !subroutine Initialization() - ! ! use CSimulationVariables - ! use CUnityOutputs, only: SetupUnityOutputs => Setup - ! - ! use CBucketEnum - ! use CTongEnum - ! use CSwingEnum - ! use CSlipsEnum - ! use CSafetyValveEnum - ! use UnitySignalsModule - ! use CMouseHoleEnum - ! use CKellyEnum - ! use OperationScenariosModule - ! use CIbopEnum - ! use CHeadEnum - ! use CElevatorEnum - ! use CElevatorConnectionEnum - ! - ! use CInstallFillupHeadPermission - ! use CInstallMudBucketPermission - ! use CIrIbopPermission - ! use CIrSafetyValvePermission - ! use CRemoveFillupHeadPermission - ! use CRemoveMudBucketPermission - ! - ! use CCloseKellyCockLedNotification - ! use CCloseSafetyValveLedNotification - ! use CFillMouseHoleLedNotification - ! use CIrIBopLedNotification - ! use CIrSafetyValveLedNotification - ! use CLatchLedNotification - ! use COpenKellyCockLedNotification - ! use COpenSafetyValveLedNotification - ! use CSlipsNotification - ! use CSwingLedNotification - ! use CTongNotification - ! use CUnlatchLedNotification - ! - ! use CHookHeight - ! use CIbopHeight - ! use CNearFloorConnection - ! use CSafetyValveHeight - ! use CSlackOff - ! use CStandRack - ! use CStringPressure - ! use CZeroStringSpeed - ! - ! use CStringUpdate - ! - ! use CFlowPipeDisconnectEnum - ! use CFlowKellyDisconnectEnum - ! - ! use CFillupHeadPermission - ! use CSwingDrillPermission - ! use CSwingOffPermission - ! use CSwingTiltPermission - ! use CTdsStemJointHeight - ! use UnitySignalsModule !for CTdsConnectionModesEnum - ! use CTdsElevatorModesEnum - ! use CTdsSpineEnum - ! use CTdsSwingEnum - ! use CTdsTongEnum - ! use CTdsBackupClamp - ! - ! use CTdsIbopLedNotification - ! use CTdsPowerLedNotification - ! - ! use CTdsTorqueWrenchLedNotification - ! - ! implicit none - ! - ! call SetupUnityOutputs() - ! - ! call Subscribe_Tong() - ! call Subscribe_MudBucket() - ! call Subscribe_ElevatorConnection() - ! call Subscribe_Elevator() - ! call Subscribe_FillupHead() - ! call Subscribe_Ibop() - ! call Subscribe_KellyConnection() - ! call Subscribe_Kelly() - ! call Subscribe_MouseHole() - ! call Subscribe_OperationCondition() - ! call Subscribe_SafetyValve() - ! call Subscribe_Slips() - ! call Subscribe_Swing() - ! - ! - ! call Subscribe_InstallFillupHeadPermission() - ! call Subscribe_InstallMudBucketPermission() - ! call Subscribe_IrIbopPermission() - ! call Subscribe_IrSafetyValvePermission() - ! call Subscribe_RemoveFillupHeadPermission() - ! call Subscribe_RemoveMudBucketPermission() - ! - ! call Subscribe_CloseKellyCockLed() - ! call Subscribe_CloseSafetyValveLed() - ! call Subscribe_FillMouseHoleLed() - ! call Subscribe_IrIBopLed() - ! call Subscribe_IrSafetyValveLed() - ! call Subscribe_LatchLed() - ! call Subscribe_OpenKellyCockLed() - ! call Subscribe_OpenSafetyValveLed() - ! call Subscribe_SlipsNotification() - ! call Subscribe_SwingLed() - ! call Subscribe_UnlatchLed() - ! - ! call Subscribe_HookHeight() - ! call Subscribe_IbopHeight() - ! call Subscribe_NearFloorConnection() - ! call Subscribe_SafetyValveHeight() - ! call Subscribe_SlackOff() - ! call Subscribe_StringPressure() - ! call Subscribe_ZeroStringSpeed() - ! call Subscribe_StandRack() - ! - ! call Subscribe_StringUpdate() - ! - ! call Subscribe_TongNotification() - ! - ! call Subscribe_FlowKellyDisconnect() - ! call Subscribe_FlowPipeDisconnect() - ! - ! - ! - ! - ! - ! !top drive - ! call Subscribe_TdsConnectionModes() - ! call Subscribe_TdsElevatorModes() - ! call Subscribe_FillupHeadPermission() - ! call Subscribe_SwingDrillPermission() - ! call Subscribe_SwingOffPermission() - ! call Subscribe_SwingTiltPermission() - ! call Subscribe_TdsStemJointHeight() - ! call Subscribe_TdsTong() - ! call Subscribe_TdsBackupClamp() - ! call Subscribe_TdsSwing() - ! call Subscribe_TdsSpine() - ! call Subscribe_PowerLed() - ! call Subscribe_IbopLed() - ! - ! call Subscribe_TorqueWrenchLed() - ! - ! - ! call OnSimulationStart%Add(SetDefaultValues) - ! - !end subroutine - - subroutine SetDefaultValues() - use OperationScenariosModule - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, TopDrive_DriveType - use CManifolds, only: RemoveSafetyValve_TripMode, RemoveSafetyValve_KellyMode - implicit none - - call Set_KellyConnection(KELLY_CONNECTION_NOTHING) - !Get_KellyConnection() - !KELLY_CONNECTION_NOTHING - !KELLY_CONNECTION_STRING - !KELLY_CONNECTION_SINGLE - call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) - !Get_ElevatorConnection() - !ELEVATOR_CONNECTION_NOTHING - !ELEVATOR_CONNECTION_STRING - !ELEVATOR_CONNECTION_STAND - !ELEVATOR_CONNECTION_SINGLE - !ELEVATOR_LATCH_STRING - !ELEVATOR_LATCH_SINGLE - !ELEVATOR_LATCH_STAND - - - - - - - - - call Set_CloseKellyCockLed(.false.) !Get_CloseKellyCockLed() - call Set_CloseSafetyValveLed(.false.) !Get_CloseSafetyValveLed() - call Set_FillMouseHoleLed(.true.) !Get_FillMouseHoleLed() - call Set_IrIBopLed(.false.) !Get_IrIBopLed() - !call Set_IrSafetyValveLed(.true.) !Get_IrSafetyValveLed() - if(data%State%Hoisting%DriveType == TopDrive_DriveType) then - call RemoveSafetyValve_TripMode() - call RemoveSafetyValve_KellyMode() - call Set_IrSafetyValveLed(.false.) - else - call Set_IrSafetyValveLed(.true.) - endif - call Set_LatchLed(.false.) !Get_LatchLed() - call Set_OpenKellyCockLed(.true.) !Get_OpenKellyCockLed() - call Set_OpenSafetyValveLed(.true.) !Get_OpenSafetyValveLed() - call Set_SlipsNotification(.false.) !Get_SlipsNotification() - call Set_SwingLed(.false.) !Get_SwingLed() - call Set_TongNotification(.false.) !Get_TongNotification() - call Set_UnlatchLed(.false.) !Get_UnlatchLed() - - - - - - - - call Set_InstallFillupHeadPermission(.false.) !Get_InstallFillupHeadPermission() - call Set_InstallMudBucketPermission(.false.) !Get_InstallMudBucketPermission() - call Set_IrIbopPermission(.false.) !Get_IrIbopPermission() - call Set_IrSafetyValvePermission(.false.) !Get_IrSafetyValvePermission() - call Set_RemoveFillupHeadPermission(.false.) !Get_RemoveFillupHeadPermission() - call Set_RemoveMudBucketPermission(.false.) !Get_RemoveMudBucketPermission() - - - - - - - - - - !call Set_HookHeight(REAL(70.0, 8)) !Get_HookHeight() - call Set_IbopHeight(3.0) !Get_IbopHeight() - !call Set_NearFloorConnection(3.0) !Get_NearFloorConnection() - call Set_SafetyValveHeight(3.0) !Get_SafetyValveHeight() - call Set_SlackOff(.true.) !Get_SlackOff() - !call Set_StandRack(0.0) !Get_StandRack() - !call Set_StringPressure(0.0) !Get_StringPressure() - !call Set_ZeroStringSpeed(.true.) !Get_ZeroStringSpeed() - - - - - - - - - !Get_ElevatorConnected() - !Get_JointConnection() - !Get_NearMonkeyBoardPosition() - !Get_NearFloorPosition() - !Get_SingleSetInMouseHole() - !Get_SwingCenter() - - - - - - - call Set_MudBucket(MUD_BUCKET_REMOVE) - !Get_MudBucket() - !MUD_BUCKET_INSTALL - !MUD_BUCKET_REMOVE - - call Set_Elevator(ELEVATOR_NEUTRAL) - ! Get_Elevator() - !ELEVATOR_NEUTRAL - !ELEVATOR_LATCH_STRING_BEGIN - !ELEVATOR_LATCH_STRING_END - !ELEVATOR_UNLATCH_STRING_BEGIN - !ELEVATOR_UNLATCH_STRING_END - !ELEVATOR_LATCH_STAND_BEGIN - !ELEVATOR_LATCH_STAND_END - !ELEVATOR_UNLATCH_STAND_BEGIN - !ELEVATOR_UNLATCH_STAND_END - !ELEVATOR_LATCH_SINGLE_BEGIN - !ELEVATOR_LATCH_SINGLE_END - !ELEVATOR_UNLATCH_SINGLE_BEGIN - !ELEVATOR_UNLATCH_SINGLE_END - - call Set_FillupHead(FILLUP_HEAD_REMOVE) - !Get_FillupHead() - !FILLUP_HEAD_INSTALL - !FILLUP_HEAD_REMOVE - - call Set_Ibop(IBOP_REMOVE) - !Get_Ibop() - !IBOP_INSTALL - !IBOP_REMOVE - - call Set_Kelly(KELLY_INSTALL) - !Get_Kelly() - !KELLY_NEUTRAL - !KELLY_INSTALL - !KELLY_REMOVE - - call Set_MouseHole(MOUSE_HOLE_FILL) - !Get_MouseHole() - !MOUSE_HOLE_NEUTRAL - !MOUSE_HOLE_FILL - !MOUSE_HOLE_EMPTY - - call Set_OperationCondition(OPERATION_DRILL) - !Get_OperationCondition() - !OPERATION_DRILL - !OPERATION_TRIP - - - call Set_SafetyValve(SAFETY_VALVE_INSTALL) - !Get_SafetyValve() - !SAFETY_VALVE_INSTALL - !SAFETY_VALVE_REMOVE - if(data%State%Hoisting%DriveType == TopDrive_DriveType) call Set_SafetyValve(SAFETY_VALVE_REMOVE) - - call Set_Slips(SLIPS_SET_BEGIN) - !Get_Slips() - !SLIPS_NEUTRAL - !SLIPS_SET_BEGIN - !SLIPS_SET_END - !SLIPS_UNSET_BEGIN - !SLIPS_UNSET_END - - call Set_Swing(SWING_WELL_BEGIN) - !Get_Swing() - !SWING_NEUTRAL - !SWING_MOUSE_HOLE_BEGIN - !SWING_MOUSE_HOLE_END - !SWING_RAT_HOLE_BEGIN - !SWING_RAT_HOLE_END - !SWING_WELL_BEGIN - !SWING_WELL_END - - call Set_Tong(TONG_NEUTRAL) - !Get_Tong() - !TONG_NEUTRAL - !TONG_BREAKOUT_BEGIN - !TONG_BREAKOUT_END - !TONG_MAKEUP_BEGIN - !TONG_MAKEUP_END - - - call Set_StringUpdate(STRING_UPDATE_NEUTRAL) - !Get_StringUpdate() - !STRING_UPDATE_NEUTRAL - !STRING_UPDATE_ADD_SINGLE - !STRING_UPDATE_ADD_STAND - !STRING_UPDATE_REMOVE_SINGLE - !STRING_UPDATE_REMOVE_STAND - - - - - - - - - - - - - - - - - - - - - - - - - - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) - !Get_TdsElevatorModes() - !TDS_ELEVATOR_CONNECTION_NOTHING - !TDS_ELEVATOR_CONNECTION_STRING - !TDS_ELEVATOR_CONNECTION_SINGLE - !TDS_ELEVATOR_CONNECTION_STAND - !TDS_ELEVATOR_LATCH_STRING - !TDS_ELEVATOR_LATCH_SINGLE - !TDS_ELEVATOR_LATCH_STAND - - - - - - call Set_TdsConnectionModes(TDS_CONNECTION_NOTHING) - !Get_TdsConnectionModes() - !TDS_CONNECTION_NOTHING - !TDS_CONNECTION_STRING - !TDS_CONNECTION_SPINE - - - - - call Set_SwingTiltPermission(.false.) !Get_SwingTiltPermission() - call Set_SwingOffPermission(.false.) !Get_SwingOffPermission() - call Set_SwingDrillPermission(.false.) !Get_SwingDrillPermission() - call Set_FillupHeadPermission(.false.) !Get_FillupHeadPermission() - - call Set_PowerLed(.false.) - call Set_IbopLed(.false.) - - call Set_TorqueWrenchLed(0) !Get_TorqueWrenchLed() - - - !TdsPower_REV = 1 - !TdsPower_OFF = 0 - !TdsPower_FWD = -1 - ! - !TdsMu_TORQ = 1 - !TdsMu_SPINE = 0 - !TdsMu_DRILL = -1 - ! - !TdsLinkTilt_TILT = 1 - !TdsLinkTilt_OFF = 0 - !TdsLinkTilt_DRILL = -1 - - !TDS IBOP TopDriveIbop - !TDS LinkTilt TopDriveLinkTiltState - !TDS MU TopDriveDrillTorqueState - !TDS Power TopDriveTdsPowerState - - !TopDriveTorqueWrench PRESSED=True or UNPRESSED=Falses - - !Get_TdsConnectionPossible() - !Get_TdsStemIn() - - !call Set_TdsStemJointHeight(v) !Get_TdsStemJointHeight() - - - !Get_SwingDrillPermission() - !Get_SwingOffPermission() - !Get_SwingTiltPermission() - !Get_FillupHeadPermission() - - call Set_TdsTong(TDS_TONG_BREAKOUT_END) - !Get_TdsTong() - !TDS_TONG_BREAKOUT_BEGIN - !TDS_TONG_BREAKOUT_END - !TDS_TONG_MAKEUP_BEGIN - !TDS_TONG_MAKEUP_END - - - call Set_TdsBackupClamp(BACKUP_CLAMP_OFF_END) - !Get_TdsBackupClamp() - !BACKUP_CLAMP_OFF_END - !BACKUP_CLAMP_OFF_BEGIN - !BACKUP_CLAMP_FW_BEGIN - !BACKUP_CLAMP_FW_END - - - call Set_TdsSwing(TDS_SWING_OFF_END) - !Get_TdsSwing() - !TDS_SWING_NEUTRAL - !TDS_SWING_OFF_BEGIN - !TDS_SWING_OFF_END - !TDS_SWING_DRILL_BEGIN - !TDS_SWING_DRILL_END - !TDS_SWING_TILT_BEGIN - !TDS_SWING_TILT_END - - - - - - call Set_TdsSpine(TDS_SPINE_NEUTRAL) !TDS_SPINE_DISCONNECT_END - !Get_TdsSpine() - !TDS_SPINE_NEUTRAL - !TDS_SPINE_CONNECT_BEGIN - !TDS_SPINE_CONNECT_END - !TDS_SPINE_DISCONNECT_BEGIN - !TDS_SPINE_DISCONNECT_END - - - - - - - - - - - - end subroutine - - subroutine SetDefaults_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: SetDefaults_WN - !DEC$ ATTRIBUTES ALIAS: 'SetDefaults_WN' :: SetDefaults_WN - implicit none - call SetDefaultValues() - end subroutine - +module COperationScenariosSettings + implicit none + public + contains + + !subroutine Initialization() + ! ! use CSimulationVariables + ! use CUnityOutputs, only: SetupUnityOutputs => Setup + ! + ! use CBucketEnum + ! use CTongEnum + ! use CSwingEnum + ! use CSlipsEnum + ! use CSafetyValveEnum + ! use UnitySignalsModule + ! use CMouseHoleEnum + ! use CKellyEnum + ! use OperationScenariosModule + ! use CIbopEnum + ! use CHeadEnum + ! use CElevatorEnum + ! use CElevatorConnectionEnum + ! + ! use CInstallFillupHeadPermission + ! use CInstallMudBucketPermission + ! use CIrIbopPermission + ! use CIrSafetyValvePermission + ! use CRemoveFillupHeadPermission + ! use CRemoveMudBucketPermission + ! + ! use CCloseKellyCockLedNotification + ! use CCloseSafetyValveLedNotification + ! use CFillMouseHoleLedNotification + ! use CIrIBopLedNotification + ! use CIrSafetyValveLedNotification + ! use CLatchLedNotification + ! use COpenKellyCockLedNotification + ! use COpenSafetyValveLedNotification + ! use CSlipsNotification + ! use CSwingLedNotification + ! use CTongNotification + ! use CUnlatchLedNotification + ! + ! use CHookHeight + ! use CIbopHeight + ! use CNearFloorConnection + ! use CSafetyValveHeight + ! use CSlackOff + ! use CStandRack + ! use CStringPressure + ! use CZeroStringSpeed + ! + ! use CStringUpdate + ! + ! use CFlowPipeDisconnectEnum + ! use CFlowKellyDisconnectEnum + ! + ! use CFillupHeadPermission + ! use CSwingDrillPermission + ! use CSwingOffPermission + ! use CSwingTiltPermission + ! use CTdsStemJointHeight + ! use UnitySignalsModule !for CTdsConnectionModesEnum + ! use CTdsElevatorModesEnum + ! use CTdsSpineEnum + ! use CTdsSwingEnum + ! use CTdsTongEnum + ! use CTdsBackupClamp + ! + ! use CTdsIbopLedNotification + ! use CTdsPowerLedNotification + ! + ! use CTdsTorqueWrenchLedNotification + ! + ! implicit none + ! + ! call SetupUnityOutputs() + ! + ! call Subscribe_Tong() + ! call Subscribe_MudBucket() + ! call Subscribe_ElevatorConnection() + ! call Subscribe_Elevator() + ! call Subscribe_FillupHead() + ! call Subscribe_Ibop() + ! call Subscribe_KellyConnection() + ! call Subscribe_Kelly() + ! call Subscribe_MouseHole() + ! call Subscribe_OperationCondition() + ! call Subscribe_SafetyValve() + ! call Subscribe_Slips() + ! call Subscribe_Swing() + ! + ! + ! call Subscribe_InstallFillupHeadPermission() + ! call Subscribe_InstallMudBucketPermission() + ! call Subscribe_IrIbopPermission() + ! call Subscribe_IrSafetyValvePermission() + ! call Subscribe_RemoveFillupHeadPermission() + ! call Subscribe_RemoveMudBucketPermission() + ! + ! call Subscribe_CloseKellyCockLed() + ! call Subscribe_CloseSafetyValveLed() + ! call Subscribe_FillMouseHoleLed() + ! call Subscribe_IrIBopLed() + ! call Subscribe_IrSafetyValveLed() + ! call Subscribe_LatchLed() + ! call Subscribe_OpenKellyCockLed() + ! call Subscribe_OpenSafetyValveLed() + ! call Subscribe_SlipsNotification() + ! call Subscribe_SwingLed() + ! call Subscribe_UnlatchLed() + ! + ! call Subscribe_HookHeight() + ! call Subscribe_IbopHeight() + ! call Subscribe_NearFloorConnection() + ! call Subscribe_SafetyValveHeight() + ! call Subscribe_SlackOff() + ! call Subscribe_StringPressure() + ! call Subscribe_ZeroStringSpeed() + ! call Subscribe_StandRack() + ! + ! call Subscribe_StringUpdate() + ! + ! call Subscribe_TongNotification() + ! + ! call Subscribe_FlowKellyDisconnect() + ! call Subscribe_FlowPipeDisconnect() + ! + ! + ! + ! + ! + ! !top drive + ! call Subscribe_TdsConnectionModes() + ! call Subscribe_TdsElevatorModes() + ! call Subscribe_FillupHeadPermission() + ! call Subscribe_SwingDrillPermission() + ! call Subscribe_SwingOffPermission() + ! call Subscribe_SwingTiltPermission() + ! call Subscribe_TdsStemJointHeight() + ! call Subscribe_TdsTong() + ! call Subscribe_TdsBackupClamp() + ! call Subscribe_TdsSwing() + ! call Subscribe_TdsSpine() + ! call Subscribe_PowerLed() + ! call Subscribe_IbopLed() + ! + ! call Subscribe_TorqueWrenchLed() + ! + ! + ! call OnSimulationStart%Add(SetDefaultValues) + ! + !end subroutine + + subroutine SetDefaultValues() + use OperationScenariosModule + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, TopDrive_DriveType + use CManifolds, only: RemoveSafetyValve_TripMode, RemoveSafetyValve_KellyMode + implicit none + + call Set_KellyConnection(KELLY_CONNECTION_NOTHING) + !Get_KellyConnection() + !KELLY_CONNECTION_NOTHING + !KELLY_CONNECTION_STRING + !KELLY_CONNECTION_SINGLE + call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) + !Get_ElevatorConnection() + !ELEVATOR_CONNECTION_NOTHING + !ELEVATOR_CONNECTION_STRING + !ELEVATOR_CONNECTION_STAND + !ELEVATOR_CONNECTION_SINGLE + !ELEVATOR_LATCH_STRING + !ELEVATOR_LATCH_SINGLE + !ELEVATOR_LATCH_STAND + + + + + + + + + call Set_CloseKellyCockLed(.false.) !Get_CloseKellyCockLed() + call Set_CloseSafetyValveLed(.false.) !Get_CloseSafetyValveLed() + call Set_FillMouseHoleLed(.true.) !Get_FillMouseHoleLed() + call Set_IrIBopLed(.false.) !Get_IrIBopLed() + !call Set_IrSafetyValveLed(.true.) !Get_IrSafetyValveLed() + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then + call RemoveSafetyValve_TripMode() + call RemoveSafetyValve_KellyMode() + call Set_IrSafetyValveLed(.false.) + else + call Set_IrSafetyValveLed(.true.) + endif + call Set_LatchLed(.false.) !Get_LatchLed() + call Set_OpenKellyCockLed(.true.) !Get_OpenKellyCockLed() + call Set_OpenSafetyValveLed(.true.) !Get_OpenSafetyValveLed() + call Set_SlipsNotification(.false.) !Get_SlipsNotification() + call Set_SwingLed(.false.) !Get_SwingLed() + call Set_TongNotification(.false.) !Get_TongNotification() + call Set_UnlatchLed(.false.) !Get_UnlatchLed() + + + + + + + + call Set_InstallFillupHeadPermission(.false.) !Get_InstallFillupHeadPermission() + call Set_InstallMudBucketPermission(.false.) !Get_InstallMudBucketPermission() + call Set_IrIbopPermission(.false.) !Get_IrIbopPermission() + call Set_IrSafetyValvePermission(.false.) !Get_IrSafetyValvePermission() + call Set_RemoveFillupHeadPermission(.false.) !Get_RemoveFillupHeadPermission() + call Set_RemoveMudBucketPermission(.false.) !Get_RemoveMudBucketPermission() + + + + + + + + + + !call Set_HookHeight(REAL(70.0, 8)) !Get_HookHeight() + call Set_IbopHeight(3.0) !Get_IbopHeight() + !call Set_NearFloorConnection(3.0) !Get_NearFloorConnection() + call Set_SafetyValveHeight(3.0) !Get_SafetyValveHeight() + call Set_SlackOff(.true.) !Get_SlackOff() + !call Set_StandRack(0.0) !Get_StandRack() + !call Set_StringPressure(0.0) !Get_StringPressure() + !call Set_ZeroStringSpeed(.true.) !Get_ZeroStringSpeed() + + + + + + + + + !Get_ElevatorConnected() + !Get_JointConnection() + !Get_NearMonkeyBoardPosition() + !Get_NearFloorPosition() + !Get_SingleSetInMouseHole() + !Get_SwingCenter() + + + + + + + call Set_MudBucket(MUD_BUCKET_REMOVE) + !Get_MudBucket() + !MUD_BUCKET_INSTALL + !MUD_BUCKET_REMOVE + + call Set_Elevator(ELEVATOR_NEUTRAL) + ! Get_Elevator() + !ELEVATOR_NEUTRAL + !ELEVATOR_LATCH_STRING_BEGIN + !ELEVATOR_LATCH_STRING_END + !ELEVATOR_UNLATCH_STRING_BEGIN + !ELEVATOR_UNLATCH_STRING_END + !ELEVATOR_LATCH_STAND_BEGIN + !ELEVATOR_LATCH_STAND_END + !ELEVATOR_UNLATCH_STAND_BEGIN + !ELEVATOR_UNLATCH_STAND_END + !ELEVATOR_LATCH_SINGLE_BEGIN + !ELEVATOR_LATCH_SINGLE_END + !ELEVATOR_UNLATCH_SINGLE_BEGIN + !ELEVATOR_UNLATCH_SINGLE_END + + call Set_FillupHead(FILLUP_HEAD_REMOVE) + !Get_FillupHead() + !FILLUP_HEAD_INSTALL + !FILLUP_HEAD_REMOVE + + call Set_Ibop(IBOP_REMOVE) + !Get_Ibop() + !IBOP_INSTALL + !IBOP_REMOVE + + call Set_Kelly(KELLY_INSTALL) + !Get_Kelly() + !KELLY_NEUTRAL + !KELLY_INSTALL + !KELLY_REMOVE + + call Set_MouseHole(MOUSE_HOLE_FILL) + !Get_MouseHole() + !MOUSE_HOLE_NEUTRAL + !MOUSE_HOLE_FILL + !MOUSE_HOLE_EMPTY + + call Set_OperationCondition(OPERATION_DRILL) + !Get_OperationCondition() + !OPERATION_DRILL + !OPERATION_TRIP + + + call Set_SafetyValve(SAFETY_VALVE_INSTALL) + !Get_SafetyValve() + !SAFETY_VALVE_INSTALL + !SAFETY_VALVE_REMOVE + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) call Set_SafetyValve(SAFETY_VALVE_REMOVE) + + call Set_Slips(SLIPS_SET_BEGIN) + !Get_Slips() + !SLIPS_NEUTRAL + !SLIPS_SET_BEGIN + !SLIPS_SET_END + !SLIPS_UNSET_BEGIN + !SLIPS_UNSET_END + + call Set_Swing(SWING_WELL_BEGIN) + !Get_Swing() + !SWING_NEUTRAL + !SWING_MOUSE_HOLE_BEGIN + !SWING_MOUSE_HOLE_END + !SWING_RAT_HOLE_BEGIN + !SWING_RAT_HOLE_END + !SWING_WELL_BEGIN + !SWING_WELL_END + + call Set_Tong(TONG_NEUTRAL) + !Get_Tong() + !TONG_NEUTRAL + !TONG_BREAKOUT_BEGIN + !TONG_BREAKOUT_END + !TONG_MAKEUP_BEGIN + !TONG_MAKEUP_END + + + call Set_StringUpdate(STRING_UPDATE_NEUTRAL) + !Get_StringUpdate() + !STRING_UPDATE_NEUTRAL + !STRING_UPDATE_ADD_SINGLE + !STRING_UPDATE_ADD_STAND + !STRING_UPDATE_REMOVE_SINGLE + !STRING_UPDATE_REMOVE_STAND + + + + + + + + + + + + + + + + + + + + + + + + + + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) + !Get_TdsElevatorModes() + !TDS_ELEVATOR_CONNECTION_NOTHING + !TDS_ELEVATOR_CONNECTION_STRING + !TDS_ELEVATOR_CONNECTION_SINGLE + !TDS_ELEVATOR_CONNECTION_STAND + !TDS_ELEVATOR_LATCH_STRING + !TDS_ELEVATOR_LATCH_SINGLE + !TDS_ELEVATOR_LATCH_STAND + + + + + + call Set_TdsConnectionModes(TDS_CONNECTION_NOTHING) + !Get_TdsConnectionModes() + !TDS_CONNECTION_NOTHING + !TDS_CONNECTION_STRING + !TDS_CONNECTION_SPINE + + + + + call Set_SwingTiltPermission(.false.) !Get_SwingTiltPermission() + call Set_SwingOffPermission(.false.) !Get_SwingOffPermission() + call Set_SwingDrillPermission(.false.) !Get_SwingDrillPermission() + call Set_FillupHeadPermission(.false.) !Get_FillupHeadPermission() + + call Set_PowerLed(.false.) + call Set_IbopLed(.false.) + + call Set_TorqueWrenchLed(0) !Get_TorqueWrenchLed() + + + !TdsPower_REV = 1 + !TdsPower_OFF = 0 + !TdsPower_FWD = -1 + ! + !TdsMu_TORQ = 1 + !TdsMu_SPINE = 0 + !TdsMu_DRILL = -1 + ! + !TdsLinkTilt_TILT = 1 + !TdsLinkTilt_OFF = 0 + !TdsLinkTilt_DRILL = -1 + + !TDS IBOP TopDriveIbop + !TDS LinkTilt TopDriveLinkTiltState + !TDS MU TopDriveDrillTorqueState + !TDS Power TopDriveTdsPowerState + + !TopDriveTorqueWrench PRESSED=True or UNPRESSED=Falses + + !Get_TdsConnectionPossible() + !Get_TdsStemIn() + + !call Set_TdsStemJointHeight(v) !Get_TdsStemJointHeight() + + + !Get_SwingDrillPermission() + !Get_SwingOffPermission() + !Get_SwingTiltPermission() + !Get_FillupHeadPermission() + + call Set_TdsTong(TDS_TONG_BREAKOUT_END) + !Get_TdsTong() + !TDS_TONG_BREAKOUT_BEGIN + !TDS_TONG_BREAKOUT_END + !TDS_TONG_MAKEUP_BEGIN + !TDS_TONG_MAKEUP_END + + + call Set_TdsBackupClamp(BACKUP_CLAMP_OFF_END) + !Get_TdsBackupClamp() + !BACKUP_CLAMP_OFF_END + !BACKUP_CLAMP_OFF_BEGIN + !BACKUP_CLAMP_FW_BEGIN + !BACKUP_CLAMP_FW_END + + + call Set_TdsSwing(TDS_SWING_OFF_END) + !Get_TdsSwing() + !TDS_SWING_NEUTRAL + !TDS_SWING_OFF_BEGIN + !TDS_SWING_OFF_END + !TDS_SWING_DRILL_BEGIN + !TDS_SWING_DRILL_END + !TDS_SWING_TILT_BEGIN + !TDS_SWING_TILT_END + + + + + + call Set_TdsSpine(TDS_SPINE_NEUTRAL) !TDS_SPINE_DISCONNECT_END + !Get_TdsSpine() + !TDS_SPINE_NEUTRAL + !TDS_SPINE_CONNECT_BEGIN + !TDS_SPINE_CONNECT_END + !TDS_SPINE_DISCONNECT_BEGIN + !TDS_SPINE_DISCONNECT_END + + + + + + + + + + + + end subroutine + + subroutine SetDefaults_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: SetDefaults_WN + !DEC$ ATTRIBUTES ALIAS: 'SetDefaults_WN' :: SetDefaults_WN + implicit none + call SetDefaultValues() + end subroutine + end module COperationScenariosSettings \ No newline at end of file diff --git a/CSharp/OperationScenarios/Common/COperationScenariosVariables.f90 b/CSharp/OperationScenarios/Common/COperationScenariosVariables.f90 index 076b6b4..fc345ea 100644 --- a/CSharp/OperationScenarios/Common/COperationScenariosVariables.f90 +++ b/CSharp/OperationScenarios/Common/COperationScenariosVariables.f90 @@ -1,48 +1,43 @@ -module COperationScenariosVariables - implicit none - public - type::OperationScenarioType - real :: HKL = 63.76 ! Hook And Kelly Length - real :: HL = 17.81 ! Hook Length - real :: PL = 30.0 ! Pipe Length - real :: SL = 90.0 ! Stand Length - real :: LG = 8.0 ! Limit Gap - real :: SG = 3.0 ! Slips Gap - real :: TG = 4.0 ! Tong Gap - real :: RE = 3.0 ! Release - real :: ECG = 2.3 ! Elevator Connection Gap - - !moved from enum/CElevatorConnectionEnum - integer :: ElevatorConnection = 0 - - !moved from SoftwareOutputs/CStringUpdateVariables - integer :: StringUpdate = 0 - - integer :: KellyConnection = 0 - - end type OperationScenarioType - - enum, bind(c) - enumerator STRING_UPDATE_NEUTRAL - enumerator STRING_UPDATE_ADD_SINGLE - enumerator STRING_UPDATE_ADD_STAND - enumerator STRING_UPDATE_REMOVE_SINGLE - enumerator STRING_UPDATE_REMOVE_STAND - - enumerator KELLY_CONNECTION_NOTHING - enumerator KELLY_CONNECTION_STRING - enumerator KELLY_CONNECTION_SINGLE - - enumerator ELEVATOR_CONNECTION_NOTHING - enumerator ELEVATOR_CONNECTION_STRING - enumerator ELEVATOR_CONNECTION_STAND - enumerator ELEVATOR_CONNECTION_SINGLE - enumerator ELEVATOR_LATCH_STRING - enumerator ELEVATOR_LATCH_SINGLE - enumerator ELEVATOR_LATCH_STAND - end enum - contains - - - +module COperationScenariosVariables + implicit none + public + type::OperationScenarioType + ! Apparently Constants + real :: HKL = 63.76 ! Hook And Kelly Length + real :: HL = 17.81 ! Hook Length + real :: PL = 30.0 ! Pipe Length + real :: SL = 90.0 ! Stand Length + real :: LG = 8.0 ! Limit Gap + real :: SG = 3.0 ! Slips Gap + real :: TG = 4.0 ! Tong Gap + real :: RE = 3.0 ! Release + real :: ECG = 2.3 ! Elevator Connection Gap + + !Apparently Variables + integer :: ElevatorConnection = 0 + integer :: StringUpdate = 0 + integer :: KellyConnection = 0 + + end type OperationScenarioType + + enum, bind(c) + enumerator STRING_UPDATE_NEUTRAL + enumerator STRING_UPDATE_ADD_SINGLE + enumerator STRING_UPDATE_ADD_STAND + enumerator STRING_UPDATE_REMOVE_SINGLE + enumerator STRING_UPDATE_REMOVE_STAND + + enumerator KELLY_CONNECTION_NOTHING + enumerator KELLY_CONNECTION_STRING + enumerator KELLY_CONNECTION_SINGLE + + enumerator ELEVATOR_CONNECTION_NOTHING + enumerator ELEVATOR_CONNECTION_STRING + enumerator ELEVATOR_CONNECTION_STAND + enumerator ELEVATOR_CONNECTION_SINGLE + enumerator ELEVATOR_LATCH_STRING + enumerator ELEVATOR_LATCH_SINGLE + enumerator ELEVATOR_LATCH_STAND + end enum + contains end module COperationScenariosVariables \ No newline at end of file diff --git a/CSharp/OperationScenarios/Common/OperationScenarios.f90 b/CSharp/OperationScenarios/Common/OperationScenarios.f90 index 32d42a1..95aa689 100644 --- a/CSharp/OperationScenarios/Common/OperationScenarios.f90 +++ b/CSharp/OperationScenarios/Common/OperationScenarios.f90 @@ -1,247 +1,263 @@ -module OperationScenariosModule - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! Paseted From ....Variables.f90 - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - ! use OperationScenariosModule ! - ! use OperationScenariosModule !!CElevator... - ! use COperationScenariosVariables - use SimulationVariables - use PermissionsModule - use SoftwareInputsVariables - use CUnityInputs - use CUnityOutputs, only: GetRotaryRpm - use UnitySignalVariables - use UnitySignalsModule - use PermissionsModule - ! use CTdsElevatorModesEnumVariables ! - use CHoistingVariables - use SimulationVariables - use CTopDrivePanelVariables - use SimulationVariables - use NotificationModule - use UnitySignalsModule !for CTdsConnectionModesEnum!!!! - - ! use CTdsTorqueWrenchLedNotificationVariables ! - contains - ! moved from kellyConnectionEnum - subroutine Set_KellyConnection(v) - use CManifolds, Only: KellyConnected, KellyDisconnected - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%OperationScenario%KellyConnection == v) return - #endif - - data%State%OperationScenario%KellyConnection = v - - if(data%State%OperationScenario%KellyConnection /= KELLY_CONNECTION_STRING) then - call KellyDisconnected() - else - call KellyConnected() - endif - - #ifdef deb - print*, 'data%State%OperationScenario%KellyConnection=', data%State%OperationScenario%KellyConnection - #endif - !**call data%State%OperationScenario%OnKellyConnectionChange%RunAll() - end subroutine - - integer function Get_KellyConnection() - implicit none - Get_KellyConnection = data%State%OperationScenario%KellyConnection - end function - - subroutine Evaluate_KellyConnection() - implicit none - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_KellyConnection=TopDrive' -#endif - endif - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_KellyConnection=Kelly' -#endif - - !!OPERATION-CODE=4 - !if (Get_OperationCondition() == OPERATION_DRILL .and.& - ! Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - ! Get_Swing() == SWING_MOUSE_HOLE_END .and.& - ! Get_TongNotification() .and.& - ! Get_FillMouseHoleLed() == .false. .and.& - ! Get_Tong() == TONG_BREAKOUT_END) then - ! - ! call Set_FillMouseHoleLed(.true.) - ! return - !end if - - - - !OPERATION-CODE=1 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - !Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_Tong() == TONG_MAKEUP_END) then - !call Log_4('KELLY_CONNECTION_STRING') - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_STRING) - return - end if - - !OPERATION-CODE=2 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_StringPressure() == 0 .and.& - Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& - Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& - Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_Tong() == TONG_BREAKOUT_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_NOTHING) - call Set_SwingLed(.true.) - return - end if - - - !OPERATION-CODE=3 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - !Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - !Get_TongNotification() .and.& - Get_FillMouseHoleLed() .and.& - Get_Tong() == TONG_MAKEUP_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_SINGLE) - call Set_SwingLed(.false.) - call Set_FillMouseHoleLed(.false.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - return - end if - - - !OPERATION-CODE=4 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - !Get_TongNotification() .and.& - Get_FillMouseHoleLed() == .false. .and.& - Get_Tong() == TONG_BREAKOUT_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_NOTHING) - call Set_FillMouseHoleLed(.true.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - return - end if - - !OPERATION-CODE=5 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - !Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_Tong() == TONG_MAKEUP_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_STRING) - call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) - call Set_SwingLed(.false.) - return - end if - - !OPERATION-CODE=6 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_StringPressure() == 0 .and.& - Get_HookHeight() > 70.0 .and.& - Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& - !Get_TongNotification() .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Tong() == TONG_BREAKOUT_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_KellyConnection(KELLY_CONNECTION_SINGLE) - call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) - return - end if - - endif - - end subroutine - - ! subroutine Subscribe_KellyConnection() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - - ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout) - ! call OnMakeupLeverPress%Add(ButtonPress_Makeup) - ! end subroutine - - subroutine ButtonPress_Breakout() - implicit none -#ifdef deb - print*, 'ButtonPress_Breakout on ======> CKellyConnectionEnum' -#endif - end subroutine - - subroutine ButtonPress_Makeup() - implicit none -#ifdef deb - print*, 'ButtonPress_Makeup on ======> CKellyConnectionEnum' -#endif - end subroutine - - - subroutine Set_StringUpdate(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%OperationScenario%StringUpdate == v) return - #endif - data%State%OperationScenario%StringUpdate = v - !**call data%State%OperationScenario%OnStringUpdateChange%RunAll(v) - end subroutine - - integer function Get_StringUpdate() - implicit none - Get_StringUpdate = data%State%OperationScenario%StringUpdate - end function - - real(8) function TJH() - use TD_DrillStemComponents - implicit none - TJH = data%State%TD_String%TopJointHeight - end function - - real function TL() - implicit none - TL = 26.97 - end function - - real function NFC() - implicit none - NFC = Get_NearFloorConnection() - end function - - - subroutine Set_ElevatorConnection(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%OperationScenario%ElevatorConnection == v) return - #endif - data%State%OperationScenario%ElevatorConnection = v - - #ifdef deb - print*, 'data%State%OperationScenario%ElevatorConnection=', data%State%OperationScenario%ElevatorConnection - #endif - !**call data%State%OperationScenario%OnElevatorConnectionChange%RunAll() - end subroutine - - integer function Get_ElevatorConnection() - implicit none - Get_ElevatorConnection = data%State%OperationScenario%ElevatorConnection - end function - +module OperationScenariosModule + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! Paseted From ....Variables.f90 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ! use OperationScenariosModule ! + ! use OperationScenariosModule !!CElevator... + ! use COperationScenariosVariables + use SimulationVariables + use PermissionsModule + ! use SoftwareInputsVariables + use CUnityInputs + use CUnityOutputs, only: GetRotaryRpm + use UnitySignalVariables + use UnitySignalsModule + use PermissionsModule + ! use CTdsElevatorModesEnumVariables ! + use CHoistingVariables + use CTopDrivePanelVariables + use NotificationModule + use SoftwareInputsModule + + contains + + subroutine OperationScenariosToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'OperationScenarios') + + ! 2. add member of data type to new node + call json%add(p,"ElevatorConnection",data%State%OperationScenario%ElevatorConnection) + call json%add(p,"StringUpdate",data%State%OperationScenario%StringUpdate) + call json%add(p,"KellyConnection",data%State%OperationScenario%KellyConnection) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + ! moved from kellyConnectionEnum + subroutine Set_KellyConnection(v) + use CManifolds, Only: KellyConnected, KellyDisconnected + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%OperationScenario%KellyConnection == v) return + #endif + + data%State%OperationScenario%KellyConnection = v + + if(data%State%OperationScenario%KellyConnection /= KELLY_CONNECTION_STRING) then + call KellyDisconnected() + else + call KellyConnected() + endif + + #ifdef deb + print*, 'data%State%OperationScenario%KellyConnection=', data%State%OperationScenario%KellyConnection + #endif + !**call data%State%OperationScenario%OnKellyConnectionChange%RunAll() + end subroutine + + integer function Get_KellyConnection() + implicit none + Get_KellyConnection = data%State%OperationScenario%KellyConnection + end function + + subroutine Evaluate_KellyConnection() + implicit none + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_KellyConnection=TopDrive' +#endif + endif + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_KellyConnection=Kelly' +#endif + + !!OPERATION-CODE=4 + !if (Get_OperationCondition() == OPERATION_DRILL .and.& + ! Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + ! Get_Swing() == SWING_MOUSE_HOLE_END .and.& + ! Get_TongNotification() .and.& + ! Get_FillMouseHoleLed() == .false. .and.& + ! Get_Tong() == TONG_BREAKOUT_END) then + ! + ! call Set_FillMouseHoleLed(.true.) + ! return + !end if + + + + !OPERATION-CODE=1 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + !Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_Tong() == TONG_MAKEUP_END) then + !call Log_4('KELLY_CONNECTION_STRING') + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_STRING) + return + end if + + !OPERATION-CODE=2 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_StringPressure() == 0 .and.& + Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& + Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& + Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_Tong() == TONG_BREAKOUT_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_NOTHING) + call Set_SwingLed(.true.) + return + end if + + + !OPERATION-CODE=3 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + !Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + !Get_TongNotification() .and.& + Get_FillMouseHoleLed() .and.& + Get_Tong() == TONG_MAKEUP_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_SINGLE) + call Set_SwingLed(.false.) + call Set_FillMouseHoleLed(.false.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + return + end if + + + !OPERATION-CODE=4 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + !Get_TongNotification() .and.& + Get_FillMouseHoleLed() == .false. .and.& + Get_Tong() == TONG_BREAKOUT_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_NOTHING) + call Set_FillMouseHoleLed(.true.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + return + end if + + !OPERATION-CODE=5 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + !Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_Tong() == TONG_MAKEUP_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_STRING) + call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) + call Set_SwingLed(.false.) + return + end if + + !OPERATION-CODE=6 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_StringPressure() == 0 .and.& + Get_HookHeight() > 70.0 .and.& + Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& + !Get_TongNotification() .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Tong() == TONG_BREAKOUT_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_KellyConnection(KELLY_CONNECTION_SINGLE) + call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) + return + end if + + endif + + end subroutine + + ! subroutine Subscribe_KellyConnection() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + + ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout) + ! call OnMakeupLeverPress%Add(ButtonPress_Makeup) + ! end subroutine + + subroutine ButtonPress_Breakout() + implicit none +#ifdef deb + print*, 'ButtonPress_Breakout on ======> CKellyConnectionEnum' +#endif + end subroutine + + subroutine ButtonPress_Makeup() + implicit none +#ifdef deb + print*, 'ButtonPress_Makeup on ======> CKellyConnectionEnum' +#endif + end subroutine + + + subroutine Set_StringUpdate(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%OperationScenario%StringUpdate == v) return + #endif + data%State%OperationScenario%StringUpdate = v + !**call data%State%OperationScenario%OnStringUpdateChange%RunAll(v) + end subroutine + + integer function Get_StringUpdate() + implicit none + Get_StringUpdate = data%State%OperationScenario%StringUpdate + end function + + real(8) function TJH() + use TD_DrillStemComponents + implicit none + TJH = data%State%TD_String%TopJointHeight + end function + + real function TL() + implicit none + TL = 26.97 + end function + + real function NFC() + implicit none + NFC = Get_NearFloorConnection() + end function + + + subroutine Set_ElevatorConnection(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%OperationScenario%ElevatorConnection == v) return + #endif + data%State%OperationScenario%ElevatorConnection = v + + #ifdef deb + print*, 'data%State%OperationScenario%ElevatorConnection=', data%State%OperationScenario%ElevatorConnection + #endif + !**call data%State%OperationScenario%OnElevatorConnectionChange%RunAll() + end subroutine + + integer function Get_ElevatorConnection() + implicit none + Get_ElevatorConnection = data%State%OperationScenario%ElevatorConnection + end function + end module OperationScenariosModule \ No newline at end of file diff --git a/CSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 b/CSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 index 0a4ec4e..ee93cba 100644 --- a/CSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 +++ b/CSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 @@ -1,622 +1,622 @@ -module CElevatorConnectionEnum - use OperationScenariosModule - use CLog3 - use CLog4 - implicit none - contains - - subroutine Evaluate_ElevatorConnection() - use CHoistingVariables - use SimulationVariables - use CCommon, only: SetStandRack - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_ElevatorConnection=TopDrive' -#endif - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ElevatorConnection=Kelly' -#endif - - !!OPERATION-CODE=83 - !if (Get_OperationCondition() == OPERATION_TRIP .and.& - ! Get_ElevatorConnection() == ELEVATOR_LATCH_STRING .and.& - ! Get_ElevatorPickup() .and.& - ! Get_Slips() == SLIPS_SET_END) then - ! !call Log_4('OPERATION-CODE=83') - ! call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) - ! return - !end if - - - - - - - - - - - - - !OPERATION-CODE=78 - if (Get_ElevatorPickup() == .false. .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& - Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then - call Set_ElevatorConnection(ELEVATOR_LATCH_SINGLE) - return - end if - - !OPERATION-CODE=79 - if (Get_ElevatorPickup() == .false. .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SL - data%State%OperationScenario%LG) .and.& - Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then - call Set_ElevatorConnection(ELEVATOR_LATCH_STAND) - return - end if - - - - !OPERATION-CODE=83 - if (Get_ElevatorPickup().and.& - Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE) then - call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) - return - end if - - - !OPERATION-CODE=84 - if (Get_ElevatorPickup().and.& - Get_ElevatorConnection() == ELEVATOR_LATCH_STAND) then - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) - return - end if - - - - - - - - - - - !OPERATION-CODE=7 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !GetRotaryRpm() == 0.0d0 .and.& - !Get_StandRack() > 0 .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_Slips() == SLIPS_SET_END .and.& - !Get_LatchLed() .and. - Get_Elevator() == ELEVATOR_LATCH_STAND_END) then - !call Log_4('OPERATION-CODE=7') - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) - !call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - call SetStandRack(Get_StandRack() - 1) - call Set_Elevator(ELEVATOR_NEUTRAL) - return - end if - - !OPERATION-CODE=8 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& - !GetRotaryRpm() == 0.0d0 .and.& - !Get_StandRack() < 80 .and.& - !Get_ElevatorConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_Slips() == SLIPS_SET_END .and.& - !Get_UnlatchLed() .and.& - Get_Elevator() == ELEVATOR_UNLATCH_STAND_END) then - call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) - !call Set_UnlatchLed(.false.) - !call Set_LatchLed(.true.) - call SetStandRack(Get_StandRack() + 1) - call Set_Elevator(ELEVATOR_NEUTRAL) - !call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) - call Log_3('OPERATION-CODE=8') - return - end if - - !OPERATION-CODE=9 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !Get_HookHeight() >= 18.0 .and. Get_HookHeight() <= 22.0 .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_Slips() == SLIPS_SET_END .and.& - !Get_LatchLed() .and.& - !Get_ElevatorPickup() .and.& - Get_Elevator() == ELEVATOR_LATCH_STRING_END) then - !call Log_4('OPERATION-CODE=9') - call Set_ElevatorConnection(ELEVATOR_LATCH_STRING) - call Set_Elevator(ELEVATOR_NEUTRAL) - !call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - !call Set_UnlatchLed(.false.) - !call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) - return - end if - - !OPERATION-CODE=60 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !Get_HookHeight() <= (HL + Get_NearFloorConnection() - ECG) .and.& - Get_ElevatorPickup() == .false. .and.& - Get_Slips() == SLIPS_SET_END .and.& - !Get_Tong() /= TONG_MAKEUP_END .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then - call Set_ElevatorConnection(ELEVATOR_LATCH_STRING) - !call Set_Elevator(ELEVATOR_NEUTRAL) - return - end if - - !OPERATION-CODE=49 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorPickup() .and.& - Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) - return - end if - - !OPERATION-CODE=10 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !GetRotaryRpm() == 0.0d0 .and.& - (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_Slips() == SLIPS_SET_END .and.& - !Get_UnlatchLed() .and.& - Get_Elevator() == ELEVATOR_UNLATCH_STRING_END) then - !call Log_4('OPERATION-CODE=10') - call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) - call Set_Elevator(ELEVATOR_NEUTRAL) - !call Set_UnlatchLed(.false.) - !call Set_LatchLed(.true.) - !call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) - return - end if - - !OPERATION-CODE=11 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !Get_ElevatorConnectionPossible() .and.& - Get_ElevatorPickup().and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - !Get_Swing() == SWING_MOUSE_HOLE_END .and.& - !Get_LatchLed() .and.& - !Get_FillMouseHoleLed() .and.& - Get_Elevator() == ELEVATOR_LATCH_SINGLE_END) then - - call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) - !call Set_UnlatchLed(.true.) - call Set_FillMouseHoleLed(.false.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - call Set_Elevator(ELEVATOR_NEUTRAL) - !call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) - return - end if - - !OPERATION-CODE=12 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - !Get_Swing() == SWING_MOUSE_HOLE_END .and.& - !Get_UnlatchLed() .and.& - !Get_FillMouseHoleLed() == .false. .and.& - Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END) then - !call Log_4('OPERATION-CODE=12') - call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) - !call Set_UnlatchLed(.false.) - !call Set_LatchLed(.true.) - call Set_FillMouseHoleLed(.true.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - call Set_Elevator(ELEVATOR_NEUTRAL) - !call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) - return - end if - - !OPERATION-CODE=13 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_ElevatorPickup().and.& - Get_Tong() == TONG_BREAKOUT_END) then - !call Log_4('OPERATION-CODE=13') - call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) - call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) - !call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) - call Set_Tong(TONG_NEUTRAL) - return - end if - - !OPERATION-CODE=14 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_ElevatorPickup().and.& - Get_Tong() == TONG_MAKEUP_END) then - !call Log_4('OPERATION-CODE=14') - call Set_Tong(TONG_NEUTRAL) - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) - call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) - return - end if - - - !OPERATION-CODE=15 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SL - data%State%OperationScenario%LG) .and.& - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_ElevatorPickup().and.& - Get_Tong() == TONG_BREAKOUT_END) then - call Set_Tong(TONG_NEUTRAL) - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) - call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) - return - end if - - !OPERATION-CODE=16 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& - !Get_JointConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& - !Get_Swing() == SWING_WELL_END .and.& - !Get_TongNotification() .and.& - Get_ElevatorPickup().and.& - Get_Tong() == TONG_MAKEUP_END) then - !call Log_4('OPERATION-CODE=16') - call Set_Tong(TONG_NEUTRAL) - call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) - call Set_StringUpdate(STRING_UPDATE_ADD_STAND) - return - end if - - - - - - !OPERATION-CODE=75 - if (Get_ElevatorPickup() == .false. .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) then - call Set_ElevatorConnection(ELEVATOR_LATCH_SINGLE) - return - end if - - - !OPERATION-CODE=76 - if (Get_ElevatorPickup() == .false. .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND) then - call Set_ElevatorConnection(ELEVATOR_LATCH_STAND) - return - end if - - - - - - - endif - - - - end subroutine - - ! subroutine Subscribe_ElevatorConnection() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - ! call OnLatchPipePress%Add(ButtonPress_Latch_ElevatorConnection) - ! call OnUnlatchPipePress%Add(ButtonPress_Unlatch_ElevatorConnection) - ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout_ElevatorConnection) - ! call OnMakeupLeverPress%Add(ButtonPress_Makeup_ElevatorConnection) - ! end subroutine - - subroutine ButtonPress_Latch_ElevatorConnection() - use CCommon, only: SetStandRack - implicit none - - - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Latch_ElevatorConnection=TopDrive' -#endif - - - - - !TOPDRIVE-CODE=73 - if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_LatchLed()) then - - call Set_Elevator(ELEVATOR_LATCH_STAND_BEGIN) - call Set_LatchLed(.false.) - return - end if - - - - - - - - !TOPDRIVE-CODE=74 - if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_ElevatorConnectionPossible() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_LatchLed()) then - - call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) - call Set_LatchLed(.false.) - return - end if - - - - - - - - !TOPDRIVE-CODE=75 - if (Get_ElevatorConnectionPossible() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_LatchLed() .and.& - Get_FillMouseHoleLed()) then - - call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) - call Set_LatchLed(.false.) - return - end if - - - - - - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Latch_ElevatorConnection=Kelly' -#endif - - !OPERATION-CODE=86 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_LatchLed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_ElevatorConnectionPossible() .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection())) then - - !call Log_4("OPERATION-CODE=ELEVATOR_LATCH_STRING_BEGIN") - call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) - call Set_LatchLed(.false.) - return - endif - - !OPERATION-CODE=85 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_LatchLed() .and.& - Get_Swing() == SWING_WELL_END) then - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) - - call Set_Elevator(ELEVATOR_LATCH_STAND_BEGIN) - call Set_LatchLed(.false.) - return - endif - - !OPERATION-CODE=87 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_LatchLed() .and.& - Get_FillMouseHoleLed() .and.& - Get_ElevatorConnectionPossible() .and.& - Get_Swing() == SWING_MOUSE_HOLE_END) then - - call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) - call Set_LatchLed(.false.) - return - endif - - - endif - - - - - - - - - - - - - end subroutine - - subroutine ButtonPress_Unlatch_ElevatorConnection() - use CCommon, only: SetStandRack - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Unlatch_ElevatorConnection=TopDrive' -#endif - - - - !TOPDRIVE-CODE=76 - if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_UnlatchLed()) then - - call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) - call Set_UnlatchLed(.false.) - return - end if - - - - - - - - - !TOPDRIVE-CODE=77 - if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_UnlatchLed()) then - - call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) - call Set_UnlatchLed(.false.) - return - end if - - - - - - - - !TOPDRIVE-CODE=78 - if ((Get_HookHeight() > TL() .and. Get_HookHeight() < (TL() + NFC() + data%State%OperationScenario%SG)) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_UnlatchLed() .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) - call Set_UnlatchLed(.false.) - return - end if - - - - - - endif - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Unlatch_ElevatorConnection=Kelly' -#endif - !OPERATION-CODE=89 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& - (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and.& - Get_UnlatchLed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then - !Get_HookHeight() >= (HL + Get_NearFloorConnection() - 4.0) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() - 2.0)) then - - call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) - call Set_UnlatchLed(.false.) - return - endif - - !OPERATION-CODE=88 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& - Get_UnlatchLed() .and.& - Get_Swing() == SWING_WELL_END) then - - call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) - call Set_UnlatchLed(.false.) - return - endif - - !OPERATION-CODE=90 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - Get_UnlatchLed() .and.& - Get_HookHeight() >= data%State%OperationScenario%HL .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SG) .and.& - !Get_JointConnectionPossible() .and.& - Get_Swing() == SWING_MOUSE_HOLE_END) then - - call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) - call Set_UnlatchLed(.false.) - return - endif - - endif - - - - - - - - end subroutine - - subroutine ButtonPress_Breakout_ElevatorConnection() - implicit none - - end subroutine - - subroutine ButtonPress_Makeup_ElevatorConnection() - implicit none - - end subroutine - +module CElevatorConnectionEnum + use OperationScenariosModule + use CLog3 + use CLog4 + implicit none + contains + + subroutine Evaluate_ElevatorConnection() + use CHoistingVariables + use SimulationVariables + use CCommon, only: SetStandRack + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_ElevatorConnection=TopDrive' +#endif + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ElevatorConnection=Kelly' +#endif + + !!OPERATION-CODE=83 + !if (Get_OperationCondition() == OPERATION_TRIP .and.& + ! Get_ElevatorConnection() == ELEVATOR_LATCH_STRING .and.& + ! Get_ElevatorPickup() .and.& + ! Get_Slips() == SLIPS_SET_END) then + ! !call Log_4('OPERATION-CODE=83') + ! call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) + ! return + !end if + + + + + + + + + + + + + !OPERATION-CODE=78 + if (Get_ElevatorPickup() == .false. .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& + Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then + call Set_ElevatorConnection(ELEVATOR_LATCH_SINGLE) + return + end if + + !OPERATION-CODE=79 + if (Get_ElevatorPickup() == .false. .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SL - data%State%OperationScenario%LG) .and.& + Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then + call Set_ElevatorConnection(ELEVATOR_LATCH_STAND) + return + end if + + + + !OPERATION-CODE=83 + if (Get_ElevatorPickup().and.& + Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE) then + call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) + return + end if + + + !OPERATION-CODE=84 + if (Get_ElevatorPickup().and.& + Get_ElevatorConnection() == ELEVATOR_LATCH_STAND) then + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) + return + end if + + + + + + + + + + + !OPERATION-CODE=7 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !GetRotaryRpm() == 0.0d0 .and.& + !Get_StandRack() > 0 .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_Slips() == SLIPS_SET_END .and.& + !Get_LatchLed() .and. + Get_Elevator() == ELEVATOR_LATCH_STAND_END) then + !call Log_4('OPERATION-CODE=7') + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) + !call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + call SetStandRack(Get_StandRack() - 1) + call Set_Elevator(ELEVATOR_NEUTRAL) + return + end if + + !OPERATION-CODE=8 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& + !GetRotaryRpm() == 0.0d0 .and.& + !Get_StandRack() < 80 .and.& + !Get_ElevatorConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_Slips() == SLIPS_SET_END .and.& + !Get_UnlatchLed() .and.& + Get_Elevator() == ELEVATOR_UNLATCH_STAND_END) then + call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) + !call Set_UnlatchLed(.false.) + !call Set_LatchLed(.true.) + call SetStandRack(Get_StandRack() + 1) + call Set_Elevator(ELEVATOR_NEUTRAL) + !call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) + call Log_3('OPERATION-CODE=8') + return + end if + + !OPERATION-CODE=9 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !Get_HookHeight() >= 18.0 .and. Get_HookHeight() <= 22.0 .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_Slips() == SLIPS_SET_END .and.& + !Get_LatchLed() .and.& + !Get_ElevatorPickup() .and.& + Get_Elevator() == ELEVATOR_LATCH_STRING_END) then + !call Log_4('OPERATION-CODE=9') + call Set_ElevatorConnection(ELEVATOR_LATCH_STRING) + call Set_Elevator(ELEVATOR_NEUTRAL) + !call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + !call Set_UnlatchLed(.false.) + !call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) + return + end if + + !OPERATION-CODE=60 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !Get_HookHeight() <= (HL + Get_NearFloorConnection() - ECG) .and.& + Get_ElevatorPickup() == .false. .and.& + Get_Slips() == SLIPS_SET_END .and.& + !Get_Tong() /= TONG_MAKEUP_END .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then + call Set_ElevatorConnection(ELEVATOR_LATCH_STRING) + !call Set_Elevator(ELEVATOR_NEUTRAL) + return + end if + + !OPERATION-CODE=49 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorPickup() .and.& + Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) + return + end if + + !OPERATION-CODE=10 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !GetRotaryRpm() == 0.0d0 .and.& + (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_Slips() == SLIPS_SET_END .and.& + !Get_UnlatchLed() .and.& + Get_Elevator() == ELEVATOR_UNLATCH_STRING_END) then + !call Log_4('OPERATION-CODE=10') + call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) + call Set_Elevator(ELEVATOR_NEUTRAL) + !call Set_UnlatchLed(.false.) + !call Set_LatchLed(.true.) + !call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) + return + end if + + !OPERATION-CODE=11 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !Get_ElevatorConnectionPossible() .and.& + Get_ElevatorPickup().and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + !Get_Swing() == SWING_MOUSE_HOLE_END .and.& + !Get_LatchLed() .and.& + !Get_FillMouseHoleLed() .and.& + Get_Elevator() == ELEVATOR_LATCH_SINGLE_END) then + + call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) + !call Set_UnlatchLed(.true.) + call Set_FillMouseHoleLed(.false.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + call Set_Elevator(ELEVATOR_NEUTRAL) + !call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) + return + end if + + !OPERATION-CODE=12 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + !Get_Swing() == SWING_MOUSE_HOLE_END .and.& + !Get_UnlatchLed() .and.& + !Get_FillMouseHoleLed() == .false. .and.& + Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END) then + !call Log_4('OPERATION-CODE=12') + call Set_ElevatorConnection(ELEVATOR_CONNECTION_NOTHING) + !call Set_UnlatchLed(.false.) + !call Set_LatchLed(.true.) + call Set_FillMouseHoleLed(.true.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + call Set_Elevator(ELEVATOR_NEUTRAL) + !call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) + return + end if + + !OPERATION-CODE=13 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_ElevatorPickup().and.& + Get_Tong() == TONG_BREAKOUT_END) then + !call Log_4('OPERATION-CODE=13') + call Set_ElevatorConnection(ELEVATOR_CONNECTION_SINGLE) + call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) + !call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) + call Set_Tong(TONG_NEUTRAL) + return + end if + + !OPERATION-CODE=14 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_ElevatorPickup().and.& + Get_Tong() == TONG_MAKEUP_END) then + !call Log_4('OPERATION-CODE=14') + call Set_Tong(TONG_NEUTRAL) + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) + call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) + return + end if + + + !OPERATION-CODE=15 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SL - data%State%OperationScenario%LG) .and.& + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_ElevatorPickup().and.& + Get_Tong() == TONG_BREAKOUT_END) then + call Set_Tong(TONG_NEUTRAL) + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STAND) + call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) + return + end if + + !OPERATION-CODE=16 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL - RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& + !Get_JointConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& + !Get_Swing() == SWING_WELL_END .and.& + !Get_TongNotification() .and.& + Get_ElevatorPickup().and.& + Get_Tong() == TONG_MAKEUP_END) then + !call Log_4('OPERATION-CODE=16') + call Set_Tong(TONG_NEUTRAL) + call Set_ElevatorConnection(ELEVATOR_CONNECTION_STRING) + call Set_StringUpdate(STRING_UPDATE_ADD_STAND) + return + end if + + + + + + !OPERATION-CODE=75 + if (Get_ElevatorPickup() == .false. .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) then + call Set_ElevatorConnection(ELEVATOR_LATCH_SINGLE) + return + end if + + + !OPERATION-CODE=76 + if (Get_ElevatorPickup() == .false. .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND) then + call Set_ElevatorConnection(ELEVATOR_LATCH_STAND) + return + end if + + + + + + + endif + + + + end subroutine + + ! subroutine Subscribe_ElevatorConnection() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + ! call OnLatchPipePress%Add(ButtonPress_Latch_ElevatorConnection) + ! call OnUnlatchPipePress%Add(ButtonPress_Unlatch_ElevatorConnection) + ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout_ElevatorConnection) + ! call OnMakeupLeverPress%Add(ButtonPress_Makeup_ElevatorConnection) + ! end subroutine + + subroutine ButtonPress_Latch_ElevatorConnection() + use CCommon, only: SetStandRack + implicit none + + + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Latch_ElevatorConnection=TopDrive' +#endif + + + + + !TOPDRIVE-CODE=73 + if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_LatchLed()) then + + call Set_Elevator(ELEVATOR_LATCH_STAND_BEGIN) + call Set_LatchLed(.false.) + return + end if + + + + + + + + !TOPDRIVE-CODE=74 + if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_ElevatorConnectionPossible() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_LatchLed()) then + + call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) + call Set_LatchLed(.false.) + return + end if + + + + + + + + !TOPDRIVE-CODE=75 + if (Get_ElevatorConnectionPossible() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_LatchLed() .and.& + Get_FillMouseHoleLed()) then + + call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) + call Set_LatchLed(.false.) + return + end if + + + + + + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Latch_ElevatorConnection=Kelly' +#endif + + !OPERATION-CODE=86 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_LatchLed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_ElevatorConnectionPossible() .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection())) then + + !call Log_4("OPERATION-CODE=ELEVATOR_LATCH_STRING_BEGIN") + call Set_Elevator(ELEVATOR_LATCH_STRING_BEGIN) + call Set_LatchLed(.false.) + return + endif + + !OPERATION-CODE=85 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_LatchLed() .and.& + Get_Swing() == SWING_WELL_END) then + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) + + call Set_Elevator(ELEVATOR_LATCH_STAND_BEGIN) + call Set_LatchLed(.false.) + return + endif + + !OPERATION-CODE=87 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_LatchLed() .and.& + Get_FillMouseHoleLed() .and.& + Get_ElevatorConnectionPossible() .and.& + Get_Swing() == SWING_MOUSE_HOLE_END) then + + call Set_Elevator(ELEVATOR_LATCH_SINGLE_BEGIN) + call Set_LatchLed(.false.) + return + endif + + + endif + + + + + + + + + + + + + end subroutine + + subroutine ButtonPress_Unlatch_ElevatorConnection() + use CCommon, only: SetStandRack + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Unlatch_ElevatorConnection=TopDrive' +#endif + + + + !TOPDRIVE-CODE=76 + if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_UnlatchLed()) then + + call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) + call Set_UnlatchLed(.false.) + return + end if + + + + + + + + + !TOPDRIVE-CODE=77 + if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_UnlatchLed()) then + + call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) + call Set_UnlatchLed(.false.) + return + end if + + + + + + + + !TOPDRIVE-CODE=78 + if ((Get_HookHeight() > TL() .and. Get_HookHeight() < (TL() + NFC() + data%State%OperationScenario%SG)) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_UnlatchLed() .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) + call Set_UnlatchLed(.false.) + return + end if + + + + + + endif + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Unlatch_ElevatorConnection=Kelly' +#endif + !OPERATION-CODE=89 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& + (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and.& + Get_UnlatchLed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then + !Get_HookHeight() >= (HL + Get_NearFloorConnection() - 4.0) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() - 2.0)) then + + call Set_Elevator(ELEVATOR_UNLATCH_STRING_BEGIN) + call Set_UnlatchLed(.false.) + return + endif + + !OPERATION-CODE=88 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& + Get_UnlatchLed() .and.& + Get_Swing() == SWING_WELL_END) then + + call Set_Elevator(ELEVATOR_UNLATCH_STAND_BEGIN) + call Set_UnlatchLed(.false.) + return + endif + + !OPERATION-CODE=90 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + Get_UnlatchLed() .and.& + Get_HookHeight() >= data%State%OperationScenario%HL .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SG) .and.& + !Get_JointConnectionPossible() .and.& + Get_Swing() == SWING_MOUSE_HOLE_END) then + + call Set_Elevator(ELEVATOR_UNLATCH_SINGLE_BEGIN) + call Set_UnlatchLed(.false.) + return + endif + + endif + + + + + + + + end subroutine + + subroutine ButtonPress_Breakout_ElevatorConnection() + implicit none + + end subroutine + + subroutine ButtonPress_Makeup_ElevatorConnection() + implicit none + + end subroutine + end module CElevatorConnectionEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 b/CSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 index b4fb7e9..8de0e93 100644 --- a/CSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 +++ b/CSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 @@ -1,332 +1,332 @@ -module CTdsElevatorModesEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_TdsElevatorModes() - use CCommon, only: SetStandRack - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsElevatorModes=TopDrive' -#endif - - - !TOPDRIVE-CODE=7 - if (Get_Elevator() == ELEVATOR_LATCH_STRING_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END ) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) - call Set_Elevator(ELEVATOR_NEUTRAL) - return - end if - - - - !TOPDRIVE-CODE=8 - if (Get_HookHeight() <= (TL() + TJH() - data%State%OperationScenario%ECG) .and.& - Get_ElevatorPickup() == .false. .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) - return - end if - - - - !TOPDRIVE-CODE=9 - if (Get_ElevatorPickup() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) - return - end if - - - !TOPDRIVE-CODE=10 - if (Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) - call Set_Elevator(ELEVATOR_NEUTRAL) - return - end if - - - - - !TOPDRIVE-CODE=11 - if (Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_STRING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) - call Set_Elevator(ELEVATOR_NEUTRAL) - return - end if - - - - - - !TOPDRIVE-CODE=12 - if (Get_Elevator() == ELEVATOR_LATCH_STAND_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) - call Set_Elevator(ELEVATOR_NEUTRAL) - call SetStandRack(Get_StandRack() - 1) - return - end if - - - - - !TOPDRIVE-CODE=13 - if (Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) - call Set_Elevator(ELEVATOR_NEUTRAL) - call SetStandRack(Get_StandRack() + 1) - return - end if - - - - - !TOPDRIVE-CODE=14 - if (Get_Elevator() == ELEVATOR_LATCH_SINGLE_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_FillMouseHoleLed()) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) - call Set_Elevator(ELEVATOR_NEUTRAL) - call Set_UnlatchLed(.true.) - call Set_FillMouseHoleLed(.false.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - return - end if - - - - - - !TOPDRIVE-CODE=15 - if (Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) - call Set_Elevator(ELEVATOR_NEUTRAL) - call Set_UnlatchLed(.false.) - call Set_FillMouseHoleLed(.true.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - return - end if - - - - !TOPDRIVE-CODE=16 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_SINGLE) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) - return - end if - - - - - !TOPDRIVE-CODE=17 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) - return - end if - - - - !TOPDRIVE-CODE=18 - if (Get_ElevatorPickup() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) - return - end if - - - - - !TOPDRIVE-CODE=19 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_ElevatorPickup() == .false. .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_SINGLE) - - return - end if - - - - - - - !TOPDRIVE-CODE=20 - if (Get_Tong() == TONG_MAKEUP_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) - return - end if - - - - - !TOPDRIVE-CODE=21 - if (Get_Tong() == TONG_MAKEUP_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) - return - end if - - - - !TOPDRIVE-CODE=22 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STAND) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) - return - end if - - - - !TOPDRIVE-CODE=23 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& - Get_Tong() == TONG_BREAKOUT_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) - return - end if - - - - !TOPDRIVE-CODE=24 - if (Get_ElevatorPickup() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) - return - end if - - - - - - !TOPDRIVE-CODE=25 - if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& - Get_ElevatorPickup() == .false. .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STAND) - return - end if - - - - - !TOPDRIVE-CODE=26 - if (Get_Tong() == TONG_MAKEUP_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_ADD_STAND) - return - end if - - - - - - - - - - !TOPDRIVE-CODE=27 - if (Get_Tong() == TONG_MAKEUP_END .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND) then - - call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) - call Set_Tong(TONG_NEUTRAL) - call Set_StringUpdate(STRING_UPDATE_ADD_STAND) - return - end if - - - - - - - - - - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsElevatorModes=Kelly' -#endif - endif - - - - - end subroutine - - subroutine Subscribe_TdsElevatorModes() - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - end subroutine - +module CTdsElevatorModesEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_TdsElevatorModes() + use CCommon, only: SetStandRack + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsElevatorModes=TopDrive' +#endif + + + !TOPDRIVE-CODE=7 + if (Get_Elevator() == ELEVATOR_LATCH_STRING_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END ) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) + call Set_Elevator(ELEVATOR_NEUTRAL) + return + end if + + + + !TOPDRIVE-CODE=8 + if (Get_HookHeight() <= (TL() + TJH() - data%State%OperationScenario%ECG) .and.& + Get_ElevatorPickup() == .false. .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) + return + end if + + + + !TOPDRIVE-CODE=9 + if (Get_ElevatorPickup() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) + return + end if + + + !TOPDRIVE-CODE=10 + if (Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) + call Set_Elevator(ELEVATOR_NEUTRAL) + return + end if + + + + + !TOPDRIVE-CODE=11 + if (Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_STRING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) + call Set_Elevator(ELEVATOR_NEUTRAL) + return + end if + + + + + + !TOPDRIVE-CODE=12 + if (Get_Elevator() == ELEVATOR_LATCH_STAND_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) + call Set_Elevator(ELEVATOR_NEUTRAL) + call SetStandRack(Get_StandRack() - 1) + return + end if + + + + + !TOPDRIVE-CODE=13 + if (Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) + call Set_Elevator(ELEVATOR_NEUTRAL) + call SetStandRack(Get_StandRack() + 1) + return + end if + + + + + !TOPDRIVE-CODE=14 + if (Get_Elevator() == ELEVATOR_LATCH_SINGLE_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_FillMouseHoleLed()) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) + call Set_Elevator(ELEVATOR_NEUTRAL) + call Set_UnlatchLed(.true.) + call Set_FillMouseHoleLed(.false.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + return + end if + + + + + + !TOPDRIVE-CODE=15 + if (Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_NOTHING) + call Set_Elevator(ELEVATOR_NEUTRAL) + call Set_UnlatchLed(.false.) + call Set_FillMouseHoleLed(.true.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + return + end if + + + + !TOPDRIVE-CODE=16 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_SINGLE) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) + return + end if + + + + + !TOPDRIVE-CODE=17 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_REMOVE_SINGLE) + return + end if + + + + !TOPDRIVE-CODE=18 + if (Get_ElevatorPickup() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_SINGLE) + return + end if + + + + + !TOPDRIVE-CODE=19 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_ElevatorPickup() == .false. .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_SINGLE) + + return + end if + + + + + + + !TOPDRIVE-CODE=20 + if (Get_Tong() == TONG_MAKEUP_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) + return + end if + + + + + !TOPDRIVE-CODE=21 + if (Get_Tong() == TONG_MAKEUP_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_ADD_SINGLE) + return + end if + + + + !TOPDRIVE-CODE=22 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STAND) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) + return + end if + + + + !TOPDRIVE-CODE=23 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& + Get_Tong() == TONG_BREAKOUT_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_REMOVE_STAND) + return + end if + + + + !TOPDRIVE-CODE=24 + if (Get_ElevatorPickup() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STAND) + return + end if + + + + + + !TOPDRIVE-CODE=25 + if (Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG) .and.& + Get_ElevatorPickup() == .false. .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STAND) + return + end if + + + + + !TOPDRIVE-CODE=26 + if (Get_Tong() == TONG_MAKEUP_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_CONNECTION_STRING) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_ADD_STAND) + return + end if + + + + + + + + + + !TOPDRIVE-CODE=27 + if (Get_Tong() == TONG_MAKEUP_END .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND) then + + call Set_TdsElevatorModes(TDS_ELEVATOR_LATCH_STRING) + call Set_Tong(TONG_NEUTRAL) + call Set_StringUpdate(STRING_UPDATE_ADD_STAND) + return + end if + + + + + + + + + + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsElevatorModes=Kelly' +#endif + endif + + + + + end subroutine + + subroutine Subscribe_TdsElevatorModes() + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + end subroutine + end module CTdsElevatorModesEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 index d7f0b73..da9e94d 100644 --- a/CSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 @@ -1,76 +1,76 @@ -module CCloseKellyCockLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_CloseKellyCockLed() - implicit none - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_CloseKellyCockLed=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_CloseKellyCockLed=Kelly' -!#endif -! endif - - - end subroutine - - ! subroutine Subscribe_CloseKellyCockLed() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - ! call OnCloseKellyCockPress%Add(ButtonPress_CloseKellyCock) - ! end subroutine - - subroutine ButtonPress_CloseKellyCock() - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_CloseKellyCockLed=TopDrive' -#endif - endif - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_CloseKellyCockLed=Kelly' -#endif - - !OPERATION-CODE=66 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_CloseKellyCockLed() == .false. .and.& - Get_OpenKellyCockLed()) then - call Set_OpenKellyCockLed(.false.) - call Set_CloseKellyCockLed(.true.) - return - end if - - - endif - - - - - - - end subroutine - +module CCloseKellyCockLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_CloseKellyCockLed() + implicit none + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_CloseKellyCockLed=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_CloseKellyCockLed=Kelly' +!#endif +! endif + + + end subroutine + + ! subroutine Subscribe_CloseKellyCockLed() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + ! call OnCloseKellyCockPress%Add(ButtonPress_CloseKellyCock) + ! end subroutine + + subroutine ButtonPress_CloseKellyCock() + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_CloseKellyCockLed=TopDrive' +#endif + endif + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_CloseKellyCockLed=Kelly' +#endif + + !OPERATION-CODE=66 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_CloseKellyCockLed() == .false. .and.& + Get_OpenKellyCockLed()) then + call Set_OpenKellyCockLed(.false.) + call Set_CloseKellyCockLed(.true.) + return + end if + + + endif + + + + + + + end subroutine + end module CCloseKellyCockLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 index d4e4db1..4f7d4f9 100644 --- a/CSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 @@ -1,111 +1,111 @@ -module CCloseSafetyValveLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_CloseSafetyValveLed() - implicit none - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_CloseSafetyValveLed=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_CloseSafetyValveLed=Kelly' -!#endif -! endif - - - end subroutine - - ! subroutine Subscribe_CloseSafetyValveLed() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - ! call OnCloseSafetyValvePress%Add(ButtonPress_CloseSafetyValve) - ! call OnOperationConditionChangeInt%Add(Set_Operation_CloseSafetyValveLed) - ! end subroutine - - subroutine Set_Operation_CloseSafetyValveLed(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%notifications%operation_CloseSafetyValveLed == v) return -#endif - data%State%notifications%operation_CloseSafetyValveLed = v -#ifdef deb - print*, 'operation_CloseSafetyValveLed=', data%State%notifications%operation_CloseSafetyValveLed -#endif - end subroutine - - subroutine ButtonPress_CloseSafetyValve() - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_CloseSafetyValveLed=TopDrive' -#endif - - - !TOPDRIVE-CODE=57 - if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& - Get_CloseSafetyValveLed() == .false. .and.& - Get_OpenSafetyValveLed()) then - - call Set_OpenSafetyValveLed(.false.) - call Set_CloseSafetyValveLed(.true.) - return - end if - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_CloseSafetyValveLed=Kelly' -#endif - - !OPERATION-CODE=59 - if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& - Get_CloseSafetyValveLed() == .false. .and.& - Get_OpenSafetyValveLed()) then - call Set_OpenSafetyValveLed(.false.) - call Set_CloseSafetyValveLed(.true.) - return - end if - - - endif - - - - - - - end subroutine - +module CCloseSafetyValveLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_CloseSafetyValveLed() + implicit none + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_CloseSafetyValveLed=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_CloseSafetyValveLed=Kelly' +!#endif +! endif + + + end subroutine + + ! subroutine Subscribe_CloseSafetyValveLed() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + ! call OnCloseSafetyValvePress%Add(ButtonPress_CloseSafetyValve) + ! call OnOperationConditionChangeInt%Add(Set_Operation_CloseSafetyValveLed) + ! end subroutine + + subroutine Set_Operation_CloseSafetyValveLed(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%notifications%operation_CloseSafetyValveLed == v) return +#endif + data%State%notifications%operation_CloseSafetyValveLed = v +#ifdef deb + print*, 'operation_CloseSafetyValveLed=', data%State%notifications%operation_CloseSafetyValveLed +#endif + end subroutine + + subroutine ButtonPress_CloseSafetyValve() + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_CloseSafetyValveLed=TopDrive' +#endif + + + !TOPDRIVE-CODE=57 + if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& + Get_CloseSafetyValveLed() == .false. .and.& + Get_OpenSafetyValveLed()) then + + call Set_OpenSafetyValveLed(.false.) + call Set_CloseSafetyValveLed(.true.) + return + end if + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_CloseSafetyValveLed=Kelly' +#endif + + !OPERATION-CODE=59 + if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& + Get_CloseSafetyValveLed() == .false. .and.& + Get_OpenSafetyValveLed()) then + call Set_OpenSafetyValveLed(.false.) + call Set_CloseSafetyValveLed(.true.) + return + end if + + + endif + + + + + + + end subroutine + end module CCloseSafetyValveLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 index 8ca2565..ef066bd 100644 --- a/CSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 @@ -1,61 +1,61 @@ -module CFillMouseHoleLedNotification - use OperationScenariosModule - use NotificationModule - implicit none - contains - - subroutine Evaluate_FillMouseHoleLed() - implicit none - - end subroutine - - subroutine ButtonPress_FillMouseHole() - ! use OperationScenariosModule - use UnitySignalsModule - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then - - !TOPDRIVE-CODE=71 - if (Get_FillMouseHoleLed()) then - - call Set_FillMouseHoleLed(.false.) - call Set_MouseHole(MOUSE_HOLE_NEUTRAL) - return - end if - - - !TOPDRIVE-CODE=72 - if (Get_TdsElevatorModes() /= TDS_ELEVATOR_CONNECTION_STRING .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_FillMouseHoleLed(.true.) - return - end if - - endif - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then - - - !OPERATION-CODE=81 - if (Get_FillMouseHoleLed()) then - call Set_FillMouseHoleLed(.false.) - call Set_MouseHole(MOUSE_HOLE_EMPTY) - return - end if - - !OPERATION-CODE=82 - if (Get_KellyConnection() /= KELLY_CONNECTION_SINGLE .and.& - Get_ElevatorConnection() /= ELEVATOR_CONNECTION_SINGLE .and.& - Get_FillMouseHoleLed() == .false.) then - call Set_FillMouseHoleLed(.true.) - call Set_MouseHole(MOUSE_HOLE_FILL) - return - end if - - endif - - end subroutine - +module CFillMouseHoleLedNotification + use OperationScenariosModule + use NotificationModule + implicit none + contains + + subroutine Evaluate_FillMouseHoleLed() + implicit none + + end subroutine + + subroutine ButtonPress_FillMouseHole() + ! use OperationScenariosModule + use UnitySignalsModule + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then + + !TOPDRIVE-CODE=71 + if (Get_FillMouseHoleLed()) then + + call Set_FillMouseHoleLed(.false.) + call Set_MouseHole(MOUSE_HOLE_NEUTRAL) + return + end if + + + !TOPDRIVE-CODE=72 + if (Get_TdsElevatorModes() /= TDS_ELEVATOR_CONNECTION_STRING .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_FillMouseHoleLed(.true.) + return + end if + + endif + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then + + + !OPERATION-CODE=81 + if (Get_FillMouseHoleLed()) then + call Set_FillMouseHoleLed(.false.) + call Set_MouseHole(MOUSE_HOLE_EMPTY) + return + end if + + !OPERATION-CODE=82 + if (Get_KellyConnection() /= KELLY_CONNECTION_SINGLE .and.& + Get_ElevatorConnection() /= ELEVATOR_CONNECTION_SINGLE .and.& + Get_FillMouseHoleLed() == .false.) then + call Set_FillMouseHoleLed(.true.) + call Set_MouseHole(MOUSE_HOLE_FILL) + return + end if + + endif + + end subroutine + end module CFillMouseHoleLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 index 9e50159..846ec14 100644 --- a/CSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 @@ -1,120 +1,120 @@ -module CIrIBopLedNotification - use OperationScenariosModule - ! use CTopDrivePanelVariables - use SimulationVariables - implicit none - contains - - subroutine Evaluate_IrIBopLed() - implicit none - - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_IrIBopLed=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_IrIBopLed=Kelly' -!#endif -! endif - - - - - end subroutine - - ! subroutine Subscribe_IrIBopLed() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - ! call OnIRIBopPress%Add(ButtonPress_IrIBop) - ! end subroutine - - subroutine ButtonPress_IrIBop() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IrIBopLed=TopDrive' -#endif - - - - !TOPDRIVE-CODE=59 - if (Get_IrIbopPermission() .and.& - Get_IrIBopLed() == .false.) then - - call Set_IrIBopLed(.true.) - return - end if - - - - - !TOPDRIVE-CODE=60 - if (Get_IrIbopPermission() .and.& - Get_IrIBopLed() == .true. .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF) then - - call Set_IrIBopLed(.false.) - return - end if - - - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_IrIBopLed=Kelly' -#endif - - !OPERATION-CODE=63 - if (Get_IrIbopPermission() .and.& - Get_IrIBopLed() == .false.) then - call Set_IrIBopLed(.true.) - return - end if - - - !OPERATION-CODE=64 - if (Get_IrIbopPermission() .and.& - Get_IrIBopLed()) then - call Set_IrIBopLed(.false.) - return - end if - - endif - - - - - - - - end subroutine - +module CIrIBopLedNotification + use OperationScenariosModule + ! use CTopDrivePanelVariables + use SimulationVariables + implicit none + contains + + subroutine Evaluate_IrIBopLed() + implicit none + + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_IrIBopLed=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_IrIBopLed=Kelly' +!#endif +! endif + + + + + end subroutine + + ! subroutine Subscribe_IrIBopLed() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + ! call OnIRIBopPress%Add(ButtonPress_IrIBop) + ! end subroutine + + subroutine ButtonPress_IrIBop() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_IrIBopLed=TopDrive' +#endif + + + + !TOPDRIVE-CODE=59 + if (Get_IrIbopPermission() .and.& + Get_IrIBopLed() == .false.) then + + call Set_IrIBopLed(.true.) + return + end if + + + + + !TOPDRIVE-CODE=60 + if (Get_IrIbopPermission() .and.& + Get_IrIBopLed() == .true. .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF) then + + call Set_IrIBopLed(.false.) + return + end if + + + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_IrIBopLed=Kelly' +#endif + + !OPERATION-CODE=63 + if (Get_IrIbopPermission() .and.& + Get_IrIBopLed() == .false.) then + call Set_IrIBopLed(.true.) + return + end if + + + !OPERATION-CODE=64 + if (Get_IrIbopPermission() .and.& + Get_IrIBopLed()) then + call Set_IrIBopLed(.false.) + return + end if + + endif + + + + + + + + end subroutine + end module CIrIBopLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 index 207e153..4da3317 100644 --- a/CSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 @@ -1,164 +1,164 @@ -module CIrSafetyValveLedNotification - use OperationScenariosModule - !use UnitySignalsModuleVariables - implicit none - contains - - subroutine Evaluate_IrSafetyValveLed() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValveLed=TopDrive' -#endif - - - - - - - - - endif - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValveLed=Kelly' -#endif - - !OPERATION-CODE=56 - if (Get_OperationCondition() == OPERATION_DRILL) then - call Set_IrSafetyValveLed(.true.) - return - end if - - - - - !call Set_IrSafetyValveLed(.false.) - - endif - - - - - - - - - - - - - end subroutine - - ! subroutine Subscribe_IrSafetyValveLed() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - ! call OnIRSafetyValvePress%Add(ButtonPress_IrSafetyValve) - ! call OnOperationConditionChangeInt%Add(Set_Operation_IrSafetyValveLed) - ! end subroutine - - subroutine Set_Operation_IrSafetyValveLed(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%notifications%operation_IrSafetyValveLed == v) return -#endif - data%State%notifications%operation_IrSafetyValveLed = v -#ifdef deb - print*, 'operation_IrSafetyValveLed=', data%State%notifications%operation_IrSafetyValveLed -#endif - end subroutine - - subroutine ButtonPress_IrSafetyValve() - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValveLed=TopDrive' -#endif - - - - !TOPDRIVE-CODE=53 - if (Get_IrSafetyValvePermission() .and.& - Get_IrSafetyValveLed()) then - - call Set_IrSafetyValveLed(.false.) - return - end if - - - - - - - - - !TOPDRIVE-CODE=54 - if (Get_IrSafetyValvePermission() .and.& - Get_IrSafetyValveLed() == .false.) then - - call Set_IrSafetyValveLed(.true.) - return - end if - - - endif - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValveLed=Kelly' -#endif - - !OPERATION-CODE=54 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_IrSafetyValvePermission() .and.& - Get_IrSafetyValveLed()) then - call Set_IrSafetyValveLed(.false.) - return - end if - - - !OPERATION-CODE=55 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_IrSafetyValvePermission() .and.& - Get_IrSafetyValveLed() == .false. ) then - call Set_IrSafetyValveLed(.true.) - return - end if - - endif - - - - - - - - - end subroutine - +module CIrSafetyValveLedNotification + use OperationScenariosModule + !use UnitySignalsModuleVariables + implicit none + contains + + subroutine Evaluate_IrSafetyValveLed() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValveLed=TopDrive' +#endif + + + + + + + + + endif + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValveLed=Kelly' +#endif + + !OPERATION-CODE=56 + if (Get_OperationCondition() == OPERATION_DRILL) then + call Set_IrSafetyValveLed(.true.) + return + end if + + + + + !call Set_IrSafetyValveLed(.false.) + + endif + + + + + + + + + + + + + end subroutine + + ! subroutine Subscribe_IrSafetyValveLed() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + ! call OnIRSafetyValvePress%Add(ButtonPress_IrSafetyValve) + ! call OnOperationConditionChangeInt%Add(Set_Operation_IrSafetyValveLed) + ! end subroutine + + subroutine Set_Operation_IrSafetyValveLed(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%notifications%operation_IrSafetyValveLed == v) return +#endif + data%State%notifications%operation_IrSafetyValveLed = v +#ifdef deb + print*, 'operation_IrSafetyValveLed=', data%State%notifications%operation_IrSafetyValveLed +#endif + end subroutine + + subroutine ButtonPress_IrSafetyValve() + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValveLed=TopDrive' +#endif + + + + !TOPDRIVE-CODE=53 + if (Get_IrSafetyValvePermission() .and.& + Get_IrSafetyValveLed()) then + + call Set_IrSafetyValveLed(.false.) + return + end if + + + + + + + + + !TOPDRIVE-CODE=54 + if (Get_IrSafetyValvePermission() .and.& + Get_IrSafetyValveLed() == .false.) then + + call Set_IrSafetyValveLed(.true.) + return + end if + + + endif + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValveLed=Kelly' +#endif + + !OPERATION-CODE=54 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_IrSafetyValvePermission() .and.& + Get_IrSafetyValveLed()) then + call Set_IrSafetyValveLed(.false.) + return + end if + + + !OPERATION-CODE=55 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_IrSafetyValvePermission() .and.& + Get_IrSafetyValveLed() == .false. ) then + call Set_IrSafetyValveLed(.true.) + return + end if + + endif + + + + + + + + + end subroutine + end module CIrSafetyValveLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 index 7413642..358f45e 100644 --- a/CSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 @@ -1,251 +1,251 @@ -module CLatchLedNotification - use OperationScenariosModule - use CLog4 - implicit none - contains - - subroutine Evaluate_LatchLed() - use CCommon - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_LatchLed=TopDrive' -#endif - - - !TOPDRIVE-CODE=44 - if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& - Get_ElevatorConnectionPossible() .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_LatchLed(.true.) - return - end if - - - - - - - - !TOPDRIVE-CODE=45 - if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& - GetStandRack() > 0 .and.& - Get_JointConnectionPossible() == .false. .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_LatchLed(.true.) - return - end if - - - - - - - !TOPDRIVE-CODE=46 - if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& - Get_ElevatorConnectionPossible() .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_FillMouseHoleLed()) then - - call Set_LatchLed(.true.) - return - end if - - - - - - - - - - - - - - - - - - - - endif - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_LatchLed=Kelly' -#endif - - !OPERATION-CODE=36 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& - Get_ElevatorConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& - !Get_UnlatchLed() .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - !call Log_4("OPERATION-CODE=36") - call Set_LatchLed(.true.) - !call Set_UnlatchLed(.false.) - return - end if - - - !OPERATION-CODE=37 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_StandRack() > 0 .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& - Get_ElevatorConnectionPossible() == .false. .and.& - !Get_UnlatchLed() .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - !call Log_4("OPERATION-CODE=37") - call Set_LatchLed(.true.) - !call Set_UnlatchLed(.false.) - return - end if - - - - - - - - - - - - - - !OPERATION-CODE=38 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& - !Get_UnlatchLed() .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - Get_FillMouseHoleLed()) then - - !call Log_4("OPERATION-CODE=38") - call Set_LatchLed(.true.) - !call Set_UnlatchLed(.false.) - return - end if - - - - - - - !OPERATION-CODE=39 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= 27.41 .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_UnlatchLed() .and.& - Get_Swing() == SWING_RAT_HOLE_END) then - - !call Log_4("OPERATION-CODE=39") - call Set_LatchLed(.true.) - !call Set_UnlatchLed(.false.) - return - end if - - - - call Set_LatchLed(.false.) - - endif - - - - - - - - end subroutine - - ! subroutine Subscribe_LatchLed() - ! use UnitySignalsModuleVariables - ! use CStandRack - ! use CUnityInputs, OnElevatorConnectionChangePosibility => OnElevatorConnectionPossibleChange - ! use CSwingEnumVariables - ! use CSlipsEnumVariables - ! use CFillMouseHoleLedNotificationVariables - ! implicit none - - ! call OnOperationConditionChange%Add(Evaluate_LatchLed) - ! call OnStandRackChanged%Add(Evaluate_LatchLed) - ! call OnElevatorConnectionChangePosibility%Add(Evaluate_LatchLed) - ! call OnElevatorPickupChange%Add(Evaluate_LatchLed) - ! call OnNearFloorPositionChange%Add(Evaluate_LatchLed) - ! call OnSwingChange%Add(Evaluate_LatchLed) - ! call OnSlipsChange%Add(Evaluate_LatchLed) - ! call OnFillMouseHoleLedChange%Add(Evaluate_LatchLed) - - - ! end subroutine - +module CLatchLedNotification + use OperationScenariosModule + use CLog4 + implicit none + contains + + subroutine Evaluate_LatchLed() + use CCommon + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_LatchLed=TopDrive' +#endif + + + !TOPDRIVE-CODE=44 + if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& + Get_ElevatorConnectionPossible() .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_LatchLed(.true.) + return + end if + + + + + + + + !TOPDRIVE-CODE=45 + if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& + GetStandRack() > 0 .and.& + Get_JointConnectionPossible() == .false. .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_LatchLed(.true.) + return + end if + + + + + + + !TOPDRIVE-CODE=46 + if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& + Get_ElevatorConnectionPossible() .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_FillMouseHoleLed()) then + + call Set_LatchLed(.true.) + return + end if + + + + + + + + + + + + + + + + + + + + endif + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_LatchLed=Kelly' +#endif + + !OPERATION-CODE=36 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& + Get_ElevatorConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_Elevator() == ELEVATOR_UNLATCH_STRING_END .and.& + !Get_UnlatchLed() .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + !call Log_4("OPERATION-CODE=36") + call Set_LatchLed(.true.) + !call Set_UnlatchLed(.false.) + return + end if + + + !OPERATION-CODE=37 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_StandRack() > 0 .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& + Get_ElevatorConnectionPossible() == .false. .and.& + !Get_UnlatchLed() .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + !call Log_4("OPERATION-CODE=37") + call Set_LatchLed(.true.) + !call Set_UnlatchLed(.false.) + return + end if + + + + + + + + + + + + + + !OPERATION-CODE=38 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& + !Get_UnlatchLed() .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + Get_FillMouseHoleLed()) then + + !call Log_4("OPERATION-CODE=38") + call Set_LatchLed(.true.) + !call Set_UnlatchLed(.false.) + return + end if + + + + + + + !OPERATION-CODE=39 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= 27.41 .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_UnlatchLed() .and.& + Get_Swing() == SWING_RAT_HOLE_END) then + + !call Log_4("OPERATION-CODE=39") + call Set_LatchLed(.true.) + !call Set_UnlatchLed(.false.) + return + end if + + + + call Set_LatchLed(.false.) + + endif + + + + + + + + end subroutine + + ! subroutine Subscribe_LatchLed() + ! use UnitySignalsModuleVariables + ! use CStandRack + ! use CUnityInputs, OnElevatorConnectionChangePosibility => OnElevatorConnectionPossibleChange + ! use CSwingEnumVariables + ! use CSlipsEnumVariables + ! use CFillMouseHoleLedNotificationVariables + ! implicit none + + ! call OnOperationConditionChange%Add(Evaluate_LatchLed) + ! call OnStandRackChanged%Add(Evaluate_LatchLed) + ! call OnElevatorConnectionChangePosibility%Add(Evaluate_LatchLed) + ! call OnElevatorPickupChange%Add(Evaluate_LatchLed) + ! call OnNearFloorPositionChange%Add(Evaluate_LatchLed) + ! call OnSwingChange%Add(Evaluate_LatchLed) + ! call OnSlipsChange%Add(Evaluate_LatchLed) + ! call OnFillMouseHoleLedChange%Add(Evaluate_LatchLed) + + + ! end subroutine + end module CLatchLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 b/CSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 index 4f507fd..26af4af 100644 --- a/CSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 @@ -1,64 +1,64 @@ -module COpenKellyCockLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_OpenKellyCockLed() - implicit none - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OpenKellyCockLed=TopDrive' -!#endif -! endif -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OpenKellyCockLed=Kelly' -!#endif -! endif - - - - end subroutine - - ! subroutine Subscribe_OpenKellyCockLed() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - ! call OnOpenKellyCockPress%Add(ButtonPress_OpenKellyCock) - ! end subroutine - - subroutine ButtonPress_OpenKellyCock() - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_OpenKellyCock=TopDrive' -#endif - endif - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_OpenKellyCock=Kelly' -#endif - !OPERATION-CODE=65 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_OpenKellyCockLed() == .false. .and.& - Get_CloseKellyCockLed()) then - call Set_OpenKellyCockLed(.true.) - call Set_CloseKellyCockLed(.false.) - return - end if - endif - - - - end subroutine - +module COpenKellyCockLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_OpenKellyCockLed() + implicit none + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OpenKellyCockLed=TopDrive' +!#endif +! endif +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OpenKellyCockLed=Kelly' +!#endif +! endif + + + + end subroutine + + ! subroutine Subscribe_OpenKellyCockLed() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + ! call OnOpenKellyCockPress%Add(ButtonPress_OpenKellyCock) + ! end subroutine + + subroutine ButtonPress_OpenKellyCock() + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_OpenKellyCock=TopDrive' +#endif + endif + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_OpenKellyCock=Kelly' +#endif + !OPERATION-CODE=65 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_OpenKellyCockLed() == .false. .and.& + Get_CloseKellyCockLed()) then + call Set_OpenKellyCockLed(.true.) + call Set_CloseKellyCockLed(.false.) + return + end if + endif + + + + end subroutine + end module COpenKellyCockLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 b/CSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 index bcb25bd..3aa04fd 100644 --- a/CSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 @@ -1,108 +1,108 @@ -module COpenSafetyValveLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_OpenSafetyValveLed() - implicit none - - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OpenSafetyValveLed=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OpenSafetyValveLed=Kelly' -!#endif -! endif - - - - end subroutine - - ! subroutine Subscribe_OpenSafetyValveLed() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - ! call OnOpenSafetyValvePress%Add(ButtonPress_OpenSafetyValve) - ! call OnOperationConditionChangeInt%Add(Set_Operation_OpenSafetyValveLed) - ! end subroutine - - - subroutine Set_Operation_OpenSafetyValveLed(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%notifications%operation_OpenSafetyValveLed == v) return -#endif - data%State%notifications%operation_OpenSafetyValveLed = v -#ifdef deb - print*, 'data%State%notifications%operation_OpenSafetyValveLed=', data%State%notifications%operation_OpenSafetyValveLed -#endif - end subroutine - - - subroutine ButtonPress_OpenSafetyValve() - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_OpenSafetyValve=TopDrive' -#endif - - !TOPDRIVE-CODE=56 - if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& - Get_OpenSafetyValveLed() == .false. .and.& - Get_CloseSafetyValveLed()) then - - call Set_CloseSafetyValveLed(.false.) - call Set_OpenSafetyValveLed(.true.) - return - end if - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_OpenSafetyValve=Kelly' -#endif - - - !OPERATION-CODE=58 - if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& - Get_OpenSafetyValveLed() == .false. .and.& - Get_CloseSafetyValveLed()) then - call Set_OpenSafetyValveLed(.true.) - call Set_CloseSafetyValveLed(.false.) - return - end if - - - endif - - - - - end subroutine - +module COpenSafetyValveLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_OpenSafetyValveLed() + implicit none + + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OpenSafetyValveLed=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OpenSafetyValveLed=Kelly' +!#endif +! endif + + + + end subroutine + + ! subroutine Subscribe_OpenSafetyValveLed() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + ! call OnOpenSafetyValvePress%Add(ButtonPress_OpenSafetyValve) + ! call OnOperationConditionChangeInt%Add(Set_Operation_OpenSafetyValveLed) + ! end subroutine + + + subroutine Set_Operation_OpenSafetyValveLed(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%notifications%operation_OpenSafetyValveLed == v) return +#endif + data%State%notifications%operation_OpenSafetyValveLed = v +#ifdef deb + print*, 'data%State%notifications%operation_OpenSafetyValveLed=', data%State%notifications%operation_OpenSafetyValveLed +#endif + end subroutine + + + subroutine ButtonPress_OpenSafetyValve() + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_OpenSafetyValve=TopDrive' +#endif + + !TOPDRIVE-CODE=56 + if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& + Get_OpenSafetyValveLed() == .false. .and.& + Get_CloseSafetyValveLed()) then + + call Set_CloseSafetyValveLed(.false.) + call Set_OpenSafetyValveLed(.true.) + return + end if + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_OpenSafetyValve=Kelly' +#endif + + + !OPERATION-CODE=58 + if (Get_SafetyValveHeight() >= 3.0 .and. Get_SafetyValveHeight() <= 12.0 .and.& + Get_OpenSafetyValveLed() == .false. .and.& + Get_CloseSafetyValveLed()) then + call Set_OpenSafetyValveLed(.true.) + call Set_CloseSafetyValveLed(.false.) + return + end if + + + endif + + + + + end subroutine + end module COpenSafetyValveLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CSlipsNotification.f90 b/CSharp/OperationScenarios/Notifications/CSlipsNotification.f90 index c38b37c..fcd1a2f 100644 --- a/CSharp/OperationScenarios/Notifications/CSlipsNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CSlipsNotification.f90 @@ -1,134 +1,134 @@ -module CSlipsNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_SlipsNotification() - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_SlipsNotification=TopDrive' -#endif - - !TOPDRIVE-CODE=28 - if (Get_ZeroStringSpeed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_Slips() == SLIPS_UNSET_END .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then - - call Set_SlipsNotification(.true.) - return - end if - - - - !TOPDRIVE-CODE=29 - if (Get_ZeroStringSpeed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .or.& - Get_TdsConnectionModes() == TDS_CONNECTION_STRING) .and.& - Get_Slips() == SLIPS_SET_END .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then - - call Set_SlipsNotification(.true.) - return - end if - - - - - endif - - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_SlipsNotification=Kelly' -#endif - - !OPERATION-CODE=53 - if (Get_ZeroStringSpeed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - !Get_KellyConnection() == KELLY_CONNECTION_STRING - Get_Slips() == SLIPS_UNSET_END .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then - call Set_SlipsNotification(.true.) - return - end if - - - - - - !OPERATION-CODE=77 - if (Get_ZeroStringSpeed() .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_Slips() == SLIPS_SET_END .and.& - Get_IsKellyBushingSetInTable() == .false. .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_KellyConnection() == KELLY_CONNECTION_STRING)) then - call Set_SlipsNotification(.true.) - - return - end if - - - - - - !if (Get_OperationCondition() == OPERATION_DRILL .and.& - ! Get_ZeroStringSpeed() .and.& - ! Get_SlackOff() .and.& - ! Get_KellyConnection() == KELLY_CONNECTION_STRING) then - ! call Set_SlipsNotification(.true.) - ! return - !end if - ! - ! - !if (Get_OperationCondition() == OPERATION_TRIP .and.& - ! Get_ZeroStringSpeed() .and.& - ! Get_NearFloorConnection() >= 21 .and. Get_NearFloorConnection() <= 25 .and.& - ! Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then - ! call Set_SlipsNotification(.true.) - ! return - !end if - - - - - call Set_SlipsNotification(.false.) - - endif - - - - - - - end subroutine - - ! subroutine Subscribe_SlipsNotification() - ! implicit none - - ! call OnOperationConditionChange%Add(Evaluate_SlipsNotification) - ! call OnSlackOffChange%Add(Evaluate_SlipsNotification) - ! call OnZeroStringSpeedChange%Add(Evaluate_SlipsNotification) - ! call OnNearFloorConnectionChange%Add(Evaluate_SlipsNotification) - ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_SlipsNotification) - ! call OnKellyConnectionChange%Add(Evaluate_SlipsNotification) - ! call OnSlipsChange%Add(Evaluate_SlipsNotification) - - ! end subroutine - +module CSlipsNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_SlipsNotification() + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_SlipsNotification=TopDrive' +#endif + + !TOPDRIVE-CODE=28 + if (Get_ZeroStringSpeed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_Slips() == SLIPS_UNSET_END .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then + + call Set_SlipsNotification(.true.) + return + end if + + + + !TOPDRIVE-CODE=29 + if (Get_ZeroStringSpeed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .or.& + Get_TdsConnectionModes() == TDS_CONNECTION_STRING) .and.& + Get_Slips() == SLIPS_SET_END .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then + + call Set_SlipsNotification(.true.) + return + end if + + + + + endif + + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_SlipsNotification=Kelly' +#endif + + !OPERATION-CODE=53 + if (Get_ZeroStringSpeed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + !Get_KellyConnection() == KELLY_CONNECTION_STRING + Get_Slips() == SLIPS_UNSET_END .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0) then + call Set_SlipsNotification(.true.) + return + end if + + + + + + !OPERATION-CODE=77 + if (Get_ZeroStringSpeed() .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_Slips() == SLIPS_SET_END .and.& + Get_IsKellyBushingSetInTable() == .false. .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + (Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_KellyConnection() == KELLY_CONNECTION_STRING)) then + call Set_SlipsNotification(.true.) + + return + end if + + + + + + !if (Get_OperationCondition() == OPERATION_DRILL .and.& + ! Get_ZeroStringSpeed() .and.& + ! Get_SlackOff() .and.& + ! Get_KellyConnection() == KELLY_CONNECTION_STRING) then + ! call Set_SlipsNotification(.true.) + ! return + !end if + ! + ! + !if (Get_OperationCondition() == OPERATION_TRIP .and.& + ! Get_ZeroStringSpeed() .and.& + ! Get_NearFloorConnection() >= 21 .and. Get_NearFloorConnection() <= 25 .and.& + ! Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then + ! call Set_SlipsNotification(.true.) + ! return + !end if + + + + + call Set_SlipsNotification(.false.) + + endif + + + + + + + end subroutine + + ! subroutine Subscribe_SlipsNotification() + ! implicit none + + ! call OnOperationConditionChange%Add(Evaluate_SlipsNotification) + ! call OnSlackOffChange%Add(Evaluate_SlipsNotification) + ! call OnZeroStringSpeedChange%Add(Evaluate_SlipsNotification) + ! call OnNearFloorConnectionChange%Add(Evaluate_SlipsNotification) + ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_SlipsNotification) + ! call OnKellyConnectionChange%Add(Evaluate_SlipsNotification) + ! call OnSlipsChange%Add(Evaluate_SlipsNotification) + + ! end subroutine + end module CSlipsNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 index b1b8def..2f3ee7d 100644 --- a/CSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 @@ -1,122 +1,122 @@ -module CSwingLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_SwingLed() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingLed=TopDrive' -#endif - - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingLed=Kelly' -#endif - - - !OPERATION-CODE=22 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_JointConnectionPossible() == .false. .and.& - (Get_Swing() /= SWING_WELL_BEGIN .and.& - Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& - Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_SwingLed(.true.) - return - end if - - - !OPERATION-CODE=23 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%LG + data%State%OperationScenario%PL) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - Get_JointConnectionPossible() == .false. .and.& - (Get_Swing() /= SWING_WELL_BEGIN .and.& - Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& - Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_SwingLed(.true.) - return - end if - - - !OPERATION-CODE=24 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - Get_JointConnectionPossible() == .false. .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - (Get_Swing() /= SWING_WELL_BEGIN .and.& - Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& - Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_SwingLed(.true.) - return - end if - - !OPERATION-CODE=25 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%LG + data%State%OperationScenario%PL) .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - Get_JointConnectionPossible() == .false. .and.& - (Get_Swing() /= SWING_WELL_BEGIN .and.& - Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& - Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_SwingLed(.true.) - return - end if - - - call Set_SwingLed(.false.) - - - endif - - - - - - - - - end subroutine - - ! subroutine Subscribe_SwingLed() - ! implicit none - - ! call OnOperationConditionChange%Add(Evaluate_SwingLed) - ! call OnHookHeightChange%Add(Evaluate_SwingLed) - ! call OnElevatorConnectionChange%Add(Evaluate_SwingLed) - ! call OnKellyConnectionChange%Add(Evaluate_SwingLed) - ! call OnSwingChange%Add(Evaluate_SwingLed) - ! call OnSlipsChange%Add(Evaluate_SwingLed) - ! call OnFillMouseHoleLedChange%Add(Evaluate_SwingLed) - - ! end subroutine - +module CSwingLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_SwingLed() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingLed=TopDrive' +#endif + + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingLed=Kelly' +#endif + + + !OPERATION-CODE=22 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_JointConnectionPossible() == .false. .and.& + (Get_Swing() /= SWING_WELL_BEGIN .and.& + Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& + Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_SwingLed(.true.) + return + end if + + + !OPERATION-CODE=23 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%LG + data%State%OperationScenario%PL) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + Get_JointConnectionPossible() == .false. .and.& + (Get_Swing() /= SWING_WELL_BEGIN .and.& + Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& + Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_SwingLed(.true.) + return + end if + + + !OPERATION-CODE=24 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + Get_JointConnectionPossible() == .false. .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + (Get_Swing() /= SWING_WELL_BEGIN .and.& + Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& + Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_SwingLed(.true.) + return + end if + + !OPERATION-CODE=25 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%LG + data%State%OperationScenario%PL) .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + Get_JointConnectionPossible() == .false. .and.& + (Get_Swing() /= SWING_WELL_BEGIN .and.& + Get_Swing() /= SWING_MOUSE_HOLE_BEGIN .and.& + Get_Swing() /= SWING_RAT_HOLE_BEGIN) .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_SwingLed(.true.) + return + end if + + + call Set_SwingLed(.false.) + + + endif + + + + + + + + + end subroutine + + ! subroutine Subscribe_SwingLed() + ! implicit none + + ! call OnOperationConditionChange%Add(Evaluate_SwingLed) + ! call OnHookHeightChange%Add(Evaluate_SwingLed) + ! call OnElevatorConnectionChange%Add(Evaluate_SwingLed) + ! call OnKellyConnectionChange%Add(Evaluate_SwingLed) + ! call OnSwingChange%Add(Evaluate_SwingLed) + ! call OnSlipsChange%Add(Evaluate_SwingLed) + ! call OnFillMouseHoleLedChange%Add(Evaluate_SwingLed) + + ! end subroutine + end module CSwingLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 index bac93e5..bd37df5 100644 --- a/CSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 @@ -1,72 +1,72 @@ -module CTdsIbopLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_IbopLed() - use CCommon - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IbopLed=TopDrive' -#endif - - - - - !TOPDRIVE-CODE=61 - if (Get_IbopLed() == .false. .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF .and.& - data%EquipmentControl%TopDrivePanel%TopDriveIbop == .false.) then - - call Set_IbopLed(.true.) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_OFF - return - end if - - - - - !TOPDRIVE-CODE=62 - if (Get_IbopLed() .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF .and.& - data%EquipmentControl%TopDrivePanel%TopDriveIbop) then - - call Set_IbopLed(.false.) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - - - endif - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_IbopLed=Kelly' -!#endif -! -! endif - - - - - - end subroutine - - ! subroutine Subscribe_IbopLed() - ! implicit none - ! end subroutine - +module CTdsIbopLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_IbopLed() + use CCommon + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_IbopLed=TopDrive' +#endif + + + + + !TOPDRIVE-CODE=61 + if (Get_IbopLed() == .false. .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF .and.& + data%EquipmentControl%TopDrivePanel%TopDriveIbop == .false.) then + + call Set_IbopLed(.true.) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_OFF + return + end if + + + + + !TOPDRIVE-CODE=62 + if (Get_IbopLed() .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF .and.& + data%EquipmentControl%TopDrivePanel%TopDriveIbop) then + + call Set_IbopLed(.false.) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + + + endif + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_IbopLed=Kelly' +!#endif +! +! endif + + + + + + end subroutine + + ! subroutine Subscribe_IbopLed() + ! implicit none + ! end subroutine + end module CTdsIbopLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 index 0ed8393..f3ff095 100644 --- a/CSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 @@ -1,49 +1,49 @@ -module CTdsPowerLedNotification - use OperationScenariosModule - use SimulationVariables - implicit none - contains - - subroutine Evaluate_PowerLed() - use CCommon - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_PowerLed=TopDrive' -#endif - - !TOPDRIVE-CODE=63 - if (data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF) then - call Set_PowerLed(.true.) - return - end if - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_PowerLed=Kelly' -#endif - - endif - - - - - - end subroutine - - ! subroutine Subscribe_PowerLed() - ! implicit none - ! end subroutine - +module CTdsPowerLedNotification + use OperationScenariosModule + use SimulationVariables + implicit none + contains + + subroutine Evaluate_PowerLed() + use CCommon + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_PowerLed=TopDrive' +#endif + + !TOPDRIVE-CODE=63 + if (data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_OFF) then + call Set_PowerLed(.true.) + return + end if + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_PowerLed=Kelly' +#endif + + endif + + + + + + end subroutine + + ! subroutine Subscribe_PowerLed() + ! implicit none + ! end subroutine + end module CTdsPowerLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 index e04b9c7..212f6d6 100644 --- a/CSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 @@ -1,59 +1,59 @@ -module CTdsTorqueWrenchLedNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_TorqueWrenchLed() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TorqueWrenchLed=TopDrive' -#endif - - !TOPDRIVE-CODE=81 - if((Get_TdsBackupClamp() == BACKUP_CLAMP_OFF_BEGIN .or.& - Get_TdsBackupClamp() == BACKUP_CLAMP_FW_BEGIN) .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - call Set_TorqueWrenchLed(LED_BLINK) - return - endif - - !TOPDRIVE-CODE=81 - if(Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - call Set_TorqueWrenchLed(LED_ON) - return - endif - - - call Set_TorqueWrenchLed(LED_OFF) - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingLed=Kelly' -#endif - - - endif - - - - end subroutine - - ! subroutine Subscribe_TorqueWrenchLed() - ! implicit none - - ! end subroutine - +module CTdsTorqueWrenchLedNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_TorqueWrenchLed() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TorqueWrenchLed=TopDrive' +#endif + + !TOPDRIVE-CODE=81 + if((Get_TdsBackupClamp() == BACKUP_CLAMP_OFF_BEGIN .or.& + Get_TdsBackupClamp() == BACKUP_CLAMP_FW_BEGIN) .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + call Set_TorqueWrenchLed(LED_BLINK) + return + endif + + !TOPDRIVE-CODE=81 + if(Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + call Set_TorqueWrenchLed(LED_ON) + return + endif + + + call Set_TorqueWrenchLed(LED_OFF) + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingLed=Kelly' +#endif + + + endif + + + + end subroutine + + ! subroutine Subscribe_TorqueWrenchLed() + ! implicit none + + ! end subroutine + end module CTdsTorqueWrenchLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CTongNotification.f90 b/CSharp/OperationScenarios/Notifications/CTongNotification.f90 index 46f3445..51bbad3 100644 --- a/CSharp/OperationScenarios/Notifications/CTongNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CTongNotification.f90 @@ -1,287 +1,287 @@ -module CTongNotification - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_TongNotification() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TongNotification=TopDrive' -#endif - - - - - !TOPDRIVE-CODE=50 - if (((Get_HookHeight() >= (TL() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + NFC() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG)) .or.& - (Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG))).and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - ((Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .or.& - Get_Tong() == TONG_NEUTRAL ) .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - !TOPDRIVE-CODE=51 - if (GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - - - - !TOPDRIVE-CODE=52 - if (GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - endif - - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_TongNotification=Kelly' -#endif - - !OPERATION-CODE=44 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - !((Get_HookHeight() >= 65.0 .and. Get_HookHeight() <= 70.0) .or.& - ! (Get_HookHeight() >= 96.0 .and. Get_HookHeight() <= 101.0)).and.& - ((Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%TG)) .or.& - (Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL -data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%TG + data%State%OperationScenario%PL))).and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - Get_Swing() == SWING_WELL_END .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - !OPERATION-CODE=45 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= 66 .and. Get_HookHeight() <= 69 .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_MOUSE_HOLE_END) then - - call Set_TongNotification(.true.) - return - end if - - - - !OPERATION-CODE=46 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_MOUSE_HOLE_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - !OPERATION-CODE=47 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - !OPERATION-CODE=48 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - - - - - - - - - - - !OPERATION-CODE=50 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - ((Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG)) .or.& - (Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%TG - data%State%OperationScenario%ECG + data%State%OperationScenario%SL))).and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - !OPERATION-CODE=51 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - - !OPERATION-CODE=52 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_JointConnectionPossible() .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& - (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& - Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_TongNotification(.true.) - return - end if - - - - - !if (Get_OperationCondition() == OPERATION_DRILL .and.& - ! Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& - ! Get_Swing() == SWING_WELL_END .and.& - ! Get_Slips() == SLIPS_SET_END) then - ! - ! call Set_TongNotification(.true.) - ! return - !end if - ! - - - call Set_TongNotification(.false.) - - endif - - - - - - - - - - - end subroutine - - ! subroutine Subscribe_TongNotification() - ! implicit none - - ! call data%State%unitySignals%OnOperationConditionChange%Add(Evaluate_TongNotification) - ! ! call softwareInputs%OnHookHeightChange%Add(Evaluate_TongNotification) - ! call UnityInputs%OnJointConnectionPossibleChange%Add(Evaluate_TongNotification) - ! call UnityInputs%OnSingleSetInMouseHoleChange%Add(Evaluate_TongNotification) - ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_TongNotification) - ! call KellyConnectionEnum%OnKellyConnectionChange%Add(Evaluate_TongNotification) - ! call data%State%unitySignals%OnSwingChange%Add(Evaluate_TongNotification) - ! call data%State%unitySignals%OnSlipsChange%Add(Evaluate_TongNotification) - - ! end subroutine - - - +module CTongNotification + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_TongNotification() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TongNotification=TopDrive' +#endif + + + + + !TOPDRIVE-CODE=50 + if (((Get_HookHeight() >= (TL() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + NFC() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG)) .or.& + (Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG))).and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + ((Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .or.& + Get_Tong() == TONG_NEUTRAL ) .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + !TOPDRIVE-CODE=51 + if (GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_SINGLE .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + + + + !TOPDRIVE-CODE=52 + if (GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STAND .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND) .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + endif + + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_TongNotification=Kelly' +#endif + + !OPERATION-CODE=44 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + !((Get_HookHeight() >= 65.0 .and. Get_HookHeight() <= 70.0) .or.& + ! (Get_HookHeight() >= 96.0 .and. Get_HookHeight() <= 101.0)).and.& + ((Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%TG)) .or.& + (Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL -data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%TG + data%State%OperationScenario%PL))).and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + Get_Swing() == SWING_WELL_END .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + !OPERATION-CODE=45 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= 66 .and. Get_HookHeight() <= 69 .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_MOUSE_HOLE_END) then + + call Set_TongNotification(.true.) + return + end if + + + + !OPERATION-CODE=46 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_MOUSE_HOLE_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + !OPERATION-CODE=47 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + !OPERATION-CODE=48 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + + + + + + + + + + + !OPERATION-CODE=50 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + ((Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%TG)) .or.& + (Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() - data%State%OperationScenario%RE) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%TG - data%State%OperationScenario%ECG + data%State%OperationScenario%SL))).and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + !OPERATION-CODE=51 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + + !OPERATION-CODE=52 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_JointConnectionPossible() .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& + (Get_Tong() /= TONG_BREAKOUT_BEGIN .and.& + Get_Tong() /= TONG_MAKEUP_BEGIN) .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_TongNotification(.true.) + return + end if + + + + + !if (Get_OperationCondition() == OPERATION_DRILL .and.& + ! Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& + ! Get_Swing() == SWING_WELL_END .and.& + ! Get_Slips() == SLIPS_SET_END) then + ! + ! call Set_TongNotification(.true.) + ! return + !end if + ! + + + call Set_TongNotification(.false.) + + endif + + + + + + + + + + + end subroutine + + ! subroutine Subscribe_TongNotification() + ! implicit none + + ! call data%State%unitySignals%OnOperationConditionChange%Add(Evaluate_TongNotification) + ! ! call softwareInputs%OnHookHeightChange%Add(Evaluate_TongNotification) + ! call UnityInputs%OnJointConnectionPossibleChange%Add(Evaluate_TongNotification) + ! call UnityInputs%OnSingleSetInMouseHoleChange%Add(Evaluate_TongNotification) + ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_TongNotification) + ! call KellyConnectionEnum%OnKellyConnectionChange%Add(Evaluate_TongNotification) + ! call data%State%unitySignals%OnSwingChange%Add(Evaluate_TongNotification) + ! call data%State%unitySignals%OnSlipsChange%Add(Evaluate_TongNotification) + + ! end subroutine + + + end module CTongNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 b/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 index 03e12ba..8ce3a59 100644 --- a/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 +++ b/CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 @@ -1,216 +1,216 @@ -module CUnlatchLedNotification - use OperationScenariosModule - use CLog4 - implicit none - contains - - subroutine Evaluate_UnlatchLed() - use CCommon - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_UnlatchLed=TopDrive' -#endif - - - - !TOPDRIVE-CODE=47 - if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_ElevatorPickup() == .false. .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_UnlatchLed(.true.) - return - end if - - - - - !TOPDRIVE-CODE=48 - if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& - GetStandRack() > 80 .and.& - Get_JointConnectionPossible() == .false. .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_UnlatchLed(.true.) - return - end if - - - - - - - !TOPDRIVE-CODE=49 - if ((Get_HookHeight() >= TL() .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SG)) .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_UnlatchLed(.true.) - return - end if - - - - - - - - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_UnlatchLed=Kelly' -#endif - - - - !OPERATION-CODE=40 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& - Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_Elevator() == ELEVATOR_LATCH_STRING_END .and.& - (Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& - !(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& - !Get_LatchLed() == .false. - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END ) then - - call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - return - end if - - - - - - - - - !OPERATION-CODE=41 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& - !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - Get_StandRack() < 80 .and.& - Get_JointConnectionPossible() == .false. .and.& - !Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& - !Get_LatchLed() == .false. - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - return - end if - - - - - - !OPERATION-CODE=42 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= data%State%OperationScenario%HL .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SG) .and.& - (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& - Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& - Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& - !Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - !Get_LatchLed() == .false. .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - return - end if - - - - - - !call Log_4('OPERATION-CODE=43-OPERATION_DRILL=', Get_OperationCondition() == OPERATION_DRILL) - !call Log_4('OPERATION-CODE=43-Get_HookHeight=', Get_HookHeight() >= 27.41) - !call Log_4('OPERATION-CODE=43-Get_Swing()=', Get_Swing() == SWING_RAT_HOLE_END) - !call Log_4('OPERATION-CODE=43-Get_LatchLed()=', Get_LatchLed() == .false.) - !OPERATION-CODE=43 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= 27.41 .and.& - !Get_LatchLed() == .false. - Get_Swing() == SWING_RAT_HOLE_END) then - !call Log_4('OPERATION-CODE=43-call Set_UnlatchLed(.true.)') - call Set_UnlatchLed(.true.) - !call Set_LatchLed(.false.) - return - end if - - - - call Set_UnlatchLed(.false.) - - endif - end subroutine - - ! subroutine Subscribe_UnlatchLed() - ! implicit none - - ! !**call data%State%unitySignals%OnOperationConditionChange%Add(Evaluate_UnlatchLed) - ! ! call softwareInputs%OnHookHeightChange%Add(Evaluate_UnlatchLed) - ! ! call softwareInputs%OnStandRackChanged%Add(Evaluate_UnlatchLed) - ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_UnlatchLed) - ! !**call data%State%unitySignals%OnSwingChange%Add(Evaluate_UnlatchLed) - ! !**call data%State%unitySignals%OnSlipsChange%Add(Evaluate_UnlatchLed) - ! !**call data%State%notifications%OnLatchLedChange%Add(Evaluate_UnlatchLed) - ! !**call data%State%notifications%OnFillMouseHoleLedChange%Add(Evaluate_UnlatchLed) - ! end subroutine - +module CUnlatchLedNotification + use OperationScenariosModule + use CLog4 + implicit none + contains + + subroutine Evaluate_UnlatchLed() + use CCommon + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_UnlatchLed=TopDrive' +#endif + + + + !TOPDRIVE-CODE=47 + if (Get_HookHeight() <= (TL() + NFC() - data%State%OperationScenario%ECG) .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_ElevatorPickup() == .false. .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_LATCH_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING) .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_UnlatchLed(.true.) + return + end if + + + + + !TOPDRIVE-CODE=48 + if ((Get_HookHeight() >= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC()) .and. Get_HookHeight() <= (TL() + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + NFC() + data%State%OperationScenario%TG)) .and.& + GetStandRack() > 80 .and.& + Get_JointConnectionPossible() == .false. .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STAND .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_UnlatchLed(.true.) + return + end if + + + + + + + !TOPDRIVE-CODE=49 + if ((Get_HookHeight() >= TL() .and. Get_HookHeight() <= (TL() + NFC() + data%State%OperationScenario%SG)) .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .or. Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE) .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_UnlatchLed(.true.) + return + end if + + + + + + + + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_UnlatchLed=Kelly' +#endif + + + + !OPERATION-CODE=40 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() - data%State%OperationScenario%ECG) .and.& + Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_Elevator() == ELEVATOR_LATCH_STRING_END .and.& + (Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + !(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + !Get_LatchLed() == .false. + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END ) then + + call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + return + end if + + + + + + + + + !OPERATION-CODE=41 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection()) .and. Get_HookHeight() <= (data%State%OperationScenario%HL + data%State%OperationScenario%SL - data%State%OperationScenario%ECG + Get_NearFloorConnection() + data%State%OperationScenario%LG) .and.& + !Get_HookHeight() >= (HL + Get_NearFloorConnection() + SL + RE) .and. Get_HookHeight() <= (HL + Get_NearFloorConnection() + SL + LG) .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + Get_StandRack() < 80 .and.& + Get_JointConnectionPossible() == .false. .and.& + !Get_Elevator() == ELEVATOR_UNLATCH_STAND_END .and.& + !Get_LatchLed() == .false. + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + return + end if + + + + + + !OPERATION-CODE=42 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= data%State%OperationScenario%HL .and. Get_HookHeight() <= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%SG) .and.& + (Get_Elevator() /= ELEVATOR_LATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STRING_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_STAND_BEGIN .and.& + Get_Elevator() /= ELEVATOR_LATCH_SINGLE_BEGIN .and.& + Get_Elevator() /= ELEVATOR_UNLATCH_SINGLE_BEGIN) .and.& + !Get_Elevator() == ELEVATOR_UNLATCH_SINGLE_END .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + !Get_LatchLed() == .false. .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + return + end if + + + + + + !call Log_4('OPERATION-CODE=43-OPERATION_DRILL=', Get_OperationCondition() == OPERATION_DRILL) + !call Log_4('OPERATION-CODE=43-Get_HookHeight=', Get_HookHeight() >= 27.41) + !call Log_4('OPERATION-CODE=43-Get_Swing()=', Get_Swing() == SWING_RAT_HOLE_END) + !call Log_4('OPERATION-CODE=43-Get_LatchLed()=', Get_LatchLed() == .false.) + !OPERATION-CODE=43 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= 27.41 .and.& + !Get_LatchLed() == .false. + Get_Swing() == SWING_RAT_HOLE_END) then + !call Log_4('OPERATION-CODE=43-call Set_UnlatchLed(.true.)') + call Set_UnlatchLed(.true.) + !call Set_LatchLed(.false.) + return + end if + + + + call Set_UnlatchLed(.false.) + + endif + end subroutine + + ! subroutine Subscribe_UnlatchLed() + ! implicit none + + ! !**call data%State%unitySignals%OnOperationConditionChange%Add(Evaluate_UnlatchLed) + ! ! call softwareInputs%OnHookHeightChange%Add(Evaluate_UnlatchLed) + ! ! call softwareInputs%OnStandRackChanged%Add(Evaluate_UnlatchLed) + ! call data%State%OperationScenario%OnElevatorConnectionChange%Add(Evaluate_UnlatchLed) + ! !**call data%State%unitySignals%OnSwingChange%Add(Evaluate_UnlatchLed) + ! !**call data%State%unitySignals%OnSlipsChange%Add(Evaluate_UnlatchLed) + ! !**call data%State%notifications%OnLatchLedChange%Add(Evaluate_UnlatchLed) + ! !**call data%State%notifications%OnFillMouseHoleLedChange%Add(Evaluate_UnlatchLed) + ! end subroutine + end module CUnlatchLedNotification \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/NotificationVariables.f90 b/CSharp/OperationScenarios/Notifications/NotificationVariables.f90 index a7d31cf..fed1956 100644 --- a/CSharp/OperationScenarios/Notifications/NotificationVariables.f90 +++ b/CSharp/OperationScenarios/Notifications/NotificationVariables.f90 @@ -1,25 +1,25 @@ -module NotificationVariables - ! use CVoidEventHandlerCollection - implicit none - type::NotificationType - logical :: CloseKellyCockLed = .false. - logical :: CloseSafetyValveLed = .false. - integer :: operation_CloseSafetyValveLed = 0 - logical :: FillMouseHoleLed = .false. - logical :: IrIBopLed = .false. - logical :: IrSafetyValveLed = .false. - integer :: operation_IrSafetyValveLed = 0 - logical :: LatchLed = .false. - logical :: OpenKellyCockLed = .false. - logical :: OpenSafetyValveLed = .false. - integer :: operation_OpenSafetyValveLed = 0 - logical :: SlipsNotification = .false. - logical :: SwingLed = .false. - logical :: IbopLed = .false. - logical :: PowerLed = .false. - integer :: TorqueWrenchLed = 0 - logical :: TongNotification = .false. - logical :: UnlatchLed = .false. - end type NotificationType - contains +module NotificationVariables + ! use CVoidEventHandlerCollection + implicit none + type::NotificationType + logical :: CloseKellyCockLed = .false. + logical :: CloseSafetyValveLed = .false. + integer :: operation_CloseSafetyValveLed = 0 + logical :: FillMouseHoleLed = .false. + logical :: IrIBopLed = .false. + logical :: IrSafetyValveLed = .false. + integer :: operation_IrSafetyValveLed = 0 + logical :: LatchLed = .false. + logical :: OpenKellyCockLed = .false. + logical :: OpenSafetyValveLed = .false. + integer :: operation_OpenSafetyValveLed = 0 + logical :: SlipsNotification = .false. + logical :: SwingLed = .false. + logical :: IbopLed = .false. + logical :: PowerLed = .false. + integer :: TorqueWrenchLed = 0 + logical :: TongNotification = .false. + logical :: UnlatchLed = .false. + end type NotificationType + contains end module NotificationVariables \ No newline at end of file diff --git a/CSharp/OperationScenarios/Notifications/Notofications.f90 b/CSharp/OperationScenarios/Notifications/Notifications.f90 similarity index 84% rename from CSharp/OperationScenarios/Notifications/Notofications.f90 rename to CSharp/OperationScenarios/Notifications/Notifications.f90 index 1f62117..a810ef7 100644 --- a/CSharp/OperationScenarios/Notifications/Notofications.f90 +++ b/CSharp/OperationScenarios/Notifications/Notifications.f90 @@ -1,408 +1,408 @@ -module NotificationModule - use SimulationVariables - implicit none -contains - subroutine Set_UnlatchLed(v) - use CDrillingConsoleVariables - use SimulationVariables - !use CLatchLedNotification - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%UnlatchLed == v) return - #endif - data%State%notifications%UnlatchLed = v - - if(data%State%notifications%UnlatchLed) then - data%EquipmentControl%DrillingConsole%UnlatchPipeLED = 1 - !call Set_LatchLed(.false.) - else - data%EquipmentControl%DrillingConsole%UnlatchPipeLED = 0 - endif - - !**call data%State%notifications%OnUnlatchLedChange%RunAll() - end subroutine - - logical function Get_UnlatchLed() - implicit none - Get_UnlatchLed = data%State%notifications%UnlatchLed - end function - - subroutine Set_TongNotification(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%TongNotification == v) return - #endif - data%State%notifications%TongNotification = v - ! if(associated(data%State%notifications%TongNotificationPtr)) !**call data%State%notifications%TongNotificationPtr(data%State%notifications%TongNotification) - #ifdef deb - print*, 'data%State%notifications%TongNotification=', data%State%notifications%TongNotification - #endif - !**call data%State%notifications%OnTongNotificationChange%RunAll() - end subroutine - - logical function Get_TongNotification() - implicit none - Get_TongNotification = data%State%notifications%TongNotification - end function - - subroutine Set_TorqueWrenchLed(v) - use CTopDrivePanelVariables - use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed - implicit none - integer , intent(in) :: v - - #ifdef ExcludeExtraChanges - if(data%State%notifications%TorqueWrenchLed == v) return - #endif - data%State%notifications%TorqueWrenchLed = v - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = v - !**call data%State%notifications%OnTorqueWrenchLedChange%RunAll() - end subroutine - - logical function Get_TorqueWrenchLed() - implicit none - Get_TorqueWrenchLed = data%State%notifications%TorqueWrenchLed - end function - - subroutine Set_PowerLed(v) - use CTopDrivePanelVariables - use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed - !use CLatchLedNotification - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%PowerLed == v) return - #endif - data%State%notifications%PowerLed = v - - if(data%State%notifications%PowerLed) then - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = 1 - !call Set_LatchLed(.false.) - else - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = 0 - endif - - !**call data%State%notifications%OnPowerLedChange%RunAll() - end subroutine - - logical function Get_PowerLed() - implicit none - Get_PowerLed = data%State%notifications%PowerLed - end function - - subroutine Set_IbopLed(v) - use CTopDrivePanelVariables - use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveIbopLed - use CManifolds, Only: OpenTopDriveIBop, CloseTopDriveIBop - !use CLatchLedNotification - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%IbopLed == v) return - #endif - data%State%notifications%IbopLed = v - - if(data%State%notifications%IbopLed) then - data%EquipmentControl%TopDrivePanel%TopDriveIbopLed = 1 - call CloseTopDriveIBop() - else - data%EquipmentControl%TopDrivePanel%TopDriveIbopLed = 0 - call OpenTopDriveIBop() - endif - - !**call data%State%notifications%OnIbopLedChange%RunAll() - end subroutine - - logical function Get_IbopLed() - implicit none - Get_IbopLed = data%State%notifications%IbopLed - end function - - subroutine Set_SwingLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: SwingLedHw => SwingLed - implicit none - logical , intent(in) :: v - - #ifdef ExcludeExtraChanges - if(data%State%notifications%SwingLed == v) return - #endif - data%State%notifications%SwingLed = v - if(data%State%notifications%SwingLed) then - data%EquipmentControl%DrillingConsole%SwingLed = 1 - else - data%EquipmentControl%DrillingConsole%SwingLed = 0 - endif - !**call data%State%notifications%OnSwingLedChange%RunAll() - end subroutine - - logical function Get_SwingLed() - implicit none - Get_SwingLed = data%State%notifications%SwingLed - end function - - subroutine Set_SlipsNotification(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%SlipsNotification == v) return - #endif - data%State%notifications%SlipsNotification = v - ! if(associated(data%State%notifications%SlipsNotificationPtr)) !**call data%State%notifications%SlipsNotificationPtr(data%State%notifications%SlipsNotification) - #ifdef deb - print*, 'data%State%notifications%SlipsNotification=', data%State%notifications%SlipsNotification - #endif - !**call data%State%notifications%OnSlipsNotificationChange%RunAll() - end subroutine - - logical function Get_SlipsNotification() - implicit none - Get_SlipsNotification = data%State%notifications%SlipsNotification - end function - - subroutine Set_OpenSafetyValveLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: OpenSafetyValveLedHw => OpenSafetyValveLed - use CManifolds, only: OpenSafetyValve_TopDrive, OpenSafetyValve_KellyMode, OpenSafetyValve_TripMode - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%OpenSafetyValveLed == v) return - #endif - data%State%notifications%OpenSafetyValveLed = v - - if(data%State%notifications%OpenSafetyValveLed) then - !!call OpenSafetyValve() - if(data%State%Hoisting%DriveType == TopDrive_DriveType) call OpenSafetyValve_TopDrive() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_OpenSafetyValveLed == 0) call OpenSafetyValve_KellyMode() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_OpenSafetyValveLed == 1) call OpenSafetyValve_TripMode() - endif - - !**call data%State%notifications%OnOpenSafetyValveLedChange%RunAll() - end subroutine - - logical function Get_OpenSafetyValveLed() - implicit none - Get_OpenSafetyValveLed = data%State%notifications%OpenSafetyValveLed - end function - - subroutine Set_OpenKellyCockLed(v) - ! use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: OpenKellyCockLedHw => OpenKellyCockLed - use CManifolds, only: OpenKellyCock - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%OpenKellyCockLed == v) return - #endif - data%State%notifications%OpenKellyCockLed = v - - if(data%State%notifications%OpenKellyCockLed) then - call OpenKellyCock() - endif - - ! HAS BEEN IMPLEMENTED IN CMANIFOLD - - !if(OpenKellyCockLed) then - ! OpenKellyCockLedHw = 1 - !else - ! OpenKellyCockLedHw = 0 - !endif - - !**call data%State%notifications%OnOpenKellyCockLedChange%RunAll() - end subroutine - - logical function Get_OpenKellyCockLed() - implicit none - Get_OpenKellyCockLed = data%State%notifications%OpenKellyCockLed - end function - - subroutine Set_LatchLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%LatchPipeLED - !use CUnlatchLedNotification - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%LatchLed == v) return - #endif - data%State%notifications%LatchLed = v - if(data%State%notifications%LatchLed) then - data%EquipmentControl%DrillingConsole%LatchPipeLED = 1 - !call Set_UnlatchLed(.false.) - else - data%EquipmentControl%DrillingConsole%LatchPipeLED = 0 - endif - !**call data%State%notifications%OnLatchLedChange%RunAll() - end subroutine - - logical function Get_LatchLed() - implicit none - Get_LatchLed = data%State%notifications%LatchLed - end function - - subroutine Set_IrSafetyValveLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%CloseKellyCockLed => IRSafetyValveLed - use CManifolds, only: & - InstallSafetyValve_TopDrive, & - InstallSafetyValve_KellyMode, & - InstallSafetyValve_TripMode, & - RemoveSafetyValve_TopDrive, & - RemoveSafetyValve_KellyMode, & - RemoveSafetyValve_TripMode - use UnitySignalVariables - use UnitySignalsModule, only: Set_SafetyValve_Install, Set_SafetyValve_Remove - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%IrSafetyValveLed == v) return - #endif - data%State%notifications%IrSafetyValveLed = v - - if(data%State%notifications%IrSafetyValveLed) then - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 - - if(data%State%Hoisting%DriveType == TopDrive_DriveType) call InstallSafetyValve_TopDrive() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 0) call InstallSafetyValve_KellyMode() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 1) call InstallSafetyValve_TripMode() - - call Set_SafetyValve_Install() - else - data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 - - if(data%State%Hoisting%DriveType == TopDrive_DriveType) call RemoveSafetyValve_TopDrive() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 0) call RemoveSafetyValve_KellyMode() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 1) call RemoveSafetyValve_TripMode() - - call Set_SafetyValve_Remove() - endif - - !**call data%State%notifications%OnIrSafetyValveLedChange%RunAll() - end subroutine - - logical function Get_IrSafetyValveLed() - implicit none - Get_IrSafetyValveLed = data%State%notifications%IrSafetyValveLed - end function - - subroutine Set_IrIBopLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: IRIBopLedHw => IRIBopLed - use CManifolds, only: InstallIBop, RemoveIBop - use UnitySignalVariables - use UnitySignalsModule, only: Set_Ibop_Install, Set_Ibop_Remove - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%IrIBopLed == v) return - #endif - data%State%notifications%IrIBopLed = v - if(data%State%notifications%IrIBopLed) then - data%EquipmentControl%DrillingConsole%IRIBopLed = 1 - call InstallIBop() - call Set_Ibop_Install() - else - data%EquipmentControl%DrillingConsole%IRIBopLed = 0 - call RemoveIBop() - call Set_Ibop_Remove() - endif - !**call data%State%notifications%OnIrIBopLedChange%RunAll() - end subroutine - - logical function Get_IrIBopLed() - implicit none - Get_IrIBopLed = data%State%notifications%IrIBopLed - end function - - subroutine Set_FillMouseHoleLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: FillMouseHoleLedHw => FillMouseHoleLed - ! use CMouseHoleEnumVariables - use UnitySignalVariables - use UnitySignalsModule - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%FillMouseHoleLed == v) return - #endif - data%State%notifications%FillMouseHoleLed = v - if(data%State%notifications%FillMouseHoleLed) then - data%EquipmentControl%DrillingConsole%FillMouseHoleLed = 1 - !call Set_MouseHole(MOUSE_HOLE_FILL) - else - data%EquipmentControl%DrillingConsole%FillMouseHoleLed = 0 - !call Set_MouseHole(MOUSE_HOLE_EMPTY) - endif - !**call data%State%notifications%OnFillMouseHoleLedChange%RunAll() - end subroutine - - logical function Get_FillMouseHoleLed() - implicit none - Get_FillMouseHoleLed = data%State%notifications%FillMouseHoleLed - end function - - subroutine Set_CloseKellyCockLed(v) - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables!, only: CloseKellyCockLedHw => CloseKellyCockLed - use CManifolds, only: CloseKellyCock - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%CloseKellyCockLed == v) return - #endif - data%State%notifications%CloseKellyCockLed = v - if(data%State%notifications%CloseKellyCockLed) then - call CloseKellyCock() - endif - !**call data%State%notifications%OnCloseKellyCockLedChange%RunAll() - end subroutine - - logical function Get_CloseKellyCockLed() - implicit none - Get_CloseKellyCockLed = data%State%notifications%CloseKellyCockLed - end function - - subroutine Set_CloseSafetyValveLed(v) - ! use CDrillingConsoleVariables - use SimulationVariables - !@use ConfigurationVariables, only: CloseSafetyValveLedHw => CloseSafetyValveLed - use CManifolds, only: CloseSafetyValve_TopDrive, CloseSafetyValve_KellyMode, CloseSafetyValve_TripMode - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%notifications%CloseSafetyValveLed == v) return - #endif - data%State%notifications%CloseSafetyValveLed = v - if(data%State%notifications%CloseSafetyValveLed) then - !!call CloseSafetyValve() - if(data%State%Hoisting%DriveType == TopDrive_DriveType) call CloseSafetyValve_TopDrive() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_CloseSafetyValveLed == 0) call CloseSafetyValve_KellyMode() - if(data%State%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_CloseSafetyValveLed == 1) call CloseSafetyValve_TripMode() - endif - !**call data%State%notifications%OnCloseSafetyValveLedChange%RunAll() - end subroutine - - logical function Get_CloseSafetyValveLed() - implicit none - Get_CloseSafetyValveLed = data%State%notifications%CloseSafetyValveLed - end function - -end module NotificationModule - +module NotificationModule + use SimulationVariables + implicit none +contains + subroutine Set_UnlatchLed(v) + use CDrillingConsoleVariables + use SimulationVariables + !use CLatchLedNotification + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%UnlatchLed == v) return + #endif + data%State%notifications%UnlatchLed = v + + if(data%State%notifications%UnlatchLed) then + data%EquipmentControl%DrillingConsole%UnlatchPipeLED = 1 + !call Set_LatchLed(.false.) + else + data%EquipmentControl%DrillingConsole%UnlatchPipeLED = 0 + endif + + !**call data%State%notifications%OnUnlatchLedChange%RunAll() + end subroutine + + logical function Get_UnlatchLed() + implicit none + Get_UnlatchLed = data%State%notifications%UnlatchLed + end function + + subroutine Set_TongNotification(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%TongNotification == v) return + #endif + data%State%notifications%TongNotification = v + ! if(associated(data%State%notifications%TongNotificationPtr)) !**call data%State%notifications%TongNotificationPtr(data%State%notifications%TongNotification) + #ifdef deb + print*, 'data%State%notifications%TongNotification=', data%State%notifications%TongNotification + #endif + !**call data%State%notifications%OnTongNotificationChange%RunAll() + end subroutine + + logical function Get_TongNotification() + implicit none + Get_TongNotification = data%State%notifications%TongNotification + end function + + subroutine Set_TorqueWrenchLed(v) + use CTopDrivePanelVariables + use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed + implicit none + integer , intent(in) :: v + + #ifdef ExcludeExtraChanges + if(data%State%notifications%TorqueWrenchLed == v) return + #endif + data%State%notifications%TorqueWrenchLed = v + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = v + !**call data%State%notifications%OnTorqueWrenchLedChange%RunAll() + end subroutine + + logical function Get_TorqueWrenchLed() + implicit none + Get_TorqueWrenchLed = data%State%notifications%TorqueWrenchLed + end function + + subroutine Set_PowerLed(v) + use CTopDrivePanelVariables + use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed + !use CLatchLedNotification + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%PowerLed == v) return + #endif + data%State%notifications%PowerLed = v + + if(data%State%notifications%PowerLed) then + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = 1 + !call Set_LatchLed(.false.) + else + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = 0 + endif + + !**call data%State%notifications%OnPowerLedChange%RunAll() + end subroutine + + logical function Get_PowerLed() + implicit none + Get_PowerLed = data%State%notifications%PowerLed + end function + + subroutine Set_IbopLed(v) + use CTopDrivePanelVariables + use SimulationVariables!, only: data%EquipmentControl%TopDrivePanel%TopDriveIbopLed + use CManifolds, Only: OpenTopDriveIBop, CloseTopDriveIBop + !use CLatchLedNotification + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%IbopLed == v) return + #endif + data%State%notifications%IbopLed = v + + if(data%State%notifications%IbopLed) then + data%EquipmentControl%TopDrivePanel%TopDriveIbopLed = 1 + call CloseTopDriveIBop() + else + data%EquipmentControl%TopDrivePanel%TopDriveIbopLed = 0 + call OpenTopDriveIBop() + endif + + !**call data%State%notifications%OnIbopLedChange%RunAll() + end subroutine + + logical function Get_IbopLed() + implicit none + Get_IbopLed = data%State%notifications%IbopLed + end function + + subroutine Set_SwingLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: SwingLedHw => SwingLed + implicit none + logical , intent(in) :: v + + #ifdef ExcludeExtraChanges + if(data%State%notifications%SwingLed == v) return + #endif + data%State%notifications%SwingLed = v + if(data%State%notifications%SwingLed) then + data%EquipmentControl%DrillingConsole%SwingLed = 1 + else + data%EquipmentControl%DrillingConsole%SwingLed = 0 + endif + !**call data%State%notifications%OnSwingLedChange%RunAll() + end subroutine + + logical function Get_SwingLed() + implicit none + Get_SwingLed = data%State%notifications%SwingLed + end function + + subroutine Set_SlipsNotification(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%SlipsNotification == v) return + #endif + data%State%notifications%SlipsNotification = v + ! if(associated(data%State%notifications%SlipsNotificationPtr)) !**call data%State%notifications%SlipsNotificationPtr(data%State%notifications%SlipsNotification) + #ifdef deb + print*, 'data%State%notifications%SlipsNotification=', data%State%notifications%SlipsNotification + #endif + !**call data%State%notifications%OnSlipsNotificationChange%RunAll() + end subroutine + + logical function Get_SlipsNotification() + implicit none + Get_SlipsNotification = data%State%notifications%SlipsNotification + end function + + subroutine Set_OpenSafetyValveLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: OpenSafetyValveLedHw => OpenSafetyValveLed + use CManifolds, only: OpenSafetyValve_TopDrive, OpenSafetyValve_KellyMode, OpenSafetyValve_TripMode + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%OpenSafetyValveLed == v) return + #endif + data%State%notifications%OpenSafetyValveLed = v + + if(data%State%notifications%OpenSafetyValveLed) then + !!call OpenSafetyValve() + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) call OpenSafetyValve_TopDrive() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_OpenSafetyValveLed == 0) call OpenSafetyValve_KellyMode() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_OpenSafetyValveLed == 1) call OpenSafetyValve_TripMode() + endif + + !**call data%State%notifications%OnOpenSafetyValveLedChange%RunAll() + end subroutine + + logical function Get_OpenSafetyValveLed() + implicit none + Get_OpenSafetyValveLed = data%State%notifications%OpenSafetyValveLed + end function + + subroutine Set_OpenKellyCockLed(v) + ! use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: OpenKellyCockLedHw => OpenKellyCockLed + use CManifolds, only: OpenKellyCock + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%OpenKellyCockLed == v) return + #endif + data%State%notifications%OpenKellyCockLed = v + + if(data%State%notifications%OpenKellyCockLed) then + call OpenKellyCock() + endif + + ! HAS BEEN IMPLEMENTED IN CMANIFOLD + + !if(OpenKellyCockLed) then + ! OpenKellyCockLedHw = 1 + !else + ! OpenKellyCockLedHw = 0 + !endif + + !**call data%State%notifications%OnOpenKellyCockLedChange%RunAll() + end subroutine + + logical function Get_OpenKellyCockLed() + implicit none + Get_OpenKellyCockLed = data%State%notifications%OpenKellyCockLed + end function + + subroutine Set_LatchLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%LatchPipeLED + !use CUnlatchLedNotification + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%LatchLed == v) return + #endif + data%State%notifications%LatchLed = v + if(data%State%notifications%LatchLed) then + data%EquipmentControl%DrillingConsole%LatchPipeLED = 1 + !call Set_UnlatchLed(.false.) + else + data%EquipmentControl%DrillingConsole%LatchPipeLED = 0 + endif + !**call data%State%notifications%OnLatchLedChange%RunAll() + end subroutine + + logical function Get_LatchLed() + implicit none + Get_LatchLed = data%State%notifications%LatchLed + end function + + subroutine Set_IrSafetyValveLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: data%EquipmentControl%DrillingConsole%CloseKellyCockLed => IRSafetyValveLed + use CManifolds, only: & + InstallSafetyValve_TopDrive, & + InstallSafetyValve_KellyMode, & + InstallSafetyValve_TripMode, & + RemoveSafetyValve_TopDrive, & + RemoveSafetyValve_KellyMode, & + RemoveSafetyValve_TripMode + use UnitySignalVariables + use UnitySignalsModule, only: Set_SafetyValve_Install, Set_SafetyValve_Remove + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%IrSafetyValveLed == v) return + #endif + data%State%notifications%IrSafetyValveLed = v + + if(data%State%notifications%IrSafetyValveLed) then + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 1 + + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) call InstallSafetyValve_TopDrive() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 0) call InstallSafetyValve_KellyMode() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 1) call InstallSafetyValve_TripMode() + + call Set_SafetyValve_Install() + else + data%EquipmentControl%DrillingConsole%IRSafetyValveLed = 0 + + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) call RemoveSafetyValve_TopDrive() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 0) call RemoveSafetyValve_KellyMode() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_IrSafetyValveLed == 1) call RemoveSafetyValve_TripMode() + + call Set_SafetyValve_Remove() + endif + + !**call data%State%notifications%OnIrSafetyValveLedChange%RunAll() + end subroutine + + logical function Get_IrSafetyValveLed() + implicit none + Get_IrSafetyValveLed = data%State%notifications%IrSafetyValveLed + end function + + subroutine Set_IrIBopLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: IRIBopLedHw => IRIBopLed + use CManifolds, only: InstallIBop, RemoveIBop + use UnitySignalVariables + use UnitySignalsModule, only: Set_Ibop_Install, Set_Ibop_Remove + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%IrIBopLed == v) return + #endif + data%State%notifications%IrIBopLed = v + if(data%State%notifications%IrIBopLed) then + data%EquipmentControl%DrillingConsole%IRIBopLed = 1 + call InstallIBop() + call Set_Ibop_Install() + else + data%EquipmentControl%DrillingConsole%IRIBopLed = 0 + call RemoveIBop() + call Set_Ibop_Remove() + endif + !**call data%State%notifications%OnIrIBopLedChange%RunAll() + end subroutine + + logical function Get_IrIBopLed() + implicit none + Get_IrIBopLed = data%State%notifications%IrIBopLed + end function + + subroutine Set_FillMouseHoleLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: FillMouseHoleLedHw => FillMouseHoleLed + ! use CMouseHoleEnumVariables + use UnitySignalVariables + use UnitySignalsModule + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%FillMouseHoleLed == v) return + #endif + data%State%notifications%FillMouseHoleLed = v + if(data%State%notifications%FillMouseHoleLed) then + data%EquipmentControl%DrillingConsole%FillMouseHoleLed = 1 + !call Set_MouseHole(MOUSE_HOLE_FILL) + else + data%EquipmentControl%DrillingConsole%FillMouseHoleLed = 0 + !call Set_MouseHole(MOUSE_HOLE_EMPTY) + endif + !**call data%State%notifications%OnFillMouseHoleLedChange%RunAll() + end subroutine + + logical function Get_FillMouseHoleLed() + implicit none + Get_FillMouseHoleLed = data%State%notifications%FillMouseHoleLed + end function + + subroutine Set_CloseKellyCockLed(v) + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables!, only: CloseKellyCockLedHw => CloseKellyCockLed + use CManifolds, only: CloseKellyCock + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%CloseKellyCockLed == v) return + #endif + data%State%notifications%CloseKellyCockLed = v + if(data%State%notifications%CloseKellyCockLed) then + call CloseKellyCock() + endif + !**call data%State%notifications%OnCloseKellyCockLedChange%RunAll() + end subroutine + + logical function Get_CloseKellyCockLed() + implicit none + Get_CloseKellyCockLed = data%State%notifications%CloseKellyCockLed + end function + + subroutine Set_CloseSafetyValveLed(v) + ! use CDrillingConsoleVariables + use SimulationVariables + !@use ConfigurationVariables, only: CloseSafetyValveLedHw => CloseSafetyValveLed + use CManifolds, only: CloseSafetyValve_TopDrive, CloseSafetyValve_KellyMode, CloseSafetyValve_TripMode + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, TopDrive_DriveType, Kelly_DriveType + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%notifications%CloseSafetyValveLed == v) return + #endif + data%State%notifications%CloseSafetyValveLed = v + if(data%State%notifications%CloseSafetyValveLed) then + !!call CloseSafetyValve() + if(data%Configuration%Hoisting%DriveType == TopDrive_DriveType) call CloseSafetyValve_TopDrive() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_CloseSafetyValveLed == 0) call CloseSafetyValve_KellyMode() + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType .and. data%State%notifications%operation_CloseSafetyValveLed == 1) call CloseSafetyValve_TripMode() + endif + !**call data%State%notifications%OnCloseSafetyValveLedChange%RunAll() + end subroutine + + logical function Get_CloseSafetyValveLed() + implicit none + Get_CloseSafetyValveLed = data%State%notifications%CloseSafetyValveLed + end function + +end module NotificationModule + diff --git a/CSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 b/CSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 index 000f16c..c41747f 100644 --- a/CSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 @@ -1,54 +1,54 @@ -module CFillupHeadPermission - use OperationScenariosModule - implicit none - - contains - - subroutine Evaluate_FillupHeadPermission() - ! use UnitySignalsModule !for CTdsConnectionModesEnum - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_FillupHeadPermission=TopDrive' -#endif - - - !TOPDRIVE-CODE=66 - if (Get_NearFloorConnection() >= 3 .and. Get_NearFloorConnection() <= 10 .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_FillupHeadPermission(.true.) - return - end if - - - call Set_FillupHeadPermission(.false.) - - - endif - - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_FillupHeadPermission=Kelly' -!#endif -! endif - - - - end subroutine - - subroutine Subscribe_FillupHeadPermission() - implicit none - end subroutine - +module CFillupHeadPermission + use OperationScenariosModule + implicit none + + contains + + subroutine Evaluate_FillupHeadPermission() + ! use UnitySignalsModule !for CTdsConnectionModesEnum + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_FillupHeadPermission=TopDrive' +#endif + + + !TOPDRIVE-CODE=66 + if (Get_NearFloorConnection() >= 3 .and. Get_NearFloorConnection() <= 10 .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_FillupHeadPermission(.true.) + return + end if + + + call Set_FillupHeadPermission(.false.) + + + endif + + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_FillupHeadPermission=Kelly' +!#endif +! endif + + + + end subroutine + + subroutine Subscribe_FillupHeadPermission() + implicit none + end subroutine + end module CFillupHeadPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 b/CSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 index ef3a71b..d856bd4 100644 --- a/CSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 @@ -1,76 +1,76 @@ -module CInstallFillupHeadPermission - use OperationScenariosModule - implicit none - - contains - - subroutine Evaluate_InstallFillupHeadPermission() - use TD_DrillStemComponents - implicit none - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_InstallFillupHeadPermission=TopDrive' -#endif - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_InstallFillupHeadPermission=Kelly' -#endif - - - !!OPERATION-CODE=69 - !if (Get_OperationCondition() == OPERATION_DRILL .and.& - ! Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& - ! Get_JointConnectionPossible() == .false. .and.& - ! Get_KellyConnection() /= KELLY_CONNECTION_STRING .and.& - ! Get_Slips() == SLIPS_SET_END) then - ! - ! call Set_InstallFillupHeadPermission(.true.) - ! return - !end if - - - - !OPERATION-CODE=70 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - data%State%TD_String%TopJointHeight >= 3.0 .and. data%State%TD_String%TopJointHeight <= 9.0 .and.& - Get_JointConnectionPossible() == .false. .and.& - !Get_ElevatorConnectionPossible() == .false. .and.& - !Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING) then - - call Set_InstallFillupHeadPermission(.true.) - return - end if - - - - - call Set_InstallFillupHeadPermission(.false.) - - endif - - - - - - end subroutine - - subroutine Subscribe_InstallFillupHeadPermission() - implicit none - ! imp me... - end subroutine - +module CInstallFillupHeadPermission + use OperationScenariosModule + implicit none + + contains + + subroutine Evaluate_InstallFillupHeadPermission() + use TD_DrillStemComponents + implicit none + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_InstallFillupHeadPermission=TopDrive' +#endif + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_InstallFillupHeadPermission=Kelly' +#endif + + + !!OPERATION-CODE=69 + !if (Get_OperationCondition() == OPERATION_DRILL .and.& + ! Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 6.0 .and.& + ! Get_JointConnectionPossible() == .false. .and.& + ! Get_KellyConnection() /= KELLY_CONNECTION_STRING .and.& + ! Get_Slips() == SLIPS_SET_END) then + ! + ! call Set_InstallFillupHeadPermission(.true.) + ! return + !end if + + + + !OPERATION-CODE=70 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + data%State%TD_String%TopJointHeight >= 3.0 .and. data%State%TD_String%TopJointHeight <= 9.0 .and.& + Get_JointConnectionPossible() == .false. .and.& + !Get_ElevatorConnectionPossible() == .false. .and.& + !Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING) then + + call Set_InstallFillupHeadPermission(.true.) + return + end if + + + + + call Set_InstallFillupHeadPermission(.false.) + + endif + + + + + + end subroutine + + subroutine Subscribe_InstallFillupHeadPermission() + implicit none + ! imp me... + end subroutine + end module CInstallFillupHeadPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 b/CSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 index 72988aa..ad51fe8 100644 --- a/CSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 @@ -1,36 +1,36 @@ -module CInstallMudBucketPermission - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_InstallMudBucketPermission() - implicit none - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_InstallMudBucketPermission=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_InstallMudBucketPermission=Kelly' -!#endif -! endif - - - end subroutine - - subroutine Subscribe_InstallMudBucketPermission() - implicit none - ! imp me... - end subroutine - +module CInstallMudBucketPermission + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_InstallMudBucketPermission() + implicit none + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_InstallMudBucketPermission=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_InstallMudBucketPermission=Kelly' +!#endif +! endif + + + end subroutine + + subroutine Subscribe_InstallMudBucketPermission() + implicit none + ! imp me... + end subroutine + end module CInstallMudBucketPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 b/CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 index cf16c06..70bd32d 100644 --- a/CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 @@ -1,93 +1,93 @@ -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%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IrIbopPermission=TopDrive' -#endif - - - !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%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_IrIbopPermission=Kelly' -#endif - - !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 - +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 +#ifdef OST + print*, 'Evaluate_IrIbopPermission=TopDrive' +#endif + + + !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 +#ifdef OST + print*, 'Evaluate_IrIbopPermission=Kelly' +#endif + + !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 \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 b/CSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 index d281370..402e71e 100644 --- a/CSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 @@ -1,87 +1,87 @@ -module CIrSafetyValvePermission - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_IrSafetyValvePermission() - use TD_DrillStemComponents - use CStudentStationVariables!!, only: data%State%StudentStation%FillupHeadInstallation - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValvePermission=TopDrive' -#endif - - - - !TOPDRIVE-CODE=55 - if (GetRotaryRpm() == 0.0d0 .and.& - (Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 10.0) .and.& - Get_JointConnectionPossible() == .false. .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - data%State%StudentStation%FillupHeadInstallation == .false.) then - - call Set_IrSafetyValvePermission(.true.) - return - end if - - - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_IrSafetyValvePermission=Kelly' -#endif - - - !OPERATION-CODE=57 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - GetRotaryRpm() == 0.0d0 .and.& - !(Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& - !Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 10.0 .and.& - data%State%TD_String%TopJointHeight >= 3.0 .and. data%State%TD_String%TopJointHeight <= 10.0 .and.& - !Get_SafetyValveHeight() >= 22.0 .and. Get_SafetyValveHeight() <= 35.0 .and.& - Get_JointConnectionPossible() == .false. .and.& - Get_FillupHead() == FILLUP_HEAD_REMOVE .and.& - Get_Swing() == SWING_WELL_END) then - call Set_IrSafetyValvePermission(.true.) - return - end if - - - - - - call Set_IrSafetyValvePermission(.false.) - - endif - - - - - - - - - - - end subroutine - - subroutine Subscribe_IrSafetyValvePermission() - implicit none - ! imp me... - end subroutine - +module CIrSafetyValvePermission + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_IrSafetyValvePermission() + use TD_DrillStemComponents + use CStudentStationVariables!!, only: data%State%StudentStation%FillupHeadInstallation + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValvePermission=TopDrive' +#endif + + + + !TOPDRIVE-CODE=55 + if (GetRotaryRpm() == 0.0d0 .and.& + (Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 10.0) .and.& + Get_JointConnectionPossible() == .false. .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + data%State%StudentStation%FillupHeadInstallation == .false.) then + + call Set_IrSafetyValvePermission(.true.) + return + end if + + + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_IrSafetyValvePermission=Kelly' +#endif + + + !OPERATION-CODE=57 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + GetRotaryRpm() == 0.0d0 .and.& + !(Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .or. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) .and.& + !Get_NearFloorConnection() >= 3.0 .and. Get_NearFloorConnection() <= 10.0 .and.& + data%State%TD_String%TopJointHeight >= 3.0 .and. data%State%TD_String%TopJointHeight <= 10.0 .and.& + !Get_SafetyValveHeight() >= 22.0 .and. Get_SafetyValveHeight() <= 35.0 .and.& + Get_JointConnectionPossible() == .false. .and.& + Get_FillupHead() == FILLUP_HEAD_REMOVE .and.& + Get_Swing() == SWING_WELL_END) then + call Set_IrSafetyValvePermission(.true.) + return + end if + + + + + + call Set_IrSafetyValvePermission(.false.) + + endif + + + + + + + + + + + end subroutine + + subroutine Subscribe_IrSafetyValvePermission() + implicit none + ! imp me... + end subroutine + end module CIrSafetyValvePermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 b/CSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 index 4af31ed..306ec53 100644 --- a/CSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 @@ -1,36 +1,36 @@ -module CRemoveFillupHeadPermission - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_RemoveFillupHeadPermission() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_RemoveFillupHeadPermission=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_RemoveFillupHeadPermission=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_RemoveFillupHeadPermission() - implicit none - ! imp me... - end subroutine - +module CRemoveFillupHeadPermission + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_RemoveFillupHeadPermission() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_RemoveFillupHeadPermission=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_RemoveFillupHeadPermission=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_RemoveFillupHeadPermission() + implicit none + ! imp me... + end subroutine + end module CRemoveFillupHeadPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 b/CSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 index 506cc94..5fc280c 100644 --- a/CSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 @@ -1,34 +1,34 @@ -module CRemoveMudBucketPermission - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_RemoveMudBucketPermission() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_RemoveMudBucketPermission=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_RemoveMudBucketPermission=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_RemoveMudBucketPermission() - implicit none - ! imp me... - end subroutine - +module CRemoveMudBucketPermission + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_RemoveMudBucketPermission() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_RemoveMudBucketPermission=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_RemoveMudBucketPermission=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_RemoveMudBucketPermission() + implicit none + ! imp me... + end subroutine + end module CRemoveMudBucketPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 b/CSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 index e23a178..f305229 100644 --- a/CSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 @@ -1,61 +1,61 @@ -module CSwingDrillPermission - use OperationScenariosModule - use CTopDrivePanelVariables - use SimulationVariables - implicit none - - contains - - subroutine Evaluate_SwingDrillPermission() - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingDrillPermission=TopDrive' -#endif - - !TOPDRIVE-CODE=33 - if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - - call Set_SwingDrillPermission(.true.) - return - end if - - - - - - - call Set_SwingDrillPermission(.false.) - - - - - - endif - - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_SwingDrillPermission=Kelly' -!#endif -! endif - - - end subroutine - - subroutine Subscribe_SwingDrillPermission() - implicit none - end subroutine - +module CSwingDrillPermission + use OperationScenariosModule + use CTopDrivePanelVariables + use SimulationVariables + implicit none + + contains + + subroutine Evaluate_SwingDrillPermission() + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingDrillPermission=TopDrive' +#endif + + !TOPDRIVE-CODE=33 + if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + + call Set_SwingDrillPermission(.true.) + return + end if + + + + + + + call Set_SwingDrillPermission(.false.) + + + + + + endif + + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_SwingDrillPermission=Kelly' +!#endif +! endif + + + end subroutine + + subroutine Subscribe_SwingDrillPermission() + implicit none + end subroutine + end module CSwingDrillPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 b/CSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 index d6466cf..2fab1ea 100644 --- a/CSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 @@ -1,67 +1,67 @@ -module CSwingOffPermission - use OperationScenariosModule - implicit none - - contains - - subroutine Evaluate_SwingOffPermission() - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingOffPermission=TopDrive' -#endif - - - - !TOPDRIVE-CODE=35 - if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - Get_Slips() == SLIPS_SET_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - - call Set_SwingOffPermission(.true.) - return - end if - - - - - !TOPDRIVE-CODE=36 - if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_DRILL_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - - call Set_SwingOffPermission(.true.) - return - end if - - - - call Set_SwingOffPermission(.false.) - - endif - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_SwingOffPermission=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_SwingOffPermission() - implicit none - end subroutine - +module CSwingOffPermission + use OperationScenariosModule + implicit none + + contains + + subroutine Evaluate_SwingOffPermission() + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingOffPermission=TopDrive' +#endif + + + + !TOPDRIVE-CODE=35 + if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + Get_Slips() == SLIPS_SET_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + + call Set_SwingOffPermission(.true.) + return + end if + + + + + !TOPDRIVE-CODE=36 + if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_DRILL_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + + call Set_SwingOffPermission(.true.) + return + end if + + + + call Set_SwingOffPermission(.false.) + + endif + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_SwingOffPermission=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_SwingOffPermission() + implicit none + end subroutine + end module CSwingOffPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 b/CSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 index 1dbcb57..ddcf44f 100644 --- a/CSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 +++ b/CSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 @@ -1,54 +1,54 @@ -module CSwingTiltPermission - use UnitySignalsModule - use OperationScenariosModule - use SimulationVariables - implicit none - - contains - - subroutine Evaluate_SwingTiltPermission() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_SwingTiltPermission=TopDrive' -#endif - - - !TOPDRIVE-CODE=34 - if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_Slips() == SLIPS_SET_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then - - call Set_SwingTiltPermission(.true.) - return - end if - - - call Set_SwingTiltPermission(.false.) - - endif - - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_SwingTiltPermission=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_SwingTiltPermission() - implicit none - end subroutine - +module CSwingTiltPermission + use UnitySignalsModule + use OperationScenariosModule + use SimulationVariables + implicit none + + contains + + subroutine Evaluate_SwingTiltPermission() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_SwingTiltPermission=TopDrive' +#endif + + + !TOPDRIVE-CODE=34 + if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_Slips() == SLIPS_SET_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF) then + + call Set_SwingTiltPermission(.true.) + return + end if + + + call Set_SwingTiltPermission(.false.) + + endif + + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_SwingTiltPermission=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_SwingTiltPermission() + implicit none + end subroutine + end module CSwingTiltPermission \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/Permissions.f90 b/CSharp/OperationScenarios/Permissions/Permissions.f90 index 3a8a50f..10240cd 100644 --- a/CSharp/OperationScenarios/Permissions/Permissions.f90 +++ b/CSharp/OperationScenarios/Permissions/Permissions.f90 @@ -1,188 +1,188 @@ -module PermissionsModule - use SimulationVariables - implicit none - -contains - subroutine Set_SwingTiltPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%SwingTiltPermission == v) return - #endif - data%State%permissions%SwingTiltPermission = v - #ifdef deb - print*, 'data%State%permissions%SwingTiltPermission=', data%State%permissions%SwingTiltPermission - #endif - !**call data%State%permissions%OnSwingTiltPermissionChange%RunAll() - end subroutine - - logical function Get_SwingTiltPermission() - implicit none - Get_SwingTiltPermission = data%State%permissions%SwingTiltPermission - end function - - subroutine Set_SwingOffPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%SwingOffPermission == v) return - #endif - data%State%permissions%SwingOffPermission = v - #ifdef deb - print*, 'data%State%permissions%SwingOffPermission=', data%State%permissions%SwingOffPermission - #endif - !**call data%State%permissions%OnSwingOffPermissionChange%RunAll() - end subroutine - - logical function Get_SwingOffPermission() - implicit none - Get_SwingOffPermission = data%State%permissions%SwingOffPermission - end function - - subroutine Set_SwingDrillPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%SwingDrillPermission == v) return - #endif - data%State%permissions%SwingDrillPermission = v - #ifdef deb - print*, 'data%State%permissions%SwingDrillPermission=', data%State%permissions%SwingDrillPermission - #endif - !**call data%State%permissions%OnSwingDrillPermissionChange%RunAll() - end subroutine - - logical function Get_SwingDrillPermission() - implicit none - Get_SwingDrillPermission = data%State%permissions%SwingDrillPermission - end function - - subroutine Set_RemoveMudBucketPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%RemoveMudBucketPermission == v) return - #endif - data%State%permissions%RemoveMudBucketPermission = v - #ifdef deb - print*, 'data%State%permissions%RemoveMudBucketPermission=', data%State%permissions%RemoveMudBucketPermission - #endif - !**call data%State%permissions%OnRemoveMudBucketPermissionChange%RunAll() - end subroutine - - logical function Get_RemoveMudBucketPermission() - implicit none - Get_RemoveMudBucketPermission = data%State%permissions%RemoveMudBucketPermission - end function - - - subroutine Set_RemoveFillupHeadPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%RemoveFillupHeadPermission == v) return - #endif - data%State%permissions%RemoveFillupHeadPermission = v - #ifdef deb - print*, 'data%State%permissions%RemoveFillupHeadPermission=', data%State%permissions%RemoveFillupHeadPermission - #endif - !**call data%State%permissions%OnRemoveFillupHeadPermissionChange%RunAll() - end subroutine - - logical function Get_RemoveFillupHeadPermission() - implicit none - Get_RemoveFillupHeadPermission = data%State%permissions%RemoveFillupHeadPermission - end function - - subroutine Set_IrSafetyValvePermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%IrSafetyValvePermission == v) return - #endif - data%State%permissions%IrSafetyValvePermission = v - #ifdef deb - print*, 'data%State%permissions%IrSafetyValvePermission=', data%State%permissions%IrSafetyValvePermission - #endif - !**call data%State%permissions%OnIrSafetyValvePermissionChange%RunAll() - end subroutine - - logical function Get_IrSafetyValvePermission() - implicit none - Get_IrSafetyValvePermission = data%State%permissions%IrSafetyValvePermission - end function - - subroutine Set_IrIbopPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%IrIbopPermission == v) return - #endif - data%State%permissions%IrIbopPermission = v - #ifdef deb - print*, 'data%State%permissions%IrIbopPermission=', data%State%permissions%IrIbopPermission - #endif - !**call data%State%permissions%OnIrIbopPermissionChange%RunAll() - end subroutine - - logical function Get_IrIbopPermission() - implicit none - Get_IrIbopPermission = data%State%permissions%IrIbopPermission - end function - - - subroutine Set_InstallMudBucketPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%InstallMudBucketPermission == v) return - #endif - data%State%permissions%InstallMudBucketPermission = v - #ifdef deb - print*, 'data%State%permissions%InstallMudBucketPermission=', data%State%permissions%InstallMudBucketPermission - #endif - !**call data%State%permissions%OnInstallMudBucketPermissionChange%RunAll() - end subroutine - - logical function Get_InstallMudBucketPermission() - implicit none - Get_InstallMudBucketPermission = data%State%permissions%InstallMudBucketPermission - end function - - subroutine Set_InstallFillupHeadPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%InstallFillupHeadPermission == v) return - #endif - data%State%permissions%InstallFillupHeadPermission = v - #ifdef deb - print*, 'InstallFillupHeadPermission=', data%State%permissions%InstallFillupHeadPermission - #endif - !**call data%State%permissions%OnInstallFillupHeadPermissionChange%RunAll() - end subroutine - - logical function Get_InstallFillupHeadPermission() - implicit none - Get_InstallFillupHeadPermission = data%State%permissions%InstallFillupHeadPermission - end function - - subroutine Set_FillupHeadPermission(v) - implicit none - logical , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%permissions%FillupHeadPermission == v) return - #endif - data%State%permissions%FillupHeadPermission = v - #ifdef deb - print*, 'FillupHeadPermission=', data%State%permissions%FillupHeadPermission - #endif - !**call data%State%permissions%OnFillupHeadPermissionChange%RunAll() - end subroutine - - logical function Get_FillupHeadPermission() - implicit none - Get_FillupHeadPermission = data%State%permissions%FillupHeadPermission - end function - +module PermissionsModule + use SimulationVariables + implicit none + +contains + subroutine Set_SwingTiltPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%SwingTiltPermission == v) return + #endif + data%State%permissions%SwingTiltPermission = v + #ifdef deb + print*, 'data%State%permissions%SwingTiltPermission=', data%State%permissions%SwingTiltPermission + #endif + !**call data%State%permissions%OnSwingTiltPermissionChange%RunAll() + end subroutine + + logical function Get_SwingTiltPermission() + implicit none + Get_SwingTiltPermission = data%State%permissions%SwingTiltPermission + end function + + subroutine Set_SwingOffPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%SwingOffPermission == v) return + #endif + data%State%permissions%SwingOffPermission = v + #ifdef deb + print*, 'data%State%permissions%SwingOffPermission=', data%State%permissions%SwingOffPermission + #endif + !**call data%State%permissions%OnSwingOffPermissionChange%RunAll() + end subroutine + + logical function Get_SwingOffPermission() + implicit none + Get_SwingOffPermission = data%State%permissions%SwingOffPermission + end function + + subroutine Set_SwingDrillPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%SwingDrillPermission == v) return + #endif + data%State%permissions%SwingDrillPermission = v + #ifdef deb + print*, 'data%State%permissions%SwingDrillPermission=', data%State%permissions%SwingDrillPermission + #endif + !**call data%State%permissions%OnSwingDrillPermissionChange%RunAll() + end subroutine + + logical function Get_SwingDrillPermission() + implicit none + Get_SwingDrillPermission = data%State%permissions%SwingDrillPermission + end function + + subroutine Set_RemoveMudBucketPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%RemoveMudBucketPermission == v) return + #endif + data%State%permissions%RemoveMudBucketPermission = v + #ifdef deb + print*, 'data%State%permissions%RemoveMudBucketPermission=', data%State%permissions%RemoveMudBucketPermission + #endif + !**call data%State%permissions%OnRemoveMudBucketPermissionChange%RunAll() + end subroutine + + logical function Get_RemoveMudBucketPermission() + implicit none + Get_RemoveMudBucketPermission = data%State%permissions%RemoveMudBucketPermission + end function + + + subroutine Set_RemoveFillupHeadPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%RemoveFillupHeadPermission == v) return + #endif + data%State%permissions%RemoveFillupHeadPermission = v + #ifdef deb + print*, 'data%State%permissions%RemoveFillupHeadPermission=', data%State%permissions%RemoveFillupHeadPermission + #endif + !**call data%State%permissions%OnRemoveFillupHeadPermissionChange%RunAll() + end subroutine + + logical function Get_RemoveFillupHeadPermission() + implicit none + Get_RemoveFillupHeadPermission = data%State%permissions%RemoveFillupHeadPermission + end function + + subroutine Set_IrSafetyValvePermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%IrSafetyValvePermission == v) return + #endif + data%State%permissions%IrSafetyValvePermission = v + #ifdef deb + print*, 'data%State%permissions%IrSafetyValvePermission=', data%State%permissions%IrSafetyValvePermission + #endif + !**call data%State%permissions%OnIrSafetyValvePermissionChange%RunAll() + end subroutine + + logical function Get_IrSafetyValvePermission() + implicit none + Get_IrSafetyValvePermission = data%State%permissions%IrSafetyValvePermission + end function + + subroutine Set_IrIbopPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%IrIbopPermission == v) return + #endif + data%State%permissions%IrIbopPermission = v + #ifdef deb + print*, 'data%State%permissions%IrIbopPermission=', data%State%permissions%IrIbopPermission + #endif + !**call data%State%permissions%OnIrIbopPermissionChange%RunAll() + end subroutine + + logical function Get_IrIbopPermission() + implicit none + Get_IrIbopPermission = data%State%permissions%IrIbopPermission + end function + + + subroutine Set_InstallMudBucketPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%InstallMudBucketPermission == v) return + #endif + data%State%permissions%InstallMudBucketPermission = v + #ifdef deb + print*, 'data%State%permissions%InstallMudBucketPermission=', data%State%permissions%InstallMudBucketPermission + #endif + !**call data%State%permissions%OnInstallMudBucketPermissionChange%RunAll() + end subroutine + + logical function Get_InstallMudBucketPermission() + implicit none + Get_InstallMudBucketPermission = data%State%permissions%InstallMudBucketPermission + end function + + subroutine Set_InstallFillupHeadPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%InstallFillupHeadPermission == v) return + #endif + data%State%permissions%InstallFillupHeadPermission = v + #ifdef deb + print*, 'InstallFillupHeadPermission=', data%State%permissions%InstallFillupHeadPermission + #endif + !**call data%State%permissions%OnInstallFillupHeadPermissionChange%RunAll() + end subroutine + + logical function Get_InstallFillupHeadPermission() + implicit none + Get_InstallFillupHeadPermission = data%State%permissions%InstallFillupHeadPermission + end function + + subroutine Set_FillupHeadPermission(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%permissions%FillupHeadPermission == v) return + #endif + data%State%permissions%FillupHeadPermission = v + #ifdef deb + print*, 'FillupHeadPermission=', data%State%permissions%FillupHeadPermission + #endif + !**call data%State%permissions%OnFillupHeadPermissionChange%RunAll() + end subroutine + + logical function Get_FillupHeadPermission() + implicit none + Get_FillupHeadPermission = data%State%permissions%FillupHeadPermission + end function + end module PermissionsModule \ No newline at end of file diff --git a/CSharp/OperationScenarios/Permissions/PermissionsVariables.f90 b/CSharp/OperationScenarios/Permissions/PermissionsVariables.f90 index 0949319..0fe0f52 100644 --- a/CSharp/OperationScenarios/Permissions/PermissionsVariables.f90 +++ b/CSharp/OperationScenarios/Permissions/PermissionsVariables.f90 @@ -1,16 +1,16 @@ -module PermissionsVariables -! use CVoidEventHandlerCollection - type::PermissionsType - logical :: FillupHeadPermission = .false. - logical :: InstallFillupHeadPermission = .false. - logical :: InstallMudBucketPermission = .false. - logical :: IrIbopPermission = .false. - logical :: IrSafetyValvePermission = .false. - logical :: RemoveFillupHeadPermission = .false. - logical :: RemoveMudBucketPermission = .false. - logical :: SwingDrillPermission = .false. - logical :: SwingOffPermission = .false. - logical :: SwingTiltPermission = .false. - end type PermissionsType - contains +module PermissionsVariables +! use CVoidEventHandlerCollection + type::PermissionsType + logical :: FillupHeadPermission = .false. + logical :: InstallFillupHeadPermission = .false. + logical :: InstallMudBucketPermission = .false. + logical :: IrIbopPermission = .false. + logical :: IrSafetyValvePermission = .false. + logical :: RemoveFillupHeadPermission = .false. + logical :: RemoveMudBucketPermission = .false. + logical :: SwingDrillPermission = .false. + logical :: SwingOffPermission = .false. + logical :: SwingTiltPermission = .false. + end type PermissionsType + contains end module \ No newline at end of file diff --git a/CSharp/OperationScenarios/SoftwareInputs.f90 b/CSharp/OperationScenarios/SoftwareInputs.f90 new file mode 100644 index 0000000..7841f78 --- /dev/null +++ b/CSharp/OperationScenarios/SoftwareInputs.f90 @@ -0,0 +1,173 @@ +module SoftwareInputsModule + use SimulationVariables + + contains + + subroutine Set_ZeroStringSpeed(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%ZeroStringSpeed == v) return + #endif + data%State%softwareInputs%ZeroStringSpeed = v + #ifdef deb + print*, 'ZeroStringSpeed=', data%State%softwareInputs%ZeroStringSpeed + #endif + ! call data%State%softwareInputs%OnZeroStringSpeedChange%RunAll() + end subroutine + + logical function Get_ZeroStringSpeed() + implicit none + Get_ZeroStringSpeed = data%State%softwareInputs%ZeroStringSpeed + !Get_ZeroStringSpeed = .true. + end function + + subroutine Set_TdsStemJointHeight(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%TdsStemJointHeight == v) return + #endif + data%State%softwareInputs%TdsStemJointHeight = v + #ifdef deb + print*, 'TdsStemJointHeight=', data%State%softwareInputs%TdsStemJointHeight + #endif + ! call data%State%softwareInputs%OnTdsStemJointHeightChange%RunAll() + end subroutine + + real function Get_TdsStemJointHeight() + implicit none + Get_TdsStemJointHeight = data%State%softwareInputs%TdsStemJointHeight + end function + + + subroutine Set_StringPressure(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%StringPressure == v) return + #endif + data%State%softwareInputs%StringPressure = v + #ifdef deb + print*, 'StringPressure=', data%State%softwareInputs%StringPressure + #endif + ! call data%State%softwareInputs%OnStringPressureChange%RunAll() + end subroutine + + real function Get_StringPressure() + implicit none + Get_StringPressure = data%State%softwareInputs%StringPressure + end function + + subroutine Set_StandRack(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%StandRack == v) return + #endif + data%State%softwareInputs%StandRack = v + #ifdef deb + print*, 'StandRack=', data%State%softwareInputs%StandRack + #endif + ! call data%State%softwareInputs%OnStandRackChanged%RunAll() + end subroutine + + integer function Get_StandRack() + implicit none + Get_StandRack = data%State%softwareInputs%StandRack + end function + + subroutine Set_SlackOff(v) + implicit none + logical , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%SlackOff == v) return + #endif + data%State%softwareInputs%SlackOff = v + #ifdef deb + print*, 'SlackOff=', data%State%softwareInputs%SlackOff + #endif + ! call data%State%softwareInputs%OnSlackOffChange%RunAll() + end subroutine + + logical function Get_SlackOff() + implicit none + Get_SlackOff = data%State%softwareInputs%SlackOff + end function + + subroutine Set_SafetyValveHeight(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%SafetyValveHeight == v) return + #endif + data%State%softwareInputs%SafetyValveHeight = v + #ifdef deb + print*, 'SafetyValveHeight=', data%State%softwareInputs%SafetyValveHeight + #endif + ! call data%State%softwareInputs%OnSafetyValveHeightChange%RunAll() + end subroutine + + real function Get_SafetyValveHeight() + implicit none + Get_SafetyValveHeight = data%State%softwareInputs%SafetyValveHeight + !Get_SafetyValveHeight = 23 + end function + + + subroutine Set_NearFloorConnection(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%NearFloorConnection == v) return + #endif + data%State%softwareInputs%NearFloorConnection = v + #ifdef deb + print*, 'NearFloorConnection=', data%State%softwareInputs%NearFloorConnection + #endif + ! call data%State%softwareInputs%OnNearFloorConnectionChange%RunAll() + end subroutine + + real function Get_NearFloorConnection() + implicit none + Get_NearFloorConnection = data%State%softwareInputs%NearFloorConnection + !Get_NearFloorConnection = 4 + end function + + subroutine Set_IbopHeight(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%IbopHeight == v) return + #endif + data%State%softwareInputs%IbopHeight = v + #ifdef deb + print*, 'IbopHeight=', data%State%softwareInputs%IbopHeight + #endif + ! call data%State%softwareInputs%OnIbopHeightChange%RunAll() + end subroutine + + real function Get_IbopHeight() + implicit none + Get_IbopHeight = data%State%softwareInputs%IbopHeight + !Get_IbopHeight = 23.0 + end function + + subroutine Set_HookHeight(v) + implicit none + real , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%softwareInputs%HookHeight == v) return + #endif + data%State%softwareInputs%HookHeight = v + #ifdef deb + print*, 'HookHeight=', data%State%softwareInputs%HookHeight + #endif + ! call data%State%softwareInputs%OnHookHeightChange%RunAll() + end subroutine + + real function Get_HookHeight() + implicit none + Get_HookHeight = data%State%softwareInputs%HookHeight + end function +end module SoftwareInputsModule \ No newline at end of file diff --git a/CSharp/OperationScenarios/SoftwareInputsVariables.f90 b/CSharp/OperationScenarios/SoftwareInputsVariables.f90 new file mode 100644 index 0000000..695ca20 --- /dev/null +++ b/CSharp/OperationScenarios/SoftwareInputsVariables.f90 @@ -0,0 +1,18 @@ +module SoftwareInputsVariables + ! use CVoidEventHandlerCollection + type:: SoftwareInputsType + real :: HookHeight = 0 + real :: IbopHeight = 0 + real :: NearFloorConnection = 0 + real :: SafetyValveHeight = 0 + logical :: SlackOff = .false. + integer :: StandRack = 0 + real :: StringPressure = 0 + real :: TdsStemJointHeight = 0 + logical :: ZeroStringSpeed = .false. + end type SoftwareInputsType + ! type(SoftwareInputsType):: softwareInputs + + contains + +end module \ No newline at end of file diff --git a/CSharp/OperationScenarios/SoftwareOutputsVariables.f90 b/CSharp/OperationScenarios/SoftwareOutputsVariables.f90 deleted file mode 100644 index e69de29..0000000 diff --git a/CSharp/OperationScenarios/Unity/CUnityInputs.f90 b/CSharp/OperationScenarios/Unity/CUnityInputs.f90 index 755d255..b9830d8 100644 --- a/CSharp/OperationScenarios/Unity/CUnityInputs.f90 +++ b/CSharp/OperationScenarios/Unity/CUnityInputs.f90 @@ -1,520 +1,520 @@ -module CUnityInputs - ! use CVoidEventHandlerCollection - implicit none - type :: UnityInputsType - logical :: ElevatorConnectionPossible - logical :: JointConnectionPossible - logical :: IsKellyBushingSetInTable - logical :: ElevatorPickup - logical :: NearFloorPosition - logical :: SingleSetInMouseHole - logical :: TdsConnectionPossible - logical :: TdsStemIn - - ! private :: ElevatorConnectionPossible - ! private :: JointConnectionPossible - ! private :: IsKellyBushingSetInTable - ! private :: ElevatorPickup - ! private :: NearFloorPosition - ! private :: SingleSetInMouseHole - ! private :: TdsConnectionPossible - ! private :: TdsStemIn - - ! public - - ! type(VoidEventHandlerCollection) :: OnElevatorConnectionPossibleChange - ! type(VoidEventHandlerCollection) :: OnJointConnectionPossibleChange - ! type(VoidEventHandlerCollection) :: OnIsKellyBushingSetInTableChange - ! type(VoidEventHandlerCollection) :: OnElevatorPickupChange - ! type(VoidEventHandlerCollection) :: OnNearFloorPositionChange - ! type(VoidEventHandlerCollection) :: OnSingleSetInMouseHoleChange - - ! type(VoidEventHandlerCollection) :: OnTdsConnectionPossibleChange - ! type(VoidEventHandlerCollection) :: OnTdsStemInChange - end type UnityInputsType - - type(UnityInputsType)::UnityInputs - - contains - - ! Input routines - - -! subroutine Set_OutOfMouseHole(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_OutOfMouseHole -! !DEC$ ATTRIBUTES ALIAS: 'Set_OutOfMouseHole' :: Set_OutOfMouseHole -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(OutOfMouseHole == v) return -! !#endif -! ! OutOfMouseHole = v -! ! call OnOutOfMouseHoleChange%RunAll() -! !#ifdef deb -! ! print*, 'OutOfMouseHole=', OutOfMouseHole -! !#endif -! end subroutine - -! !logical function Get_OutOfMouseHole() -! ! implicit none -! ! Get_OutOfMouseHole = OutOfMouseHole -! !end function - - - - - - - - - - - - -! subroutine Set_Unlatch(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_Unlatch -! !DEC$ ATTRIBUTES ALIAS: 'Set_Unlatch' :: Set_Unlatch -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(Unlatch == v) return -! !#endif -! ! Unlatch = v -! ! call OnUnlatchChange%RunAll() -! !#ifdef deb -! ! print*, 'Unlatch=', Unlatch -! !#endif -! end subroutine - -! !logical function Get_Unlatch() -! ! implicit none -! ! Get_Unlatch = Unlatch -! !end function - - - - - - - - - - - - - - -! subroutine Set_Latch(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_Latch -! !DEC$ ATTRIBUTES ALIAS: 'Set_Latch' :: Set_Latch -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(Latch == v) return -! !#endif -! ! Latch = v -! ! call OnLatchChange%RunAll() -! !#ifdef deb -! ! print*, 'Latch=', Latch -! !#endif -! end subroutine - -! !logical function Get_Latch() -! ! implicit none -! ! Get_Latch = Latch -! !end function - - - - - - - - - - - - - - - - -! subroutine Set_SlipsUnSet(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SlipsUnSet -! !DEC$ ATTRIBUTES ALIAS: 'Set_SlipsUnSet' :: Set_SlipsUnSet -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(SlipsUnSet == v) return -! !#endif -! ! SlipsUnSet = v -! ! call OnSlipsUnSetChange%RunAll() -! !#ifdef deb -! ! print*, 'SlipsUnSet=', SlipsUnSet -! !#endif -! end subroutine - -! !logical function Get_SlipsUnSet() -! ! implicit none -! ! Get_SlipsUnSet = SlipsUnSet -! !end function - - - - - - - - - - - - - -! subroutine Set_SlipsSet(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SlipsSet -! !DEC$ ATTRIBUTES ALIAS: 'Set_SlipsSet' :: Set_SlipsSet -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(SlipsSet == v) return -! !#endif -! ! SlipsSet = v -! ! call OnSlipsSetChange%RunAll() -! !#ifdef deb -! ! print*, 'SlipsSet=', SlipsSet -! !#endif -! end subroutine - -! !logical function Get_SlipsSet() -! ! implicit none -! ! Get_SlipsSet = SlipsSet -! !end function - - - - - - - - - - - -! subroutine Set_BreakupTong(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_BreakupTong -! !DEC$ ATTRIBUTES ALIAS: 'Set_BreakupTong' :: Set_BreakupTong -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(BreakupTong == v) return -! !#endif -! ! BreakupTong = v -! ! call OnBreakupTongChange%RunAll() -! !#ifdef deb -! ! print*, 'BreakupTong=', BreakupTong -! !#endif -! end subroutine - -! !logical function Get_BreakupTong() -! ! implicit none -! ! Get_BreakupTong = BreakupTong -! !end function - - - - - - - - - -! subroutine Set_MakeupTong(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_MakeupTong -! !DEC$ ATTRIBUTES ALIAS: 'Set_MakeupTong' :: Set_MakeupTong -! implicit none -! logical, intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(MakeupTong == v) return -! !#endif -! ! MakeupTong = v -! ! call OnMakeupTongChange%RunAll() -! !#ifdef deb -! ! print*, 'MakeupTong=', MakeupTong -! !#endif -! end subroutine - -! !logical function Get_MakeupTong() -! ! implicit none -! ! Get_MakeupTong = MakeupTong -! !end function - - - - - - - - - - - - - - - - - - - - - -! subroutine Set_NewHookHeight(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_NewHookHeight -! !DEC$ ATTRIBUTES ALIAS: 'Set_NewHookHeight' :: Set_NewHookHeight -! implicit none -! real(8), intent(in) :: v -! !#ifdef ExcludeExtraChanges -! ! if(NewHookHeight == v) return -! !#endif -! ! NewHookHeight = v -! ! call OnNewHookHeightChange%RunAll() -! !#ifdef deb -! ! print*, 'NewHookHeight=', NewHookHeight -! !#endif -! end subroutine - -! !real(8) function Get_NewHookHeight() -! ! implicit none -! ! Get_NewHookHeight = NewHookHeight -! !end function - - - - - - - - - -! subroutine Set_ElevatorConnectionPossible(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_ElevatorConnectionPossible -! !DEC$ ATTRIBUTES ALIAS: 'Set_ElevatorConnectionPossible' :: Set_ElevatorConnectionPossible -! implicit none -! logical, intent(in) :: v -! #ifdef ExcludeExtraChanges -! if(UnityInputs%ElevatorConnectionPossible == v) return -! #endif -! UnityInputs%ElevatorConnectionPossible = v -! !**call UnityInputs%OnElevatorConnectionPossibleChange%RunAll() -! #ifdef deb -! print*, 'ElevatorConnectionPossible=', UnityInputs%ElevatorConnectionPossible -! #endif -! end subroutine - - logical function Get_ElevatorConnectionPossible() - implicit none - Get_ElevatorConnectionPossible = UnityInputs%ElevatorConnectionPossible - end function - - ! logical function Get_ElevatorConnectionPossible_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_ElevatorConnectionPossible_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Get_ElevatorConnectionPossible_WN' :: Get_ElevatorConnectionPossible_WN - ! implicit none - ! Get_ElevatorConnectionPossible_WN = UnityInputs%ElevatorConnectionPossible - ! !Get_ElevatorConnectionPossible_WN = .true. - ! end function - - - - - - - - -! subroutine Set_JointConnectionPossible(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_JointConnectionPossible -! !DEC$ ATTRIBUTES ALIAS: 'Set_JointConnectionPossible' :: Set_JointConnectionPossible -! implicit none -! logical, intent(in) :: v -! #ifdef ExcludeExtraChanges -! if(UnityInputs%JointConnectionPossible == v) return -! #endif -! UnityInputs%JointConnectionPossible = v -! !**call UnityInputs%OnJointConnectionPossibleChange%RunAll() -! #ifdef deb -! print*, 'JointConnectionPossible=', UnityInputs%JointConnectionPossible -! #endif -! end subroutine - - logical function Get_JointConnectionPossible() - implicit none - Get_JointConnectionPossible = UnityInputs%JointConnectionPossible - end function - - - ! logical function Get_JointConnectionPossible_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_JointConnectionPossible_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Get_JointConnectionPossible_WN' :: Get_JointConnectionPossible_WN - ! implicit none - ! Get_JointConnectionPossible_WN = UnityInputs%JointConnectionPossible - ! end function - - - - - -! subroutine Set_IsKellyBushingSetInTable(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_IsKellyBushingSetInTable -! !DEC$ ATTRIBUTES ALIAS: 'Set_IsKellyBushingSetInTable' :: Set_IsKellyBushingSetInTable -! implicit none -! logical, intent(in) :: v -! #ifdef ExcludeExtraChanges -! if(UnityInputs%IsKellyBushingSetInTable == v) return -! #endif -! UnityInputs%IsKellyBushingSetInTable = v -! !**call UnityInputs%OnIsKellyBushingSetInTableChange%RunAll() -! #ifdef deb -! print*, 'IsKellyBushingSetInTable=', UnityInputs%IsKellyBushingSetInTable -! #endif -! end subroutine - - logical function Get_IsKellyBushingSetInTable() - implicit none - Get_IsKellyBushingSetInTable = UnityInputs%IsKellyBushingSetInTable - end function - - ! logical function Get_IsKellyBushingSetInTable_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_IsKellyBushingSetInTable_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Get_IsKellyBushingSetInTable_WN' :: Get_IsKellyBushingSetInTable_WN - ! implicit none - ! Get_IsKellyBushingSetInTable_WN = UnityInputs%IsKellyBushingSetInTable - ! end function - - - - - - - -! subroutine Set_ElevatorPickup(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_ElevatorPickup -! !DEC$ ATTRIBUTES ALIAS: 'Set_ElevatorPickup' :: Set_ElevatorPickup -! implicit none -! logical, intent(in) :: v -! #ifdef ExcludeExtraChanges -! if(UnityInputs%ElevatorPickup == v) return -! #endif -! UnityInputs%ElevatorPickup = v -! !**call UnityInputs%OnElevatorPickupChange%RunAll() -! #ifdef deb -! print*, 'ElevatorPickup =', UnityInputs%ElevatorPickup -! #endif -! end subroutine - - logical function Get_ElevatorPickup() - implicit none - Get_ElevatorPickup = UnityInputs%ElevatorPickup - end function - - - ! logical function Get_ElevatorPickup_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_ElevatorPickup_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Get_ElevatorPickup_WN' :: Get_ElevatorPickup_WN - ! implicit none - ! Get_ElevatorPickup_WN = UnityInputs%ElevatorPickup - ! end function - - - - - - - - subroutine Set_NearFloorPosition(v) - implicit none - logical, intent(in) :: v -#ifdef ExcludeExtraChanges - if(UnityInputs%NearFloorPosition == v) return -#endif - UnityInputs%NearFloorPosition = v - !**call UnityInputs%OnNearFloorPositionChange%RunAll() -#ifdef deb - print*, 'NearFloorPosition =', UnityInputs%NearFloorPosition -#endif - end subroutine - - ! subroutine Set_NearFloorPosition_WN(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: Set_NearFloorPosition_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Set_NearFloorPosition_WN' :: Set_NearFloorPosition_WN - ! implicit none - ! logical, intent(in) :: v - ! call Set_NearFloorPosition(v) - ! end subroutine - - logical function Get_NearFloorPosition() - implicit none - Get_NearFloorPosition = UnityInputs%NearFloorPosition - end function - - -! logical function Get_NearFloorPosition_WN() -! !DEC$ ATTRIBUTES DLLEXPORT :: Get_NearFloorPosition_WN -! !DEC$ ATTRIBUTES ALIAS: 'Get_NearFloorPosition_WN' :: Get_NearFloorPosition_WN -! implicit none -! Get_NearFloorPosition_WN = UnityInputs%NearFloorPosition -! end function - - - - - - - - - -! subroutine Set_SingleSetInMouseHole(v) -! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SingleSetInMouseHole -! !DEC$ ATTRIBUTES ALIAS: 'Set_SingleSetInMouseHole' :: Set_SingleSetInMouseHole -! implicit none -! logical, intent(in) :: v -! #ifdef ExcludeExtraChanges -! if(UnityInputs%SingleSetInMouseHole == v) return -! #endif -! UnityInputs%SingleSetInMouseHole = v -! !**call UnityInputs%OnSingleSetInMouseHoleChange%RunAll() -! #ifdef deb -! print*, 'singleSetInMouseHole=', UnityInputs%SingleSetInMouseHole -! #endif -! end subroutine - - logical function Get_SingleSetInMouseHole() - implicit none - Get_SingleSetInMouseHole = UnityInputs%SingleSetInMouseHole - end function - - - - logical function Get_TdsConnectionPossible() - implicit none - Get_TdsConnectionPossible = UnityInputs%TdsConnectionPossible - end function - - - logical function Get_TdsStemIn() - implicit none - Get_TdsStemIn = UnityInputs%TdsStemIn - end function - - ! logical function Get_TdsStemIn_WN() - ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_TdsStemIn_WN - ! !DEC$ ATTRIBUTES ALIAS: 'Get_TdsStemIn_WN' :: Get_TdsStemIn_WN - ! implicit none - ! Get_TdsStemIn_WN = UnityInputs%TdsStemIn - ! !Get_TdsStemIn_WN = .true. - ! end function - - - - -end module CUnityInputs +module CUnityInputs + ! use CVoidEventHandlerCollection + implicit none + type :: UnityInputsType + logical :: ElevatorConnectionPossible + logical :: JointConnectionPossible + logical :: IsKellyBushingSetInTable + logical :: ElevatorPickup + logical :: NearFloorPosition + logical :: SingleSetInMouseHole + logical :: TdsConnectionPossible + logical :: TdsStemIn + + ! private :: ElevatorConnectionPossible + ! private :: JointConnectionPossible + ! private :: IsKellyBushingSetInTable + ! private :: ElevatorPickup + ! private :: NearFloorPosition + ! private :: SingleSetInMouseHole + ! private :: TdsConnectionPossible + ! private :: TdsStemIn + + ! public + + ! type(VoidEventHandlerCollection) :: OnElevatorConnectionPossibleChange + ! type(VoidEventHandlerCollection) :: OnJointConnectionPossibleChange + ! type(VoidEventHandlerCollection) :: OnIsKellyBushingSetInTableChange + ! type(VoidEventHandlerCollection) :: OnElevatorPickupChange + ! type(VoidEventHandlerCollection) :: OnNearFloorPositionChange + ! type(VoidEventHandlerCollection) :: OnSingleSetInMouseHoleChange + + ! type(VoidEventHandlerCollection) :: OnTdsConnectionPossibleChange + ! type(VoidEventHandlerCollection) :: OnTdsStemInChange + end type UnityInputsType + + type(UnityInputsType)::UnityInputs + + contains + + ! Input routines + + +! subroutine Set_OutOfMouseHole(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_OutOfMouseHole +! !DEC$ ATTRIBUTES ALIAS: 'Set_OutOfMouseHole' :: Set_OutOfMouseHole +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(OutOfMouseHole == v) return +! !#endif +! ! OutOfMouseHole = v +! ! call OnOutOfMouseHoleChange%RunAll() +! !#ifdef deb +! ! print*, 'OutOfMouseHole=', OutOfMouseHole +! !#endif +! end subroutine + +! !logical function Get_OutOfMouseHole() +! ! implicit none +! ! Get_OutOfMouseHole = OutOfMouseHole +! !end function + + + + + + + + + + + + +! subroutine Set_Unlatch(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_Unlatch +! !DEC$ ATTRIBUTES ALIAS: 'Set_Unlatch' :: Set_Unlatch +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(Unlatch == v) return +! !#endif +! ! Unlatch = v +! ! call OnUnlatchChange%RunAll() +! !#ifdef deb +! ! print*, 'Unlatch=', Unlatch +! !#endif +! end subroutine + +! !logical function Get_Unlatch() +! ! implicit none +! ! Get_Unlatch = Unlatch +! !end function + + + + + + + + + + + + + + +! subroutine Set_Latch(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_Latch +! !DEC$ ATTRIBUTES ALIAS: 'Set_Latch' :: Set_Latch +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(Latch == v) return +! !#endif +! ! Latch = v +! ! call OnLatchChange%RunAll() +! !#ifdef deb +! ! print*, 'Latch=', Latch +! !#endif +! end subroutine + +! !logical function Get_Latch() +! ! implicit none +! ! Get_Latch = Latch +! !end function + + + + + + + + + + + + + + + + +! subroutine Set_SlipsUnSet(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SlipsUnSet +! !DEC$ ATTRIBUTES ALIAS: 'Set_SlipsUnSet' :: Set_SlipsUnSet +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(SlipsUnSet == v) return +! !#endif +! ! SlipsUnSet = v +! ! call OnSlipsUnSetChange%RunAll() +! !#ifdef deb +! ! print*, 'SlipsUnSet=', SlipsUnSet +! !#endif +! end subroutine + +! !logical function Get_SlipsUnSet() +! ! implicit none +! ! Get_SlipsUnSet = SlipsUnSet +! !end function + + + + + + + + + + + + + +! subroutine Set_SlipsSet(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SlipsSet +! !DEC$ ATTRIBUTES ALIAS: 'Set_SlipsSet' :: Set_SlipsSet +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(SlipsSet == v) return +! !#endif +! ! SlipsSet = v +! ! call OnSlipsSetChange%RunAll() +! !#ifdef deb +! ! print*, 'SlipsSet=', SlipsSet +! !#endif +! end subroutine + +! !logical function Get_SlipsSet() +! ! implicit none +! ! Get_SlipsSet = SlipsSet +! !end function + + + + + + + + + + + +! subroutine Set_BreakupTong(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_BreakupTong +! !DEC$ ATTRIBUTES ALIAS: 'Set_BreakupTong' :: Set_BreakupTong +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(BreakupTong == v) return +! !#endif +! ! BreakupTong = v +! ! call OnBreakupTongChange%RunAll() +! !#ifdef deb +! ! print*, 'BreakupTong=', BreakupTong +! !#endif +! end subroutine + +! !logical function Get_BreakupTong() +! ! implicit none +! ! Get_BreakupTong = BreakupTong +! !end function + + + + + + + + + +! subroutine Set_MakeupTong(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_MakeupTong +! !DEC$ ATTRIBUTES ALIAS: 'Set_MakeupTong' :: Set_MakeupTong +! implicit none +! logical, intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(MakeupTong == v) return +! !#endif +! ! MakeupTong = v +! ! call OnMakeupTongChange%RunAll() +! !#ifdef deb +! ! print*, 'MakeupTong=', MakeupTong +! !#endif +! end subroutine + +! !logical function Get_MakeupTong() +! ! implicit none +! ! Get_MakeupTong = MakeupTong +! !end function + + + + + + + + + + + + + + + + + + + + + +! subroutine Set_NewHookHeight(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_NewHookHeight +! !DEC$ ATTRIBUTES ALIAS: 'Set_NewHookHeight' :: Set_NewHookHeight +! implicit none +! real(8), intent(in) :: v +! !#ifdef ExcludeExtraChanges +! ! if(NewHookHeight == v) return +! !#endif +! ! NewHookHeight = v +! ! call OnNewHookHeightChange%RunAll() +! !#ifdef deb +! ! print*, 'NewHookHeight=', NewHookHeight +! !#endif +! end subroutine + +! !real(8) function Get_NewHookHeight() +! ! implicit none +! ! Get_NewHookHeight = NewHookHeight +! !end function + + + + + + + + + +! subroutine Set_ElevatorConnectionPossible(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_ElevatorConnectionPossible +! !DEC$ ATTRIBUTES ALIAS: 'Set_ElevatorConnectionPossible' :: Set_ElevatorConnectionPossible +! implicit none +! logical, intent(in) :: v +! #ifdef ExcludeExtraChanges +! if(UnityInputs%ElevatorConnectionPossible == v) return +! #endif +! UnityInputs%ElevatorConnectionPossible = v +! !**call UnityInputs%OnElevatorConnectionPossibleChange%RunAll() +! #ifdef deb +! print*, 'ElevatorConnectionPossible=', UnityInputs%ElevatorConnectionPossible +! #endif +! end subroutine + + logical function Get_ElevatorConnectionPossible() + implicit none + Get_ElevatorConnectionPossible = UnityInputs%ElevatorConnectionPossible + end function + + ! logical function Get_ElevatorConnectionPossible_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_ElevatorConnectionPossible_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Get_ElevatorConnectionPossible_WN' :: Get_ElevatorConnectionPossible_WN + ! implicit none + ! Get_ElevatorConnectionPossible_WN = UnityInputs%ElevatorConnectionPossible + ! !Get_ElevatorConnectionPossible_WN = .true. + ! end function + + + + + + + + +! subroutine Set_JointConnectionPossible(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_JointConnectionPossible +! !DEC$ ATTRIBUTES ALIAS: 'Set_JointConnectionPossible' :: Set_JointConnectionPossible +! implicit none +! logical, intent(in) :: v +! #ifdef ExcludeExtraChanges +! if(UnityInputs%JointConnectionPossible == v) return +! #endif +! UnityInputs%JointConnectionPossible = v +! !**call UnityInputs%OnJointConnectionPossibleChange%RunAll() +! #ifdef deb +! print*, 'JointConnectionPossible=', UnityInputs%JointConnectionPossible +! #endif +! end subroutine + + logical function Get_JointConnectionPossible() + implicit none + Get_JointConnectionPossible = UnityInputs%JointConnectionPossible + end function + + + ! logical function Get_JointConnectionPossible_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_JointConnectionPossible_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Get_JointConnectionPossible_WN' :: Get_JointConnectionPossible_WN + ! implicit none + ! Get_JointConnectionPossible_WN = UnityInputs%JointConnectionPossible + ! end function + + + + + +! subroutine Set_IsKellyBushingSetInTable(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_IsKellyBushingSetInTable +! !DEC$ ATTRIBUTES ALIAS: 'Set_IsKellyBushingSetInTable' :: Set_IsKellyBushingSetInTable +! implicit none +! logical, intent(in) :: v +! #ifdef ExcludeExtraChanges +! if(UnityInputs%IsKellyBushingSetInTable == v) return +! #endif +! UnityInputs%IsKellyBushingSetInTable = v +! !**call UnityInputs%OnIsKellyBushingSetInTableChange%RunAll() +! #ifdef deb +! print*, 'IsKellyBushingSetInTable=', UnityInputs%IsKellyBushingSetInTable +! #endif +! end subroutine + + logical function Get_IsKellyBushingSetInTable() + implicit none + Get_IsKellyBushingSetInTable = UnityInputs%IsKellyBushingSetInTable + end function + + ! logical function Get_IsKellyBushingSetInTable_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_IsKellyBushingSetInTable_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Get_IsKellyBushingSetInTable_WN' :: Get_IsKellyBushingSetInTable_WN + ! implicit none + ! Get_IsKellyBushingSetInTable_WN = UnityInputs%IsKellyBushingSetInTable + ! end function + + + + + + + +! subroutine Set_ElevatorPickup(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_ElevatorPickup +! !DEC$ ATTRIBUTES ALIAS: 'Set_ElevatorPickup' :: Set_ElevatorPickup +! implicit none +! logical, intent(in) :: v +! #ifdef ExcludeExtraChanges +! if(UnityInputs%ElevatorPickup == v) return +! #endif +! UnityInputs%ElevatorPickup = v +! !**call UnityInputs%OnElevatorPickupChange%RunAll() +! #ifdef deb +! print*, 'ElevatorPickup =', UnityInputs%ElevatorPickup +! #endif +! end subroutine + + logical function Get_ElevatorPickup() + implicit none + Get_ElevatorPickup = UnityInputs%ElevatorPickup + end function + + + ! logical function Get_ElevatorPickup_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_ElevatorPickup_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Get_ElevatorPickup_WN' :: Get_ElevatorPickup_WN + ! implicit none + ! Get_ElevatorPickup_WN = UnityInputs%ElevatorPickup + ! end function + + + + + + + + subroutine Set_NearFloorPosition(v) + implicit none + logical, intent(in) :: v +#ifdef ExcludeExtraChanges + if(UnityInputs%NearFloorPosition == v) return +#endif + UnityInputs%NearFloorPosition = v + !**call UnityInputs%OnNearFloorPositionChange%RunAll() +#ifdef deb + print*, 'NearFloorPosition =', UnityInputs%NearFloorPosition +#endif + end subroutine + + ! subroutine Set_NearFloorPosition_WN(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: Set_NearFloorPosition_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Set_NearFloorPosition_WN' :: Set_NearFloorPosition_WN + ! implicit none + ! logical, intent(in) :: v + ! call Set_NearFloorPosition(v) + ! end subroutine + + logical function Get_NearFloorPosition() + implicit none + Get_NearFloorPosition = UnityInputs%NearFloorPosition + end function + + +! logical function Get_NearFloorPosition_WN() +! !DEC$ ATTRIBUTES DLLEXPORT :: Get_NearFloorPosition_WN +! !DEC$ ATTRIBUTES ALIAS: 'Get_NearFloorPosition_WN' :: Get_NearFloorPosition_WN +! implicit none +! Get_NearFloorPosition_WN = UnityInputs%NearFloorPosition +! end function + + + + + + + + + +! subroutine Set_SingleSetInMouseHole(v) +! !DEC$ ATTRIBUTES DLLEXPORT :: Set_SingleSetInMouseHole +! !DEC$ ATTRIBUTES ALIAS: 'Set_SingleSetInMouseHole' :: Set_SingleSetInMouseHole +! implicit none +! logical, intent(in) :: v +! #ifdef ExcludeExtraChanges +! if(UnityInputs%SingleSetInMouseHole == v) return +! #endif +! UnityInputs%SingleSetInMouseHole = v +! !**call UnityInputs%OnSingleSetInMouseHoleChange%RunAll() +! #ifdef deb +! print*, 'singleSetInMouseHole=', UnityInputs%SingleSetInMouseHole +! #endif +! end subroutine + + logical function Get_SingleSetInMouseHole() + implicit none + Get_SingleSetInMouseHole = UnityInputs%SingleSetInMouseHole + end function + + + + logical function Get_TdsConnectionPossible() + implicit none + Get_TdsConnectionPossible = UnityInputs%TdsConnectionPossible + end function + + + logical function Get_TdsStemIn() + implicit none + Get_TdsStemIn = UnityInputs%TdsStemIn + end function + + ! logical function Get_TdsStemIn_WN() + ! !DEC$ ATTRIBUTES DLLEXPORT :: Get_TdsStemIn_WN + ! !DEC$ ATTRIBUTES ALIAS: 'Get_TdsStemIn_WN' :: Get_TdsStemIn_WN + ! implicit none + ! Get_TdsStemIn_WN = UnityInputs%TdsStemIn + ! !Get_TdsStemIn_WN = .true. + ! end function + + + + +end module CUnityInputs diff --git a/CSharp/OperationScenarios/Unity/CUnityOutputs.f90 b/CSharp/OperationScenarios/Unity/CUnityOutputs.f90 index f64f611..739cc35 100644 --- a/CSharp/OperationScenarios/Unity/CUnityOutputs.f90 +++ b/CSharp/OperationScenarios/Unity/CUnityOutputs.f90 @@ -1,594 +1,594 @@ -module CUnityOutputs - implicit none - type :: UnityOutputsType - real(8) :: KellyHoseVibrationRate - real(8) :: BlowoutFromStringPercent - real(8) :: Pedal - real(8) :: FlowRate - real(8) :: RotaryRpm - logical :: BlowoutFromString - logical :: BlowoutFromAnnular - logical :: FlowFromReturnLine - real :: FlowFromKelly - real :: FlowFromFillupHead - logical :: FlowKellyDisconnect - logical :: FlowPipeDisconnect - end type UnityOutputsType - type(UnityOutputsType):: UnityOutputs - - contains - - ! subroutine Setup() - ! use CDataDisplayConsole - ! use ConfigurationVariables - ! implicit none - ! ! PumpsSpmChanges => Calc_KellyHoseVibrationRate - ! ! call data%EquipmentControl%DataDisplayConsole%OnRotaryRpmChange%Add(Set_RotaryRpm) - ! end subroutine - - - - - - - - - - - subroutine Set_BlowoutFromString(v) - implicit none - logical, intent (in) :: v - UnityOutputs%BlowoutFromString = v -#ifdef deb - print*, 'BlowoutFromString=', v -#endif - end subroutine - - logical function Get_BlowoutFromString() - implicit none - Get_BlowoutFromString = UnityOutputs%BlowoutFromString - end function - - subroutine Set_BlowoutFromString_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromString_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromString_WN' :: Set_BlowoutFromString_WN - implicit none - logical, intent (in) :: v - call Set_BlowoutFromString(v) - end subroutine - - logical function Get_BlowoutFromString_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_BlowoutFromString_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_BlowoutFromString_WN' :: Get_BlowoutFromString_WN - implicit none - Get_BlowoutFromString_WN = UnityOutputs%BlowoutFromString - !Get_BlowoutFromString = .TRUE. - end function - - - - subroutine Set_BlowoutFromAnnular(v) - implicit none - logical, intent (in) :: v - UnityOutputs%BlowoutFromAnnular = v -#ifdef deb - print*, 'BlowoutFromAnnular=', v -#endif - end subroutine - - logical function Get_BlowoutFromAnnular() - implicit none - Get_BlowoutFromAnnular = UnityOutputs%BlowoutFromAnnular - end function - - subroutine Set_BlowoutFromAnnular_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromAnnular_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromAnnular_WN' :: Set_BlowoutFromAnnular_WN - implicit none - logical, intent (in) :: v - call Set_BlowoutFromAnnular(v) - end subroutine - - logical function Get_BlowoutFromAnnular_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_BlowoutFromAnnular_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_BlowoutFromAnnular_WN' :: Get_BlowoutFromAnnular_WN - implicit none - Get_BlowoutFromAnnular_WN = UnityOutputs%BlowoutFromAnnular - end function - - - - - - subroutine Set_FlowFromReturnLine(v) - implicit none - logical, intent (in) :: v - UnityOutputs%FlowFromReturnLine = v -#ifdef deb - print*, 'FlowFromReturnLine=', v -#endif - end subroutine - - logical function Get_FlowFromReturnLine() - implicit none - Get_FlowFromReturnLine = UnityOutputs%FlowFromReturnLine - end function - - - subroutine Set_FlowFromReturnLine_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromReturnLine_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromReturnLine_WN' :: Set_FlowFromReturnLine_WN - implicit none - logical, intent (in) :: v - call Set_FlowFromReturnLine(v) - end subroutine - - logical function Get_FlowFromReturnLine_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromReturnLine_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromReturnLine_WN' :: Get_FlowFromReturnLine_WN - implicit none - Get_FlowFromReturnLine_WN = UnityOutputs%FlowFromReturnLine - !Get_FlowFromReturnLine_WN = .FALSE. - end function - - - - subroutine Set_FlowFromKelly(v) - implicit none - real, intent (in) :: v - UnityOutputs%FlowFromKelly = v -#ifdef deb - print*, 'FlowFromKelly=', v -#endif - end subroutine - - real function Get_FlowFromKelly() - implicit none - Get_FlowFromKelly = UnityOutputs%FlowFromKelly - end function - - - subroutine Set_FlowFromKelly_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromKelly_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromKelly_WN' :: Set_FlowFromKelly_WN - implicit none - real, intent (in) :: v - call Set_FlowFromKelly(v) - end subroutine - - real function Get_FlowFromKelly_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromKelly_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromKelly_WN' :: Get_FlowFromKelly_WN - implicit none -#ifdef deb - print*, 'FlowFromKellyR=', UnityOutputs%FlowFromKelly -#endif - Get_FlowFromKelly_WN = UnityOutputs%FlowFromKelly - !Get_FlowFromKelly = .FALSE. - end function - - - - - subroutine Set_FlowFromFillupHead(v) - implicit none - real, intent (in) :: v - UnityOutputs%FlowFromFillupHead = v -#ifdef deb - print*, 'FlowFromFillupHead=', v -#endif - end subroutine - - real function Get_FlowFromFillupHead() - implicit none - Get_FlowFromFillupHead = UnityOutputs%FlowFromFillupHead - end function - - - subroutine Set_FlowFromFillupHead_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromFillupHead_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromFillupHead_WN' :: Set_FlowFromFillupHead_WN - implicit none - real, intent (in) :: v - call Set_FlowFromFillupHead(v) - end subroutine - - real function Get_FlowFromFillupHead_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromFillupHead_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromFillupHead_WN' :: Get_FlowFromFillupHead_WN - implicit none -#ifdef deb - print*, 'FlowFromFillupHeadR=', UnityOutputs%FlowFromFillupHead -#endif - Get_FlowFromFillupHead_WN = UnityOutputs%FlowFromFillupHead - !Get_FlowFromFillupHead = .FALSE. - end function - - - - - - subroutine Set_FlowKellyDisconnect(v) - implicit none - logical, intent (in) :: v - UnityOutputs%FlowKellyDisconnect = v -#ifdef deb - print*, 'FlowKellyDisconnect=', v -#endif - end subroutine - - logical function Get_FlowKellyDisconnect() - implicit none - Get_FlowKellyDisconnect = UnityOutputs%FlowKellyDisconnect - end function - - - subroutine Set_FlowKellyDisconnect_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowKellyDisconnect_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowKellyDisconnect_WN' :: Set_FlowKellyDisconnect_WN - implicit none - logical, intent (in) :: v - call Set_FlowKellyDisconnect(v) - end subroutine - - logical function Get_FlowKellyDisconnect_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowKellyDisconnect_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_FlowKellyDisconnect_WN' :: Get_FlowKellyDisconnect_WN - implicit none - Get_FlowKellyDisconnect_WN = UnityOutputs%FlowKellyDisconnect - !Get_FlowKellyDisconnect_WN = .false. - end function - - - - - subroutine Set_FlowPipeDisconnect(v) - implicit none - logical, intent (in) :: v - UnityOutputs%FlowPipeDisconnect = v -#ifdef deb - print*, 'FlowPipeDisconnect=', v -#endif - end subroutine - - logical function Get_FlowPipeDisconnect() - implicit none - Get_FlowPipeDisconnect = UnityOutputs%FlowPipeDisconnect - end function - - - subroutine Set_FlowPipeDisconnect_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowPipeDisconnect_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowPipeDisconnect_WN' :: Set_FlowPipeDisconnect_WN - implicit none - logical, intent (in) :: v - call Set_FlowPipeDisconnect(v) - end subroutine - - logical function Get_FlowPipeDisconnect_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowPipeDisconnect_WN - !DEC$ ATTRIBUTES ALIAS: 'Get_FlowPipeDisconnect_WN' :: Get_FlowPipeDisconnect_WN - implicit none - Get_FlowPipeDisconnect_WN = UnityOutputs%FlowPipeDisconnect - !Get_FlowPipeDisconnect_WN = .false. - end function - - - - - - - - - - - - - - - - - - - - - - - - - - - - subroutine Set_BlowoutFromStringPercent(v) - implicit none - real(8), intent (in) :: v - UnityOutputs%BlowoutFromStringPercent = v -#ifdef deb - print*, 'BlowoutFromStringPercent=', v -#endif - end subroutine - - real(8) function GetBlowoutFromStringPercent() - implicit none - GetBlowoutFromStringPercent = UnityOutputs%BlowoutFromStringPercent - end function - - - - subroutine Set_BlowoutFromStringPercent_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromStringPercent_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromStringPercent_WN' :: Set_BlowoutFromStringPercent_WN - implicit none - real(8), intent (in) :: v - call Set_BlowoutFromStringPercent(v) - end subroutine - - real(8) function GetBlowoutFromStringPercent_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: GetBlowoutFromStringPercent_WN - !DEC$ ATTRIBUTES ALIAS: 'GetBlowoutFromStringPercent_WN' :: GetBlowoutFromStringPercent_WN - implicit none - GetBlowoutFromStringPercent_WN = UnityOutputs%BlowoutFromStringPercent - !GetBlowoutFromStringPercent_WN = 0d0 - end function - - - - - - - - - subroutine Calc_KellyHoseVibrationRate(spm1, spm2) - use CScaleRange - implicit none - real(8), intent (in) :: spm1, spm2 - real :: total - total = (spm1 + spm2)/2 - UnityOutputs%KellyHoseVibrationRate = ScaleRange(total, 0.0, 10.0, 0.0, 120.0) -#ifdef deb - print*, 'KellyHoseVibrationRate=', UnityOutputs%KellyHoseVibrationRate -#endif - end subroutine - - real(8) function GetKellyHoseVibrationRate() - implicit none - GetKellyHoseVibrationRate = UnityOutputs%KellyHoseVibrationRate - end function - - real(8) function GetKellyHoseVibrationRate_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: GetKellyHoseVibrationRate_WN - !DEC$ ATTRIBUTES ALIAS: 'GetKellyHoseVibrationRate_WN' :: GetKellyHoseVibrationRate_WN - implicit none - GetKellyHoseVibrationRate_WN = UnityOutputs%KellyHoseVibrationRate - end function - - - - - subroutine Set_Pedal(v) - implicit none - real(8), intent (in) :: v - UnityOutputs%Pedal = v -#ifdef deb - print*, 'Pedal=', v -#endif - end subroutine - - real(8) function GetPedal() - implicit none - GetPedal = UnityOutputs%Pedal - end function - - subroutine Set_Pedal_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_Pedal_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_Pedal_WN' :: Set_Pedal_WN - implicit none - real(8), intent (in) :: v - call Set_Pedal(v) - end subroutine - - real(8) function GetPedal_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: GetPedal_WN - !DEC$ ATTRIBUTES ALIAS: 'GetPedal_WN' :: GetPedal_WN - implicit none - GetPedal_WN = UnityOutputs%Pedal - !GetPedal = 50d0 - end function - - - - - - subroutine Set_FlowRate(v) - implicit none - real(8), intent (in) :: v - UnityOutputs%FlowRate = v -#ifdef deb - print*, 'FlowRate=', v -#endif - end subroutine - - - real(8) function GetFlowRate() - implicit none - GetFlowRate = UnityOutputs%FlowRate - end function - - - subroutine Set_FlowRate_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowRate_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_FlowRate_WN' :: Set_FlowRate_WN - implicit none - real(8), intent (in) :: v - call Set_FlowRate(v) - end subroutine - - real(8) function GetFlowRate_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: GetFlowRate_WN - !DEC$ ATTRIBUTES ALIAS: 'GetFlowRate_WN' :: GetFlowRate_WN - implicit none - GetFlowRate_WN = UnityOutputs%FlowRate - !GetFlowRate_WN = 50d0 - end function - - - - - subroutine Set_RotaryRpm(v) - implicit none - real(8), intent (in) :: v - UnityOutputs%RotaryRpm = v -#ifdef deb - print*, 'RotaryRpm=', v -#endif - end subroutine - - real(8) function GetRotaryRpm() - implicit none - GetRotaryRpm = UnityOutputs%RotaryRpm - end function - - - subroutine Set_RotaryRpm_WN(v) - !DEC$ ATTRIBUTES DLLEXPORT :: Set_RotaryRpm_WN - !DEC$ ATTRIBUTES ALIAS: 'Set_RotaryRpm_WN' :: Set_RotaryRpm_WN - implicit none - real(8), intent (in) :: v - call Set_RotaryRpm(v) - end subroutine - - real(8) function GetRotaryRpm_WN() - !DEC$ ATTRIBUTES DLLEXPORT :: GetRotaryRpm_WN - !DEC$ ATTRIBUTES ALIAS: 'GetRotaryRpm_WN' :: GetRotaryRpm_WN - implicit none - GetRotaryRpm_WN = UnityOutputs%RotaryRpm - end function - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - logical function GetSignal1() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal1 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal1' :: GetSignal1 - implicit none - !GetSignal1 = Signal1 - GetSignal1 = .false. - end function - - logical function GetSignal2() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal2 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal2' :: GetSignal2 - implicit none - !GetSignal2 = Signal2 - GetSignal2 = .false. - end function - - logical function GetSignal3() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal3 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal3' :: GetSignal3 - implicit none - !GetSignal3 = Signal3 - GetSignal3 = .false. - end function - - logical function GetSignal4() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal4 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal4' :: GetSignal4 - implicit none - !GetSignal4 = Signal4 - GetSignal4 = .false. - end function - - logical function GetSignal5() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal5 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal5' :: GetSignal5 - implicit none - !GetSignal5 = Signal5 - GetSignal5 = .false. - end function - - logical function GetSignal6() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal6 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal6' :: GetSignal6 - implicit none - !GetSignal6 = Signal6 - GetSignal6 = .false. - end function - - logical function GetSignal7() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal7 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal7' :: GetSignal7 - implicit none - !GetSignal7 = Signal7 - GetSignal7 = .false. - end function - - logical function GetSignal8() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal8 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal8' :: GetSignal8 - implicit none - !GetSignal8 = Signal8 - GetSignal8 = .false. - end function - - logical function GetSignal9() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal9 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal9' :: GetSignal9 - implicit none - !GetSignal9 = Signal9 - GetSignal9 = .false. - end function - - logical function GetSignal10() - !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal10 - !DEC$ ATTRIBUTES ALIAS: 'GetSignal10' :: GetSignal10 - implicit none - !GetSignal10 = Signal10 - GetSignal10 = .false. - end function - - - -end module CUnityOutputs +module CUnityOutputs + implicit none + type :: UnityOutputsType + real(8) :: KellyHoseVibrationRate + real(8) :: BlowoutFromStringPercent + real(8) :: Pedal + real(8) :: FlowRate + real(8) :: RotaryRpm + logical :: BlowoutFromString + logical :: BlowoutFromAnnular + logical :: FlowFromReturnLine + real :: FlowFromKelly + real :: FlowFromFillupHead + logical :: FlowKellyDisconnect + logical :: FlowPipeDisconnect + end type UnityOutputsType + type(UnityOutputsType):: UnityOutputs + + contains + + ! subroutine Setup() + ! use CDataDisplayConsole + ! use ConfigurationVariables + ! implicit none + ! ! PumpsSpmChanges => Calc_KellyHoseVibrationRate + ! ! call data%EquipmentControl%DataDisplayConsole%OnRotaryRpmChange%Add(Set_RotaryRpm) + ! end subroutine + + + + + + + + + + + subroutine Set_BlowoutFromString(v) + implicit none + logical, intent (in) :: v + UnityOutputs%BlowoutFromString = v +#ifdef deb + print*, 'BlowoutFromString=', v +#endif + end subroutine + + logical function Get_BlowoutFromString() + implicit none + Get_BlowoutFromString = UnityOutputs%BlowoutFromString + end function + + subroutine Set_BlowoutFromString_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromString_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromString_WN' :: Set_BlowoutFromString_WN + implicit none + logical, intent (in) :: v + call Set_BlowoutFromString(v) + end subroutine + + logical function Get_BlowoutFromString_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_BlowoutFromString_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_BlowoutFromString_WN' :: Get_BlowoutFromString_WN + implicit none + Get_BlowoutFromString_WN = UnityOutputs%BlowoutFromString + !Get_BlowoutFromString = .TRUE. + end function + + + + subroutine Set_BlowoutFromAnnular(v) + implicit none + logical, intent (in) :: v + UnityOutputs%BlowoutFromAnnular = v +#ifdef deb + print*, 'BlowoutFromAnnular=', v +#endif + end subroutine + + logical function Get_BlowoutFromAnnular() + implicit none + Get_BlowoutFromAnnular = UnityOutputs%BlowoutFromAnnular + end function + + subroutine Set_BlowoutFromAnnular_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromAnnular_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromAnnular_WN' :: Set_BlowoutFromAnnular_WN + implicit none + logical, intent (in) :: v + call Set_BlowoutFromAnnular(v) + end subroutine + + logical function Get_BlowoutFromAnnular_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_BlowoutFromAnnular_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_BlowoutFromAnnular_WN' :: Get_BlowoutFromAnnular_WN + implicit none + Get_BlowoutFromAnnular_WN = UnityOutputs%BlowoutFromAnnular + end function + + + + + + subroutine Set_FlowFromReturnLine(v) + implicit none + logical, intent (in) :: v + UnityOutputs%FlowFromReturnLine = v +#ifdef deb + print*, 'FlowFromReturnLine=', v +#endif + end subroutine + + logical function Get_FlowFromReturnLine() + implicit none + Get_FlowFromReturnLine = UnityOutputs%FlowFromReturnLine + end function + + + subroutine Set_FlowFromReturnLine_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromReturnLine_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromReturnLine_WN' :: Set_FlowFromReturnLine_WN + implicit none + logical, intent (in) :: v + call Set_FlowFromReturnLine(v) + end subroutine + + logical function Get_FlowFromReturnLine_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromReturnLine_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromReturnLine_WN' :: Get_FlowFromReturnLine_WN + implicit none + Get_FlowFromReturnLine_WN = UnityOutputs%FlowFromReturnLine + !Get_FlowFromReturnLine_WN = .FALSE. + end function + + + + subroutine Set_FlowFromKelly(v) + implicit none + real, intent (in) :: v + UnityOutputs%FlowFromKelly = v +#ifdef deb + print*, 'FlowFromKelly=', v +#endif + end subroutine + + real function Get_FlowFromKelly() + implicit none + Get_FlowFromKelly = UnityOutputs%FlowFromKelly + end function + + + subroutine Set_FlowFromKelly_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromKelly_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromKelly_WN' :: Set_FlowFromKelly_WN + implicit none + real, intent (in) :: v + call Set_FlowFromKelly(v) + end subroutine + + real function Get_FlowFromKelly_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromKelly_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromKelly_WN' :: Get_FlowFromKelly_WN + implicit none +#ifdef deb + print*, 'FlowFromKellyR=', UnityOutputs%FlowFromKelly +#endif + Get_FlowFromKelly_WN = UnityOutputs%FlowFromKelly + !Get_FlowFromKelly = .FALSE. + end function + + + + + subroutine Set_FlowFromFillupHead(v) + implicit none + real, intent (in) :: v + UnityOutputs%FlowFromFillupHead = v +#ifdef deb + print*, 'FlowFromFillupHead=', v +#endif + end subroutine + + real function Get_FlowFromFillupHead() + implicit none + Get_FlowFromFillupHead = UnityOutputs%FlowFromFillupHead + end function + + + subroutine Set_FlowFromFillupHead_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowFromFillupHead_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowFromFillupHead_WN' :: Set_FlowFromFillupHead_WN + implicit none + real, intent (in) :: v + call Set_FlowFromFillupHead(v) + end subroutine + + real function Get_FlowFromFillupHead_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowFromFillupHead_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_FlowFromFillupHead_WN' :: Get_FlowFromFillupHead_WN + implicit none +#ifdef deb + print*, 'FlowFromFillupHeadR=', UnityOutputs%FlowFromFillupHead +#endif + Get_FlowFromFillupHead_WN = UnityOutputs%FlowFromFillupHead + !Get_FlowFromFillupHead = .FALSE. + end function + + + + + + subroutine Set_FlowKellyDisconnect(v) + implicit none + logical, intent (in) :: v + UnityOutputs%FlowKellyDisconnect = v +#ifdef deb + print*, 'FlowKellyDisconnect=', v +#endif + end subroutine + + logical function Get_FlowKellyDisconnect() + implicit none + Get_FlowKellyDisconnect = UnityOutputs%FlowKellyDisconnect + end function + + + subroutine Set_FlowKellyDisconnect_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowKellyDisconnect_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowKellyDisconnect_WN' :: Set_FlowKellyDisconnect_WN + implicit none + logical, intent (in) :: v + call Set_FlowKellyDisconnect(v) + end subroutine + + logical function Get_FlowKellyDisconnect_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowKellyDisconnect_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_FlowKellyDisconnect_WN' :: Get_FlowKellyDisconnect_WN + implicit none + Get_FlowKellyDisconnect_WN = UnityOutputs%FlowKellyDisconnect + !Get_FlowKellyDisconnect_WN = .false. + end function + + + + + subroutine Set_FlowPipeDisconnect(v) + implicit none + logical, intent (in) :: v + UnityOutputs%FlowPipeDisconnect = v +#ifdef deb + print*, 'FlowPipeDisconnect=', v +#endif + end subroutine + + logical function Get_FlowPipeDisconnect() + implicit none + Get_FlowPipeDisconnect = UnityOutputs%FlowPipeDisconnect + end function + + + subroutine Set_FlowPipeDisconnect_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowPipeDisconnect_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowPipeDisconnect_WN' :: Set_FlowPipeDisconnect_WN + implicit none + logical, intent (in) :: v + call Set_FlowPipeDisconnect(v) + end subroutine + + logical function Get_FlowPipeDisconnect_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: Get_FlowPipeDisconnect_WN + !DEC$ ATTRIBUTES ALIAS: 'Get_FlowPipeDisconnect_WN' :: Get_FlowPipeDisconnect_WN + implicit none + Get_FlowPipeDisconnect_WN = UnityOutputs%FlowPipeDisconnect + !Get_FlowPipeDisconnect_WN = .false. + end function + + + + + + + + + + + + + + + + + + + + + + + + + + + + subroutine Set_BlowoutFromStringPercent(v) + implicit none + real(8), intent (in) :: v + UnityOutputs%BlowoutFromStringPercent = v +#ifdef deb + print*, 'BlowoutFromStringPercent=', v +#endif + end subroutine + + real(8) function GetBlowoutFromStringPercent() + implicit none + GetBlowoutFromStringPercent = UnityOutputs%BlowoutFromStringPercent + end function + + + + subroutine Set_BlowoutFromStringPercent_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_BlowoutFromStringPercent_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_BlowoutFromStringPercent_WN' :: Set_BlowoutFromStringPercent_WN + implicit none + real(8), intent (in) :: v + call Set_BlowoutFromStringPercent(v) + end subroutine + + real(8) function GetBlowoutFromStringPercent_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: GetBlowoutFromStringPercent_WN + !DEC$ ATTRIBUTES ALIAS: 'GetBlowoutFromStringPercent_WN' :: GetBlowoutFromStringPercent_WN + implicit none + GetBlowoutFromStringPercent_WN = UnityOutputs%BlowoutFromStringPercent + !GetBlowoutFromStringPercent_WN = 0d0 + end function + + + + + + + + + subroutine Calc_KellyHoseVibrationRate(spm1, spm2) + use CScaleRange + implicit none + real(8), intent (in) :: spm1, spm2 + real :: total + total = (spm1 + spm2)/2 + UnityOutputs%KellyHoseVibrationRate = ScaleRange(total, 0.0, 10.0, 0.0, 120.0) +#ifdef deb + print*, 'KellyHoseVibrationRate=', UnityOutputs%KellyHoseVibrationRate +#endif + end subroutine + + real(8) function GetKellyHoseVibrationRate() + implicit none + GetKellyHoseVibrationRate = UnityOutputs%KellyHoseVibrationRate + end function + + real(8) function GetKellyHoseVibrationRate_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: GetKellyHoseVibrationRate_WN + !DEC$ ATTRIBUTES ALIAS: 'GetKellyHoseVibrationRate_WN' :: GetKellyHoseVibrationRate_WN + implicit none + GetKellyHoseVibrationRate_WN = UnityOutputs%KellyHoseVibrationRate + end function + + + + + subroutine Set_Pedal(v) + implicit none + real(8), intent (in) :: v + UnityOutputs%Pedal = v +#ifdef deb + print*, 'Pedal=', v +#endif + end subroutine + + real(8) function GetPedal() + implicit none + GetPedal = UnityOutputs%Pedal + end function + + subroutine Set_Pedal_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_Pedal_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_Pedal_WN' :: Set_Pedal_WN + implicit none + real(8), intent (in) :: v + call Set_Pedal(v) + end subroutine + + real(8) function GetPedal_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: GetPedal_WN + !DEC$ ATTRIBUTES ALIAS: 'GetPedal_WN' :: GetPedal_WN + implicit none + GetPedal_WN = UnityOutputs%Pedal + !GetPedal = 50d0 + end function + + + + + + subroutine Set_FlowRate(v) + implicit none + real(8), intent (in) :: v + UnityOutputs%FlowRate = v +#ifdef deb + print*, 'FlowRate=', v +#endif + end subroutine + + + real(8) function GetFlowRate() + implicit none + GetFlowRate = UnityOutputs%FlowRate + end function + + + subroutine Set_FlowRate_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_FlowRate_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_FlowRate_WN' :: Set_FlowRate_WN + implicit none + real(8), intent (in) :: v + call Set_FlowRate(v) + end subroutine + + real(8) function GetFlowRate_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: GetFlowRate_WN + !DEC$ ATTRIBUTES ALIAS: 'GetFlowRate_WN' :: GetFlowRate_WN + implicit none + GetFlowRate_WN = UnityOutputs%FlowRate + !GetFlowRate_WN = 50d0 + end function + + + + + subroutine Set_RotaryRpm(v) + implicit none + real(8), intent (in) :: v + UnityOutputs%RotaryRpm = v +#ifdef deb + print*, 'RotaryRpm=', v +#endif + end subroutine + + real(8) function GetRotaryRpm() + implicit none + GetRotaryRpm = UnityOutputs%RotaryRpm + end function + + + subroutine Set_RotaryRpm_WN(v) + !DEC$ ATTRIBUTES DLLEXPORT :: Set_RotaryRpm_WN + !DEC$ ATTRIBUTES ALIAS: 'Set_RotaryRpm_WN' :: Set_RotaryRpm_WN + implicit none + real(8), intent (in) :: v + call Set_RotaryRpm(v) + end subroutine + + real(8) function GetRotaryRpm_WN() + !DEC$ ATTRIBUTES DLLEXPORT :: GetRotaryRpm_WN + !DEC$ ATTRIBUTES ALIAS: 'GetRotaryRpm_WN' :: GetRotaryRpm_WN + implicit none + GetRotaryRpm_WN = UnityOutputs%RotaryRpm + end function + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + logical function GetSignal1() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal1 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal1' :: GetSignal1 + implicit none + !GetSignal1 = Signal1 + GetSignal1 = .false. + end function + + logical function GetSignal2() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal2 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal2' :: GetSignal2 + implicit none + !GetSignal2 = Signal2 + GetSignal2 = .false. + end function + + logical function GetSignal3() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal3 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal3' :: GetSignal3 + implicit none + !GetSignal3 = Signal3 + GetSignal3 = .false. + end function + + logical function GetSignal4() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal4 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal4' :: GetSignal4 + implicit none + !GetSignal4 = Signal4 + GetSignal4 = .false. + end function + + logical function GetSignal5() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal5 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal5' :: GetSignal5 + implicit none + !GetSignal5 = Signal5 + GetSignal5 = .false. + end function + + logical function GetSignal6() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal6 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal6' :: GetSignal6 + implicit none + !GetSignal6 = Signal6 + GetSignal6 = .false. + end function + + logical function GetSignal7() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal7 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal7' :: GetSignal7 + implicit none + !GetSignal7 = Signal7 + GetSignal7 = .false. + end function + + logical function GetSignal8() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal8 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal8' :: GetSignal8 + implicit none + !GetSignal8 = Signal8 + GetSignal8 = .false. + end function + + logical function GetSignal9() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal9 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal9' :: GetSignal9 + implicit none + !GetSignal9 = Signal9 + GetSignal9 = .false. + end function + + logical function GetSignal10() + !DEC$ ATTRIBUTES DLLEXPORT :: GetSignal10 + !DEC$ ATTRIBUTES ALIAS: 'GetSignal10' :: GetSignal10 + implicit none + !GetSignal10 = Signal10 + GetSignal10 = .false. + end function + + + +end module CUnityOutputs diff --git a/CSharp/OperationScenarios/UnitySignals/CBucketEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CBucketEnum.f90 index 7951eb1..eeec5bc 100644 --- a/CSharp/OperationScenarios/UnitySignals/CBucketEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CBucketEnum.f90 @@ -1,74 +1,74 @@ -module CBucketEnum - use OperationScenariosModule - implicit none - contains - subroutine Set_MudBucket(v) - use CManifolds, only: ToggleMudBox - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(MudBucket == v) return -#endif - MudBucket = v - if (MudBucket == MUD_BUCKET_INSTALL) then - call ToggleMudBox(.true.) - else if (MudBucket == MUD_BUCKET_REMOVE) then - call ToggleMudBox(.false.) - endif -#ifdef deb - print*, 'MudBucket=', MudBucket -#endif - call OnMudBucketChange%RunAll() - end subroutine - - integer function Get_MudBucket() - implicit none - Get_MudBucket = MudBucket - end function - - -! subroutine ButtonPress_MudBoxInstallation() -! implicit none - - -! if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -! #ifdef OST -! print*, 'ButtonPress_MudBoxInstallation=TopDrive' -! #endif -! endif -! if (data%State%Hoisting%DriveType == Kelly_DriveType) then -! #ifdef OST -! print*, 'ButtonPress_MudBoxInstallation=Kelly' -! #endif - - -! call Set_MudBucket(MUD_BUCKET_INSTALL) - -! endif - - - - - -! end subroutine - -! subroutine ButtonPress_MudBoxRemove() -! implicit none - - -! if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -! #ifdef OST -! print*, 'ButtonPress_MudBoxRemove=TopDrive' -! #endif -! endif -! if (data%State%Hoisting%DriveType == Kelly_DriveType) then -! #ifdef OST -! print*, 'ButtonPress_MudBoxRemove=Kelly' -! #endif -! call Set_MudBucket(MUD_BUCKET_REMOVE) - -! endif - -! end subroutine - +module CBucketEnum + use OperationScenariosModule + implicit none + contains + subroutine Set_MudBucket(v) + use CManifolds, only: ToggleMudBox + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(MudBucket == v) return +#endif + MudBucket = v + if (MudBucket == MUD_BUCKET_INSTALL) then + call ToggleMudBox(.true.) + else if (MudBucket == MUD_BUCKET_REMOVE) then + call ToggleMudBox(.false.) + endif +#ifdef deb + print*, 'MudBucket=', MudBucket +#endif + call OnMudBucketChange%RunAll() + end subroutine + + integer function Get_MudBucket() + implicit none + Get_MudBucket = MudBucket + end function + + +! subroutine ButtonPress_MudBoxInstallation() +! implicit none + + +! if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +! #ifdef OST +! print*, 'ButtonPress_MudBoxInstallation=TopDrive' +! #endif +! endif +! if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +! #ifdef OST +! print*, 'ButtonPress_MudBoxInstallation=Kelly' +! #endif + + +! call Set_MudBucket(MUD_BUCKET_INSTALL) + +! endif + + + + + +! end subroutine + +! subroutine ButtonPress_MudBoxRemove() +! implicit none + + +! if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +! #ifdef OST +! print*, 'ButtonPress_MudBoxRemove=TopDrive' +! #endif +! endif +! if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +! #ifdef OST +! print*, 'ButtonPress_MudBoxRemove=Kelly' +! #endif +! call Set_MudBucket(MUD_BUCKET_REMOVE) + +! endif + +! end subroutine + end module CBucketEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 index 4a70ff0..806d30c 100644 --- a/CSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 @@ -1,48 +1,48 @@ -module CElevatorEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Elevator() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Elevator=TopDrive' -!#endif -! -! -! -! -! -! -! -! -! -! -! -! -! -! -! -! -! -! endif -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Elevator=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_Elevator() - implicit none - ! imp me... - end subroutine - +module CElevatorEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Elevator() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Elevator=TopDrive' +!#endif +! +! +! +! +! +! +! +! +! +! +! +! +! +! +! +! +! +! endif +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Elevator=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_Elevator() + implicit none + ! imp me... + end subroutine + end module CElevatorEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 index 824aca2..0e935ba 100644 --- a/CSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 @@ -1,29 +1,29 @@ -module CFlowKellyDisconnectEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_FlowKellyDisconnect() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_FlowKellyDisconnect=TopDrive' -!#endif -! endif -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_FlowKellyDisconnect=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_FlowKellyDisconnect() - implicit none - end subroutine - +module CFlowKellyDisconnectEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_FlowKellyDisconnect() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_FlowKellyDisconnect=TopDrive' +!#endif +! endif +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_FlowKellyDisconnect=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_FlowKellyDisconnect() + implicit none + end subroutine + end module CFlowKellyDisconnectEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 index fb5adea..c4fb52a 100644 --- a/CSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 @@ -1,29 +1,29 @@ -module CFlowPipeDisconnectEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_FlowPipeDisconnect() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_FlowPipeDisconnect=TopDrive' -!#endif -! endif -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_FlowPipeDisconnect=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_FlowPipeDisconnect() - implicit none - end subroutine - +module CFlowPipeDisconnectEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_FlowPipeDisconnect() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_FlowPipeDisconnect=TopDrive' +!#endif +! endif +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_FlowPipeDisconnect=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_FlowPipeDisconnect() + implicit none + end subroutine + end module CFlowPipeDisconnectEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CHeadEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CHeadEnum.f90 index 0bc177f..b71bff1 100644 --- a/CSharp/OperationScenarios/UnitySignals/CHeadEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CHeadEnum.f90 @@ -1,180 +1,180 @@ -module CHeadEnum - use OperationScenariosModule - implicit none - ! enum, bind(c) - ! enumerator FILLUP_HEAD_REMOVE - ! enumerator FILLUP_HEAD_INSTALL - ! end enum - contains - - subroutine Set_FillupHead(v) - use CManifolds, only: ToggleFillupHead - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%unitySignals%FillupHead == v) return -#endif - data%State%unitySignals%FillupHead = v - - if (data%State%unitySignals%FillupHead == FILLUP_HEAD_INSTALL) then - call ToggleFillupHead(.true.) - else if (data%State%unitySignals%FillupHead == FILLUP_HEAD_REMOVE) then - call ToggleFillupHead(.false.) - endif - -#ifdef deb - print*, 'data%State%unitySignals%FillupHead=', data%State%unitySignals%FillupHead -#endif - call OnFillupHeadChange%RunAll() - end subroutine - - integer function Get_FillupHead() - implicit none - Get_FillupHead = FillupHead - end function - - subroutine Evaluate_FillupHead() - use CStudentStationVariables!, only: data%State%StudentStation%FillupHeadInstallation - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_FillupHead=TopDrive' -#endif - endif - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_FillupHead=Kelly' -#endif - endif - - - if (Get_FillupHead() == FILLUP_HEAD_INSTALL) then - data%State%StudentStation%FillupHeadInstallation = .true. - else if (Get_FillupHead() == FILLUP_HEAD_REMOVE) then - data%State%StudentStation%FillupHeadInstallation = .false. - endif - - end subroutine - - ! subroutine Subscribe_FillupHead() - ! use CStudentStationVariables - ! implicit none - ! call OnState%StudentStation%FillupHeadInstallationPress%Add(ButtonPress_State%StudentStation%FillupHeadInstallation) - ! call OnFillupHeadRemovePress%Add(ButtonPress_FillupHeadRemove) - ! end subroutine - - subroutine ButtonPress_FillupHeadInstallation() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_State%StudentStation%FillupHeadInstallation=TopDrive' -#endif - - - - !TOPDRIVE-CODE=67 - if (Get_FillupHeadPermission()) then - call Set_FillupHead(FILLUP_HEAD_INSTALL) - - return - end if - - - endif - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_State%StudentStation%FillupHeadInstallation=Kelly' -#endif - - - !OPERATION-CODE=71 - if (Get_InstallFillupHeadPermission()) then - call Set_FillupHead(FILLUP_HEAD_INSTALL) - - return - end if - - - endif - - - - - - - - end subroutine - - - subroutine ButtonPress_FillupHeadRemove() - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_FillupHeadRemove=TopDrive' -#endif - - - !TOPDRIVE-CODE=68 - if (Get_FillupHeadPermission()) then - call Set_FillupHead(FILLUP_HEAD_REMOVE) - - return - end if - - - endif - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_FillupHeadRemove=Kelly' -#endif - - - !OPERATION-CODE=72 - if (Get_InstallFillupHeadPermission()) then - call Set_FillupHead(FILLUP_HEAD_REMOVE) - return - end if - - - - - endif - - - - - - - end subroutine - +module CHeadEnum + use OperationScenariosModule + implicit none + ! enum, bind(c) + ! enumerator FILLUP_HEAD_REMOVE + ! enumerator FILLUP_HEAD_INSTALL + ! end enum + contains + + subroutine Set_FillupHead(v) + use CManifolds, only: ToggleFillupHead + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%unitySignals%FillupHead == v) return +#endif + data%State%unitySignals%FillupHead = v + + if (data%State%unitySignals%FillupHead == FILLUP_HEAD_INSTALL) then + call ToggleFillupHead(.true.) + else if (data%State%unitySignals%FillupHead == FILLUP_HEAD_REMOVE) then + call ToggleFillupHead(.false.) + endif + +#ifdef deb + print*, 'data%State%unitySignals%FillupHead=', data%State%unitySignals%FillupHead +#endif + call OnFillupHeadChange%RunAll() + end subroutine + + integer function Get_FillupHead() + implicit none + Get_FillupHead = FillupHead + end function + + subroutine Evaluate_FillupHead() + use CStudentStationVariables!, only: data%State%StudentStation%FillupHeadInstallation + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_FillupHead=TopDrive' +#endif + endif + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_FillupHead=Kelly' +#endif + endif + + + if (Get_FillupHead() == FILLUP_HEAD_INSTALL) then + data%State%StudentStation%FillupHeadInstallation = .true. + else if (Get_FillupHead() == FILLUP_HEAD_REMOVE) then + data%State%StudentStation%FillupHeadInstallation = .false. + endif + + end subroutine + + ! subroutine Subscribe_FillupHead() + ! use CStudentStationVariables + ! implicit none + ! call OnState%StudentStation%FillupHeadInstallationPress%Add(ButtonPress_State%StudentStation%FillupHeadInstallation) + ! call OnFillupHeadRemovePress%Add(ButtonPress_FillupHeadRemove) + ! end subroutine + + subroutine ButtonPress_FillupHeadInstallation() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_State%StudentStation%FillupHeadInstallation=TopDrive' +#endif + + + + !TOPDRIVE-CODE=67 + if (Get_FillupHeadPermission()) then + call Set_FillupHead(FILLUP_HEAD_INSTALL) + + return + end if + + + endif + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_State%StudentStation%FillupHeadInstallation=Kelly' +#endif + + + !OPERATION-CODE=71 + if (Get_InstallFillupHeadPermission()) then + call Set_FillupHead(FILLUP_HEAD_INSTALL) + + return + end if + + + endif + + + + + + + + end subroutine + + + subroutine ButtonPress_FillupHeadRemove() + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_FillupHeadRemove=TopDrive' +#endif + + + !TOPDRIVE-CODE=68 + if (Get_FillupHeadPermission()) then + call Set_FillupHead(FILLUP_HEAD_REMOVE) + + return + end if + + + endif + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_FillupHeadRemove=Kelly' +#endif + + + !OPERATION-CODE=72 + if (Get_InstallFillupHeadPermission()) then + call Set_FillupHead(FILLUP_HEAD_REMOVE) + return + end if + + + + + endif + + + + + + + end subroutine + end module CHeadEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 index 397aebd..9ed9512 100644 --- a/CSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 @@ -1,33 +1,33 @@ -module CIbopEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Ibop() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Ibop=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Ibop=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_Ibop() - implicit none - ! imp me... - end subroutine - +module CIbopEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Ibop() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Ibop=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Ibop=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_Ibop() + implicit none + ! imp me... + end subroutine + end module CIbopEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 index 1c5b612..73309e8 100644 --- a/CSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 @@ -1,69 +1,69 @@ -module CKellyEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Kelly() - !use UnitySignalsModule - implicit none - - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Kelly=TopDrive' -!#endif -! endif -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Kelly=Kelly' -!#endif -! endif - - - - - -! if(OperationCondition == OPERATION_DRILL) then -! call Set_Kelly(INSTALL_KELLY) -!#ifdef deb -! print*, 'KELLY=INSTALL_KELLY' -!#endif -! endif -! if(OperationCondition == OPERATION_TRIP) then -! call Set_Kelly(KELLY_BACK) -!#ifdef deb -! print*, 'KELLY=KELLY_BACK' -!#endif -! endif - - end subroutine - - subroutine Subscribe_Kelly() - implicit none - !call OnOperationConditionChangeInt%Add(On_OperationCondition) - end subroutine -! -! subroutine On_OperationCondition(v) -! implicit none -! integer , intent(in) :: v -! if(v == OPERATION_DRILL) then -! call Set_Kelly(KELLY_INSTALL) -!#ifdef deb -! print*, 'KELLY=INSTALL_KELLY' -!#endif -! endif -! if(v == OPERATION_TRIP) then -! call Set_Kelly(KELLY_REMOVE) -!#ifdef deb -! print*, 'KELLY=KELLY_BACK' -!#endif -! endif -! -! end subroutine - +module CKellyEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Kelly() + !use UnitySignalsModule + implicit none + + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Kelly=TopDrive' +!#endif +! endif +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Kelly=Kelly' +!#endif +! endif + + + + + +! if(OperationCondition == OPERATION_DRILL) then +! call Set_Kelly(INSTALL_KELLY) +!#ifdef deb +! print*, 'KELLY=INSTALL_KELLY' +!#endif +! endif +! if(OperationCondition == OPERATION_TRIP) then +! call Set_Kelly(KELLY_BACK) +!#ifdef deb +! print*, 'KELLY=KELLY_BACK' +!#endif +! endif + + end subroutine + + subroutine Subscribe_Kelly() + implicit none + !call OnOperationConditionChangeInt%Add(On_OperationCondition) + end subroutine +! +! subroutine On_OperationCondition(v) +! implicit none +! integer , intent(in) :: v +! if(v == OPERATION_DRILL) then +! call Set_Kelly(KELLY_INSTALL) +!#ifdef deb +! print*, 'KELLY=INSTALL_KELLY' +!#endif +! endif +! if(v == OPERATION_TRIP) then +! call Set_Kelly(KELLY_REMOVE) +!#ifdef deb +! print*, 'KELLY=KELLY_BACK' +!#endif +! endif +! +! end subroutine + end module CKellyEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 index e4c1da5..0cda5ea 100644 --- a/CSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 @@ -1,41 +1,41 @@ -module CMouseHoleEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_MouseHole() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_MouseHole=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_MouseHole=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_MouseHole() - !use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - !call OnFillMouseHolePress%Add(ButtonPress_MouseHole) - end subroutine - - !subroutine ButtonPress_MouseHole() - ! implicit none - ! print*, 'ButtonPress_MouseHole' - !end subroutine - +module CMouseHoleEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_MouseHole() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_MouseHole=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_MouseHole=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_MouseHole() + !use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + !call OnFillMouseHolePress%Add(ButtonPress_MouseHole) + end subroutine + + !subroutine ButtonPress_MouseHole() + ! implicit none + ! print*, 'ButtonPress_MouseHole' + !end subroutine + end module CMouseHoleEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/COperationConditionEnum.f90 b/CSharp/OperationScenarios/UnitySignals/COperationConditionEnum.f90 index dd046aa..0fe9466 100644 --- a/CSharp/OperationScenarios/UnitySignals/COperationConditionEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/COperationConditionEnum.f90 @@ -1,181 +1,181 @@ -module COperationConditionEnum - use CLog4 - use OperationScenariosModule - use SimulationVariables - implicit none - ! enum, bind(c) - ! enumerator OPERATION_DRILL - ! enumerator OPERATION_TRIP - ! end enum - - contains - - subroutine Set_OperationCondition(v) - ! use CKellyEnumVariables - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%unitySignals%OperationCondition == v) return -#endif - data%State%unitySignals%OperationCondition = v -#ifdef deb - print*, 'data%State%unitySignals%OperationCondition=', data%State%unitySignals%OperationCondition -#endif - ! call OnOperationConditionChange%RunAll() - ! call OnOperationConditionChangeInt%RunAll(data%State%unitySignals%OperationCondition) - end subroutine - - integer function Get_OperationCondition() - implicit none - Get_OperationCondition = data%State%unitySignals%OperationCondition - end function - - - - - subroutine Evaluate_OperationCondition() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OperationCondition=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_OperationCondition=Kelly' -!#endif -! endif - - end subroutine - - ! subroutine Subscribe_OperationCondition() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - ! call OnLatchPipePress%Add(ButtonPress_Latch_OperationCondition) - ! call OnUnlatchPipePress%Add(ButtonPress_Unlatch_OperationCondition) - ! end subroutine - - subroutine ButtonPress_Latch_OperationCondition() - ! use ConfigurationVariables - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, Kelly_DriveType - use CManifolds, only: InstallKellyCock - implicit none - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Latch_OperationCondition=TopDrive' -#endif - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Latch_OperationCondition=Kelly' -#endif - - !OPERATION-CODE=17 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_RAT_HOLE_END .and.& - Get_LatchLed() .and.& - Get_UnlatchLed() == .false.) then - - call Set_OperationCondition(OPERATION_DRILL) - call Set_LatchLed(.false.) - call Set_UnlatchLed(.true.) - call Set_Kelly(KELLY_INSTALL) - if(data%State%Hoisting%DriveType == Kelly_DriveType) then - call InstallKellyCock() !drill mode - endif - return - end if - - endif - - - - - - - - - - end subroutine - - subroutine ButtonPress_Unlatch_OperationCondition() - use CHoistingVariables - use SimulationVariables!, only: data%State%Hoisting%DriveType, Kelly_DriveType - use CManifolds, only: RemoveKellyCock - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Unlatch_OperationCondition=TopDrive' -#endif - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Unlatch_OperationConditions=Kelly' -#endif - - - !OPERATION-CODE=18 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_RAT_HOLE_END .and.& - Get_LatchLed() == .false. .and.& - Get_UnlatchLed()) then - - call Set_Kelly(KELLY_REMOVE) - call Set_Swing(SWING_WELL_BEGIN) - call Set_OperationCondition(OPERATION_TRIP) - call Set_LatchLed(.true.) - call Set_UnlatchLed(.false.) - call Set_IrSafetyValveLed(.false.) - if(data%State%Hoisting%DriveType == Kelly_DriveType) then ! top drive mode - call RemoveKellyCock() !trip mode - endif - return - end if - - - - endif - - - - - - - end subroutine - +module COperationConditionEnum + use CLog4 + use OperationScenariosModule + use SimulationVariables + implicit none + ! enum, bind(c) + ! enumerator OPERATION_DRILL + ! enumerator OPERATION_TRIP + ! end enum + + contains + + subroutine Set_OperationCondition(v) + ! use CKellyEnumVariables + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%unitySignals%OperationCondition == v) return +#endif + data%State%unitySignals%OperationCondition = v +#ifdef deb + print*, 'data%State%unitySignals%OperationCondition=', data%State%unitySignals%OperationCondition +#endif + ! call OnOperationConditionChange%RunAll() + ! call OnOperationConditionChangeInt%RunAll(data%State%unitySignals%OperationCondition) + end subroutine + + integer function Get_OperationCondition() + implicit none + Get_OperationCondition = data%State%unitySignals%OperationCondition + end function + + + + + subroutine Evaluate_OperationCondition() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OperationCondition=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_OperationCondition=Kelly' +!#endif +! endif + + end subroutine + + ! subroutine Subscribe_OperationCondition() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + ! call OnLatchPipePress%Add(ButtonPress_Latch_OperationCondition) + ! call OnUnlatchPipePress%Add(ButtonPress_Unlatch_OperationCondition) + ! end subroutine + + subroutine ButtonPress_Latch_OperationCondition() + ! use ConfigurationVariables + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, Kelly_DriveType + use CManifolds, only: InstallKellyCock + implicit none + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Latch_OperationCondition=TopDrive' +#endif + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Latch_OperationCondition=Kelly' +#endif + + !OPERATION-CODE=17 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_RAT_HOLE_END .and.& + Get_LatchLed() .and.& + Get_UnlatchLed() == .false.) then + + call Set_OperationCondition(OPERATION_DRILL) + call Set_LatchLed(.false.) + call Set_UnlatchLed(.true.) + call Set_Kelly(KELLY_INSTALL) + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType) then + call InstallKellyCock() !drill mode + endif + return + end if + + endif + + + + + + + + + + end subroutine + + subroutine ButtonPress_Unlatch_OperationCondition() + use CHoistingVariables + use SimulationVariables!, only: data%Configuration%Hoisting%DriveType, Kelly_DriveType + use CManifolds, only: RemoveKellyCock + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Unlatch_OperationCondition=TopDrive' +#endif + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Unlatch_OperationConditions=Kelly' +#endif + + + !OPERATION-CODE=18 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_RAT_HOLE_END .and.& + Get_LatchLed() == .false. .and.& + Get_UnlatchLed()) then + + call Set_Kelly(KELLY_REMOVE) + call Set_Swing(SWING_WELL_BEGIN) + call Set_OperationCondition(OPERATION_TRIP) + call Set_LatchLed(.true.) + call Set_UnlatchLed(.false.) + call Set_IrSafetyValveLed(.false.) + if(data%Configuration%Hoisting%DriveType == Kelly_DriveType) then ! top drive mode + call RemoveKellyCock() !trip mode + endif + return + end if + + + + endif + + + + + + + end subroutine + end module COperationConditionEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 index a267773..85c131a 100644 --- a/CSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 @@ -1,32 +1,32 @@ -module CSafetyValveEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_SafetyValve() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_SafetyValve=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_SafetyValve=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_SafetyValve() - implicit none - end subroutine - +module CSafetyValveEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_SafetyValve() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_SafetyValve=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_SafetyValve=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_SafetyValve() + implicit none + end subroutine + end module CSafetyValveEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 index d0f8a3f..533390f 100644 --- a/CSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 @@ -1,158 +1,158 @@ -module CSlipsEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Slips() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Slips=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Slips=Kelly' -!#endif -! endif - - end subroutine - - ! subroutine Subscribe_Slips() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - - ! !call Set_Slips(SLIPS_SET) - - ! call OnSlipsPress%Add(ButtonPress_Slips) - ! end subroutine - - subroutine ButtonPress_Slips() - use UnitySignalsModule - use NotificationModule - use CUnityOutputs - use UnitySignalsModule !for CTdsConnectionModesEnum - implicit none - - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Slips=TopDrive' -#endif - - - !TOPDRIVE-CODE=30 - if (Get_Slips() == SLIPS_UNSET_END .and.& - Get_SlipsNotification()) then - - call Set_Slips(SLIPS_SET_BEGIN) - return - end if - - - - - - - !TOPDRIVE-CODE=31 - if (Get_TdsConnectionModes() == TDS_CONNECTION_STRING .and.& - Get_Slips() == SLIPS_SET_END .and.& - Get_SlipsNotification()) then - - call Set_Slips(SLIPS_UNSET_BEGIN) - return - end if - - - - - - - !TOPDRIVE-CODE=32 - if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& - Get_Slips() == SLIPS_SET_END .and.& - Get_SlipsNotification()) then - - call Set_Slips(SLIPS_UNSET_BEGIN) - return - end if - - - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Slips=Kelly' -#endif - - !OPERATION-CODE=19 - if (Get_Slips() == SLIPS_UNSET_END .and.& - Get_SlipsNotification()) then - - call Set_Slips(SLIPS_SET_BEGIN) - return - end if - - !OPERATION-CODE=20 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_SlipsNotification() .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_Slips(SLIPS_UNSET_BEGIN) - return - end if - - - !OPERATION-CODE=21 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& - GetRotaryRpm() == 0.0d0 .and.& - Get_SlipsNotification() .and.& - Get_Slips() == SLIPS_SET_END) then - - call Set_Slips(SLIPS_UNSET_BEGIN) - return - end if - - - - - - - endif - - - - - - - - - - end subroutine - +module CSlipsEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Slips() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Slips=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Slips=Kelly' +!#endif +! endif + + end subroutine + + ! subroutine Subscribe_Slips() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + + ! !call Set_Slips(SLIPS_SET) + + ! call OnSlipsPress%Add(ButtonPress_Slips) + ! end subroutine + + subroutine ButtonPress_Slips() + use UnitySignalsModule + use NotificationModule + use CUnityOutputs + use UnitySignalsModule !for CTdsConnectionModesEnum + implicit none + + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Slips=TopDrive' +#endif + + + !TOPDRIVE-CODE=30 + if (Get_Slips() == SLIPS_UNSET_END .and.& + Get_SlipsNotification()) then + + call Set_Slips(SLIPS_SET_BEGIN) + return + end if + + + + + + + !TOPDRIVE-CODE=31 + if (Get_TdsConnectionModes() == TDS_CONNECTION_STRING .and.& + Get_Slips() == SLIPS_SET_END .and.& + Get_SlipsNotification()) then + + call Set_Slips(SLIPS_UNSET_BEGIN) + return + end if + + + + + + + !TOPDRIVE-CODE=32 + if (Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_STRING .and.& + Get_Slips() == SLIPS_SET_END .and.& + Get_SlipsNotification()) then + + call Set_Slips(SLIPS_UNSET_BEGIN) + return + end if + + + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Slips=Kelly' +#endif + + !OPERATION-CODE=19 + if (Get_Slips() == SLIPS_UNSET_END .and.& + Get_SlipsNotification()) then + + call Set_Slips(SLIPS_SET_BEGIN) + return + end if + + !OPERATION-CODE=20 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_KellyConnection() == KELLY_CONNECTION_STRING .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_SlipsNotification() .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_Slips(SLIPS_UNSET_BEGIN) + return + end if + + + !OPERATION-CODE=21 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING .and.& + GetRotaryRpm() == 0.0d0 .and.& + Get_SlipsNotification() .and.& + Get_Slips() == SLIPS_SET_END) then + + call Set_Slips(SLIPS_UNSET_BEGIN) + return + end if + + + + + + + endif + + + + + + + + + + end subroutine + end module CSlipsEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CSlipsEnumVariables.f90 b/CSharp/OperationScenarios/UnitySignals/CSlipsEnumVariables.f90 index dd90735..180c840 100644 --- a/CSharp/OperationScenarios/UnitySignals/CSlipsEnumVariables.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CSlipsEnumVariables.f90 @@ -1,40 +1,40 @@ -module CSlipsEnumVariables - ! use CVoidEventHandlerCollection - implicit none - integer :: Slips = 0 - integer :: Slips_S = 0 - - public - - ! type(VoidEventHandlerCollection) :: OnSlipsChange - - enum, bind(c) - enumerator SLIPS_NEUTRAL - enumerator SLIPS_SET_BEGIN - enumerator SLIPS_SET_END - enumerator SLIPS_UNSET_BEGIN - enumerator SLIPS_UNSET_END - end enum - - private :: Slips - - contains - - subroutine Set_Slips(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(Slips == v) return -#endif - Slips = v -#ifdef deb - print*, 'Slips=', Slips -#endif - call OnSlipsChange%RunAll() - end subroutine - - integer function Get_Slips() - implicit none - Get_Slips = Slips - end function +module CSlipsEnumVariables + ! use CVoidEventHandlerCollection + implicit none + integer :: Slips = 0 + integer :: Slips_S = 0 + + public + + ! type(VoidEventHandlerCollection) :: OnSlipsChange + + enum, bind(c) + enumerator SLIPS_NEUTRAL + enumerator SLIPS_SET_BEGIN + enumerator SLIPS_SET_END + enumerator SLIPS_UNSET_BEGIN + enumerator SLIPS_UNSET_END + end enum + + private :: Slips + + contains + + subroutine Set_Slips(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(Slips == v) return +#endif + Slips = v +#ifdef deb + print*, 'Slips=', Slips +#endif + call OnSlipsChange%RunAll() + end subroutine + + integer function Get_Slips() + implicit none + Get_Slips = Slips + end function end module CSlipsEnumVariables \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 index 1272f4c..d4c202b 100644 --- a/CSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 @@ -1,235 +1,235 @@ -module CSwingEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Swing() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Swing=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Swing=Kelly' -!#endif -! endif - - end subroutine - - ! subroutine Subscribe_Swing() - ! use CDrillingConsoleVariables - ! use ConfigurationVariables - ! use ConfigurationVariables - ! implicit none - ! call OnSwingPress%Add(ButtonPress_Swing) - ! end subroutine - - subroutine ButtonPress_Swing() - implicit none - - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Swing=TopDrive' -#endif - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Swing=Kelly' -#endif - - - !!OPERATION-CODE=84 - !if (Get_OperationCondition() == OPERATION_DRILL .and.& - ! Get_HookHeight() >= (HKL + Get_NearFloorConnection() + RE) .and.& - ! Get_Swing() == SWING_RAT_HOLE_END) then - ! call Set_Swing(SWING_WELL_BEGIN) - ! return - !endif - - !OPERATION-CODE=26 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_SwingLed() .and.& - Get_FillMouseHoleLed() == .false.) then - - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - return - endif - - - - - !OPERATION-CODE=27 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& - Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_WELL_BEGIN) - return - endif - - - - - !OPERATION-CODE=28 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - return - endif - - - - !OPERATION-CODE=29 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + data%State%OperationScenario%SG) .and.& - Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_RAT_HOLE_BEGIN) - return - endif - - - !OPERATION-CODE=30 - if (Get_OperationCondition() == OPERATION_DRILL .and.& - Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& - Get_Swing() == SWING_RAT_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_WELL_BEGIN) - return - endif - - - - !OPERATION-CODE=31 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - return - endif - - - - !OPERATION-CODE=32 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= 27.41 .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - !Get_Swing() == SWING_WELL_END .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_RAT_HOLE_BEGIN) - return - endif - - - - !OPERATION-CODE=33 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - (Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and. Get_HookHeight() <= 27.41) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.&!Get_Swing() == SWING_MOUSE_HOLE_END .and.&!Get_Swing() /= SWING_WELL_END - Get_SwingLed()) then - - call Set_Swing(SWING_WELL_BEGIN) - return - endif - - - - !OPERATION-CODE=34 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_WELL_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_MOUSE_HOLE_BEGIN) - return - endif - - - - - - !OPERATION-CODE=35 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%RE) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& - Get_Swing() == SWING_MOUSE_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_WELL_BEGIN) - return - endif - - !OPERATION-CODE=80 - if (Get_OperationCondition() == OPERATION_TRIP .and.& - Get_HookHeight() >= 27.41 .and. Get_HookHeight() <= (27.41 + 10) .and.& - Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& - Get_Swing() == SWING_RAT_HOLE_END .and.& - Get_SwingLed()) then - - call Set_Swing(SWING_WELL_BEGIN) - return - end if - - - - - endif - - - - - - - - - - - - - - end subroutine - +module CSwingEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Swing() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Swing=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Swing=Kelly' +!#endif +! endif + + end subroutine + + ! subroutine Subscribe_Swing() + ! use CDrillingConsoleVariables + ! use ConfigurationVariables + ! use ConfigurationVariables + ! implicit none + ! call OnSwingPress%Add(ButtonPress_Swing) + ! end subroutine + + subroutine ButtonPress_Swing() + implicit none + + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Swing=TopDrive' +#endif + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Swing=Kelly' +#endif + + + !!OPERATION-CODE=84 + !if (Get_OperationCondition() == OPERATION_DRILL .and.& + ! Get_HookHeight() >= (HKL + Get_NearFloorConnection() + RE) .and.& + ! Get_Swing() == SWING_RAT_HOLE_END) then + ! call Set_Swing(SWING_WELL_BEGIN) + ! return + !endif + + !OPERATION-CODE=26 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_SwingLed() .and.& + Get_FillMouseHoleLed() == .false.) then + + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + return + endif + + + + + !OPERATION-CODE=27 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection() + data%State%OperationScenario%PL) .and.& + Get_KellyConnection() == KELLY_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_WELL_BEGIN) + return + endif + + + + + !OPERATION-CODE=28 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + return + endif + + + + !OPERATION-CODE=29 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + data%State%OperationScenario%SG) .and.& + Get_KellyConnection() == KELLY_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_RAT_HOLE_BEGIN) + return + endif + + + !OPERATION-CODE=30 + if (Get_OperationCondition() == OPERATION_DRILL .and.& + Get_HookHeight() >= (data%State%OperationScenario%HKL + Get_NearFloorConnection()) .and.& + Get_Swing() == SWING_RAT_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_WELL_BEGIN) + return + endif + + + + !OPERATION-CODE=31 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + return + endif + + + + !OPERATION-CODE=32 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= 27.41 .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + !Get_Swing() == SWING_WELL_END .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_RAT_HOLE_BEGIN) + return + endif + + + + !OPERATION-CODE=33 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + (Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection()) .and. Get_HookHeight() <= 27.41) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.&!Get_Swing() == SWING_MOUSE_HOLE_END .and.&!Get_Swing() /= SWING_WELL_END + Get_SwingLed()) then + + call Set_Swing(SWING_WELL_BEGIN) + return + endif + + + + !OPERATION-CODE=34 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_WELL_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_MOUSE_HOLE_BEGIN) + return + endif + + + + + + !OPERATION-CODE=35 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= (data%State%OperationScenario%HL + Get_NearFloorConnection() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG + data%State%OperationScenario%RE) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE .and.& + Get_Swing() == SWING_MOUSE_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_WELL_BEGIN) + return + endif + + !OPERATION-CODE=80 + if (Get_OperationCondition() == OPERATION_TRIP .and.& + Get_HookHeight() >= 27.41 .and. Get_HookHeight() <= (27.41 + 10) .and.& + Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING .and.& + Get_Swing() == SWING_RAT_HOLE_END .and.& + Get_SwingLed()) then + + call Set_Swing(SWING_WELL_BEGIN) + return + end if + + + + + endif + + + + + + + + + + + + + + end subroutine + end module CSwingEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 b/CSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 index f1656c6..177a988 100644 --- a/CSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 @@ -1,59 +1,59 @@ -module CTdsBackupClamp - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_TdsBackupClamp() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsBackupClamp=TopDrive' -#endif - - !TOPDRIVE-CODE=79 - if(Get_TdsBackupClamp() == BACKUP_CLAMP_OFF_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench) then - - call Set_TdsBackupClamp(BACKUP_CLAMP_FW_BEGIN) - - endif - - !TOPDRIVE-CODE=80 - if(Get_TdsBackupClamp() /= BACKUP_CLAMP_OFF_END .and.& - Get_TdsBackupClamp() /= BACKUP_CLAMP_OFF_BEGIN .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench == .false.) then - - call Set_TdsBackupClamp(BACKUP_CLAMP_OFF_BEGIN) - - endif - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsBackupClamp=Kelly' -#endif - endif - - end subroutine - - subroutine Subscribe_TdsBackupClamp() - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - end subroutine - +module CTdsBackupClamp + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_TdsBackupClamp() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsBackupClamp=TopDrive' +#endif + + !TOPDRIVE-CODE=79 + if(Get_TdsBackupClamp() == BACKUP_CLAMP_OFF_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench) then + + call Set_TdsBackupClamp(BACKUP_CLAMP_FW_BEGIN) + + endif + + !TOPDRIVE-CODE=80 + if(Get_TdsBackupClamp() /= BACKUP_CLAMP_OFF_END .and.& + Get_TdsBackupClamp() /= BACKUP_CLAMP_OFF_BEGIN .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState /= TdsPower_OFF .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrench == .false.) then + + call Set_TdsBackupClamp(BACKUP_CLAMP_OFF_BEGIN) + + endif + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsBackupClamp=Kelly' +#endif + endif + + end subroutine + + subroutine Subscribe_TdsBackupClamp() + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + end subroutine + end module CTdsBackupClamp \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 index a8c1408..c0234bd 100644 --- a/CSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 @@ -1,64 +1,64 @@ -module CTdsSpineEnum - use OperationScenariosModule - use UnitySignalsModule !for CTdsConnectionModesEnum, only:Get_TdsConnectionModes - implicit none - contains - - subroutine Evaluate_TdsSpine() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsSpine=TopDrive' -#endif - - !TOPDRIVE-CODE=83 - if (Get_TdsStemIn() .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - !Get_TdsConnectionPossible() .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_FWD .and.& - data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_SPINE) then - - call Set_TdsSpine(TDS_SPINE_CONNECT_BEGIN) - return - end if - - !TOPDRIVE-CODE=84 - if (Get_TdsStemIn() .and.& - Get_TdsTong() == TDS_TONG_BREAKOUT_END .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_SPINE .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_REV .and.& - data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_SPINE) then - - call Set_TdsSpine(TDS_SPINE_DISCONNECT_BEGIN) - return - end if - - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsSpine=Kelly' -#endif - endif - - end subroutine - - subroutine Subscribe_TdsSpine() - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - end subroutine - +module CTdsSpineEnum + use OperationScenariosModule + use UnitySignalsModule !for CTdsConnectionModesEnum, only:Get_TdsConnectionModes + implicit none + contains + + subroutine Evaluate_TdsSpine() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsSpine=TopDrive' +#endif + + !TOPDRIVE-CODE=83 + if (Get_TdsStemIn() .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + !Get_TdsConnectionPossible() .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_FWD .and.& + data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_SPINE) then + + call Set_TdsSpine(TDS_SPINE_CONNECT_BEGIN) + return + end if + + !TOPDRIVE-CODE=84 + if (Get_TdsStemIn() .and.& + Get_TdsTong() == TDS_TONG_BREAKOUT_END .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_SPINE .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_REV .and.& + data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_SPINE) then + + call Set_TdsSpine(TDS_SPINE_DISCONNECT_BEGIN) + return + end if + + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsSpine=Kelly' +#endif + endif + + end subroutine + + subroutine Subscribe_TdsSpine() + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + end subroutine + end module CTdsSpineEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 index ee3cd4a..e43da98 100644 --- a/CSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 @@ -1,144 +1,144 @@ -module CTdsSwingEnum - use OperationScenariosModule - use SimulationVariables - use UnitySignalsModule - implicit none - contains - - subroutine Evaluate_TdsSwing() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsSwing=TopDrive' -#endif - - - !TOPDRIVE-CODE=37 - if (Get_SwingDrillPermission() .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - Get_FillMouseHoleLed() == .false. .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_DRILL) then - - call Set_TdsSwing(TDS_SWING_DRILL_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - !TOPDRIVE-CODE=38 - if (Get_SwingTiltPermission() .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then - - call Set_TdsSwing(TDS_SWING_TILT_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - !TOPDRIVE-CODE=39 - if (Get_SwingOffPermission() .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then - - call Set_TdsSwing(TDS_SWING_OFF_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - - - !TOPDRIVE-CODE=40 - if (Get_SwingTiltPermission() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then - - call Set_TdsSwing(TDS_SWING_TILT_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - - - !TOPDRIVE-CODE=41 - if (Get_SwingOffPermission() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then - - call Set_TdsSwing(TDS_SWING_OFF_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - - - !TOPDRIVE-CODE=42 - if (Get_HookHeight() > (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_SwingTiltPermission() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& - Get_TdsSwing() == TDS_SWING_OFF_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then - - call Set_TdsSwing(TDS_SWING_TILT_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - - !TOPDRIVE-CODE=43 - if (Get_HookHeight() > (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& - Get_SwingOffPermission() .and.& - Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& - Get_TdsSwing() == TDS_SWING_TILT_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then - - call Set_TdsSwing(TDS_SWING_OFF_BEGIN) - data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON - return - end if - - - - endif - - - - - - - - - - - - -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_TdsSwing=Kelly' -!#endif -! endif - - end subroutine - - subroutine Subscribe_TdsSwing() - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - end subroutine - +module CTdsSwingEnum + use OperationScenariosModule + use SimulationVariables + use UnitySignalsModule + implicit none + contains + + subroutine Evaluate_TdsSwing() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsSwing=TopDrive' +#endif + + + !TOPDRIVE-CODE=37 + if (Get_SwingDrillPermission() .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + Get_FillMouseHoleLed() == .false. .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_DRILL) then + + call Set_TdsSwing(TDS_SWING_DRILL_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + !TOPDRIVE-CODE=38 + if (Get_SwingTiltPermission() .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then + + call Set_TdsSwing(TDS_SWING_TILT_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + !TOPDRIVE-CODE=39 + if (Get_SwingOffPermission() .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then + + call Set_TdsSwing(TDS_SWING_OFF_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + + + !TOPDRIVE-CODE=40 + if (Get_SwingTiltPermission() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then + + call Set_TdsSwing(TDS_SWING_TILT_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + + + !TOPDRIVE-CODE=41 + if (Get_SwingOffPermission() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_NOTHING .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then + + call Set_TdsSwing(TDS_SWING_OFF_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + + + !TOPDRIVE-CODE=42 + if (Get_HookHeight() > (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_SwingTiltPermission() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& + Get_TdsSwing() == TDS_SWING_OFF_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_TILT) then + + call Set_TdsSwing(TDS_SWING_TILT_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + + !TOPDRIVE-CODE=43 + if (Get_HookHeight() > (TL() + NFC() + data%State%OperationScenario%PL - data%State%OperationScenario%ECG) .and.& + Get_SwingOffPermission() .and.& + Get_TdsElevatorModes() == TDS_ELEVATOR_CONNECTION_SINGLE .and.& + Get_TdsSwing() == TDS_SWING_TILT_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltState == TdsLinkTilt_OFF) then + + call Set_TdsSwing(TDS_SWING_OFF_BEGIN) + data%EquipmentControl%TopDrivePanel%TopDriveLinkTiltLed = LED_ON + return + end if + + + + endif + + + + + + + + + + + + +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_TdsSwing=Kelly' +!#endif +! endif + + end subroutine + + subroutine Subscribe_TdsSwing() + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + end subroutine + end module CTdsSwingEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 index 01fb831..0c70421 100644 --- a/CSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 @@ -1,66 +1,66 @@ -module CTdsTongEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_TdsTong() - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsTong=TopDrive' -#endif - - - - !TOPDRIVE-CODE=1 - if (Get_TdsConnectionModes() == TDS_CONNECTION_SPINE .and.& - Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_FWD .and.& - data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_TORQ) then - - call Set_TdsTong(TDS_TONG_MAKEUP_BEGIN) - !TopDriveTorqueWrenchLed = LED_ON - return - end if - - - - !TOPDRIVE-CODE=2 - if (Get_TdsConnectionModes() == TDS_CONNECTION_STRING .and.& - Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_REV .and.& - data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_TORQ) then - - call Set_TdsTong(TDS_TONG_BREAKOUT_BEGIN) - !TopDriveTorqueWrenchLed = LED_ON - return - end if - - - endif - - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_TdsTong=Kelly' -#endif - endif - - end subroutine - - subroutine Subscribe_TdsTong() - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - implicit none - end subroutine - +module CTdsTongEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_TdsTong() + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsTong=TopDrive' +#endif + + + + !TOPDRIVE-CODE=1 + if (Get_TdsConnectionModes() == TDS_CONNECTION_SPINE .and.& + Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_FWD .and.& + data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_TORQ) then + + call Set_TdsTong(TDS_TONG_MAKEUP_BEGIN) + !TopDriveTorqueWrenchLed = LED_ON + return + end if + + + + !TOPDRIVE-CODE=2 + if (Get_TdsConnectionModes() == TDS_CONNECTION_STRING .and.& + Get_TdsBackupClamp() == BACKUP_CLAMP_FW_END .and.& + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState == TdsPower_REV .and.& + data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState == TdsMu_TORQ) then + + call Set_TdsTong(TDS_TONG_BREAKOUT_BEGIN) + !TopDriveTorqueWrenchLed = LED_ON + return + end if + + + endif + + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_TdsTong=Kelly' +#endif + endif + + end subroutine + + subroutine Subscribe_TdsTong() + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + implicit none + end subroutine + end module CTdsTongEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/CTongEnum.f90 b/CSharp/OperationScenarios/UnitySignals/CTongEnum.f90 index 613b515..9a27af7 100644 --- a/CSharp/OperationScenarios/UnitySignals/CTongEnum.f90 +++ b/CSharp/OperationScenarios/UnitySignals/CTongEnum.f90 @@ -1,154 +1,154 @@ -module CTongEnum - use OperationScenariosModule - implicit none - contains - - subroutine Evaluate_Tong() - implicit none - -! if (DriveType == TopDrive_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Tong=TopDrive' -!#endif -! endif -! -! -! -! -! -! -! -! -! if (DriveType == Kelly_DriveType) then -!#ifdef OST -! print*, 'Evaluate_Tong=Kelly' -!#endif -! endif - - end subroutine - - ! subroutine Subscribe_Tong() - ! use CDrillingConsoleVariables -!@ use ConfigurationVariables -!@ use ConfigurationVariables - ! implicit none - - ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout_TongNotification) - ! call OnMakeupLeverPress%Add(ButtonPress_Makeup_TongNotification) - ! call OnTongNeutralPress%Add(ButtonPress_Neutral_TongNotification) - - ! end subroutine - - - - subroutine ButtonPress_Breakout_TongNotification() - implicit none - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then - #ifdef OST - print*, 'ButtonPress_Breakout_TongNotification=TopDrive' - #endif - !TOPDRIVE-CODE=70 - if (Get_TongNotification()) then - call Set_Tong(TONG_BREAKOUT_BEGIN) - return - end if - endif - if (data%State%Hoisting%DriveType == Kelly_DriveType) then - #ifdef OST - print*, 'ButtonPress_Breakout_TongNotification=Kelly' - #endif - !OPERATION-CODE=74 - if (Get_TongNotification()) then - call Set_Tong(TONG_BREAKOUT_BEGIN) - endif - endif - end subroutine - - - - - - - - subroutine ButtonPress_Makeup_TongNotification() - use NotificationModule - implicit none - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Makeup_TongNotification=TopDrive' -#endif - - - !TOPDRIVE-CODE=69 - if (Get_TongNotification()) then - - call Set_Tong(TONG_MAKEUP_BEGIN) - return - end if - - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Makeup_TongNotification=Kelly' -#endif - - - !OPERATION-CODE=73 - if (Get_TongNotification()) then - call Set_Tong(TONG_MAKEUP_BEGIN) - endif - - endif - - - - - - - - - end subroutine - - subroutine ButtonPress_Neutral_TongNotification() - implicit none - - - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'ButtonPress_Neutral_TongNotification=TopDrive' -#endif - endif - - - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'ButtonPress_Neutral_TongNotification=Kelly' -#endif - - call Set_Tong(TONG_NEUTRAL) - - - endif - - - end subroutine - +module CTongEnum + use OperationScenariosModule + implicit none + contains + + subroutine Evaluate_Tong() + implicit none + +! if (DriveType == TopDrive_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Tong=TopDrive' +!#endif +! endif +! +! +! +! +! +! +! +! +! if (DriveType == Kelly_DriveType) then +!#ifdef OST +! print*, 'Evaluate_Tong=Kelly' +!#endif +! endif + + end subroutine + + ! subroutine Subscribe_Tong() + ! use CDrillingConsoleVariables +!@ use ConfigurationVariables +!@ use ConfigurationVariables + ! implicit none + + ! call OnBreakoutLeverPress%Add(ButtonPress_Breakout_TongNotification) + ! call OnMakeupLeverPress%Add(ButtonPress_Makeup_TongNotification) + ! call OnTongNeutralPress%Add(ButtonPress_Neutral_TongNotification) + + ! end subroutine + + + + subroutine ButtonPress_Breakout_TongNotification() + implicit none + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then + #ifdef OST + print*, 'ButtonPress_Breakout_TongNotification=TopDrive' + #endif + !TOPDRIVE-CODE=70 + if (Get_TongNotification()) then + call Set_Tong(TONG_BREAKOUT_BEGIN) + return + end if + endif + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then + #ifdef OST + print*, 'ButtonPress_Breakout_TongNotification=Kelly' + #endif + !OPERATION-CODE=74 + if (Get_TongNotification()) then + call Set_Tong(TONG_BREAKOUT_BEGIN) + endif + endif + end subroutine + + + + + + + + subroutine ButtonPress_Makeup_TongNotification() + use NotificationModule + implicit none + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Makeup_TongNotification=TopDrive' +#endif + + + !TOPDRIVE-CODE=69 + if (Get_TongNotification()) then + + call Set_Tong(TONG_MAKEUP_BEGIN) + return + end if + + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Makeup_TongNotification=Kelly' +#endif + + + !OPERATION-CODE=73 + if (Get_TongNotification()) then + call Set_Tong(TONG_MAKEUP_BEGIN) + endif + + endif + + + + + + + + + end subroutine + + subroutine ButtonPress_Neutral_TongNotification() + implicit none + + + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'ButtonPress_Neutral_TongNotification=TopDrive' +#endif + endif + + + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'ButtonPress_Neutral_TongNotification=Kelly' +#endif + + call Set_Tong(TONG_NEUTRAL) + + + endif + + + end subroutine + end module CTongEnum \ No newline at end of file diff --git a/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90 b/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90 index 96c1cef..7ce580e 100644 --- a/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90 +++ b/CSharp/OperationScenarios/UnitySignals/UnitySignals.f90 @@ -1,489 +1,489 @@ -module UnitySignalsModule - use UnitySignalVariables - use SimulationVariables -contains - -subroutine Set_TdsElevatorModes(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsElevatorModes == v) return -#endif - data%State%unitySignals%TdsElevatorModes = v - !**call TdsElevatorModesEnum%OnTdsElevatorModesChange%RunAll() -end subroutine - -integer function Get_TdsElevatorModes() - implicit none - Get_TdsElevatorModes = data%State%unitySignals%TdsElevatorModes -end function - -subroutine Set_Ibop_Install() - implicit none - call Set_Ibop(IBOP_INSTALL) -end subroutine - -subroutine Set_Ibop_Remove() - implicit none - call Set_Ibop(IBOP_REMOVE) -end subroutine - -subroutine Set_Tong(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Tong == v) return - #endif - data%State%unitySignals%Tong = v - #ifdef deb - print*, 'Tong=', data%State%unitySignals%Tong - #endif - !**call data%State%unitySignals%OnTongChange%RunAll() -end subroutine - -integer function Get_Tong() - implicit none - Get_Tong = data%State%unitySignals%Tong -end function - - -subroutine Set_TdsTong(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsTong == v) return - #endif - data%State%unitySignals%TdsTong = v - #ifdef deb - print*, 'TdsTong=', data%State%unitySignals%TdsTong - #endif - !**call data%State%unitySignals%OnTdsTongChange%RunAll() -end subroutine - -integer function Get_TdsTong() - implicit none - Get_TdsTong = data%State%unitySignals%TdsTong -end function - - -subroutine Set_TdsSwing(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsSwing == v) return - #endif - data%State%unitySignals%TdsSwing = v - #ifdef deb - print*, 'TdsSwing=', data%State%unitySignals%TdsSwing - #endif - !**call data%State%unitySignals%OnTdsSwingChange%RunAll() -end subroutine - -integer function Get_TdsSwing() - implicit none - Get_TdsSwing = data%State%unitySignals%TdsSwing -end function - - -subroutine Set_TdsSpine(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsSpine == v) return - #endif - data%State%unitySignals%TdsSpine = v - #ifdef deb - print*, 'TdsSpine=', data%State%unitySignals%TdsSpine - #endif - !**call data%State%unitySignals%OnTdsSpineChange%RunAll() -end subroutine - -integer function Get_TdsSpine() - implicit none - Get_TdsSpine = data%State%unitySignals%TdsSpine -end function - - -subroutine Set_TdsBackupClamp(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsBackupClamp == v) return - #endif - data%State%unitySignals%TdsBackupClamp = v - #ifdef deb - print*, 'TdsBackupClamp=', data%State%unitySignals%TdsBackupClamp - #endif - !**call data%State%unitySignals%OnTdsBackupClampChange%RunAll() -end subroutine - -integer function Get_TdsBackupClamp() - implicit none - Get_TdsBackupClamp = data%State%unitySignals%TdsBackupClamp -end function - - -subroutine Set_Swing(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Swing == v) return - #endif - data%State%unitySignals%Swing = v - #ifdef deb - print*, 'Swing=', data%State%unitySignals%Swing - #endif - !**call data%State%unitySignals%OnSwingChange%RunAll() -end subroutine - -integer function Get_Swing() - implicit none - Get_Swing = data%State%unitySignals%Swing -end function - - -subroutine Set_Slips(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Slips == v) return - #endif - data%State%unitySignals%Slips = v - #ifdef deb - print*, 'Slips=', data%State%unitySignals%Slips - #endif - !**call data%State%unitySignals%OnSlipsChange%RunAll() -end subroutine - -integer function Get_Slips() - implicit none - Get_Slips = data%State%unitySignals%Slips -end function - -subroutine Set_Operation(i) - implicit none - integer, intent (in) :: i - data%State%unitySignals%operation = i -end subroutine - -subroutine Set_SafetyValve(v) - implicit none - integer , intent(in) :: v -#ifdef ExcludeExtraChanges - if(data%State%unitySignals%SafetyValve == v) return -#endif - data%State%unitySignals%SafetyValve = v -#ifdef deb - if(data%State%unitySignals%SafetyValve == SAFETY_VALVE_NEUTRAL) then - print*, 'SafetyValve=SAFETY_VALVE_NEUTRAL' - else if (data%State%unitySignals%SafetyValve == SAFETY_VALVE_INSTALL) then - print*, 'SafetyValve=SAFETY_VALVE_INSTALL' - else if (data%State%unitySignals%SafetyValve == SAFETY_VALVE_INSTALL) then - print*, 'SafetyValve=SAFETY_VALVE_REMOVE' - endif -#endif - !**call data%State%unitySignals%OnSafetyValveChange%RunAll() -end subroutine - -integer function Get_SafetyValve() - implicit none - Get_SafetyValve = data%State%unitySignals%SafetyValve -end function - -subroutine Set_SafetyValve_Install() - implicit none - call Set_SafetyValve(SAFETY_VALVE_INSTALL) -end subroutine - -subroutine Set_SafetyValve_Remove() - implicit none - call Set_SafetyValve(SAFETY_VALVE_REMOVE) -end subroutine - - -subroutine Set_OperationCondition(v) - ! use CKellyEnumVariables - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%OperationCondition == v) return - #endif - data%State%unitySignals%OperationCondition = v - #ifdef deb - print*, 'OperationCondition=', data%State%unitySignals%OperationCondition - #endif - !**call data%State%unitySignals%OnOperationConditionChange%RunAll() - !**call data%State%unitySignals%OnOperationConditionChangeInt%RunAll(data%State%unitySignals%OperationCondition) -end subroutine - -integer function Get_OperationCondition() - implicit none - Get_OperationCondition = data%State%unitySignals%OperationCondition -end function - -subroutine Evaluate_OperationCondition() - implicit none -end subroutine - - -subroutine Set_MouseHole(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%MouseHole == v) return - #endif - !call sleep(2) - data%State%unitySignals%MouseHole = v - #ifdef deb - print*, 'MouseHole=', data%State%unitySignals%MouseHole - #endif - !**call data%State%unitySignals%OnMouseHoleChange%RunAll() -end subroutine - -integer function Get_MouseHole() - implicit none - Get_MouseHole = data%State%unitySignals%MouseHole -end function - - - -subroutine Set_Kelly(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Kelly == v) return - #endif - data%State%unitySignals%Kelly = v - #ifdef deb - print*, 'Kelly=', data%State%unitySignals%Kelly - #endif - !**call data%State%unitySignals%OnKellyChange%RunAll() -end subroutine - -integer function Get_Kelly() - implicit none - Get_Kelly = data%State%unitySignals%Kelly -end function - - -subroutine Set_Ibop(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Ibop == v) return - #endif - data%State%unitySignals%Ibop = v - #ifdef deb - print*, 'Ibop=', data%State%unitySignals%Ibop - #endif - !**call data%State%unitySignals%OnIbopChange%RunAll() -end subroutine - -integer function Get_Ibop() - implicit none - Get_Ibop = data%State%unitySignals%Ibop -end function - - -subroutine Set_FillupHead(v) - use CManifolds, only: ToggleFillupHead - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%FillupHead == v) return - #endif - data%State%unitySignals%FillupHead = v - - if (data%State%unitySignals%FillupHead == FILLUP_HEAD_INSTALL) then - call ToggleFillupHead(.true.) - else if (data%State%unitySignals%FillupHead == FILLUP_HEAD_REMOVE) then - call ToggleFillupHead(.false.) - endif - - #ifdef deb - print*, 'FillupHead=', data%State%unitySignals%FillupHead - #endif - !**call data%State%unitySignals%OnFillupHeadChange%RunAll() -end subroutine - -integer function Get_FillupHead() - implicit none - Get_FillupHead = data%State%unitySignals%FillupHead -end function - -subroutine Evaluate_FillupHead() - use CHoistingVariables - use SimulationVariables - use CStudentStationVariables!, only: data%State%StudentStation%FillupHeadInstallation - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then -#ifdef OST - print*, 'Evaluate_FillupHead=TopDrive' -#endif - endif - - - - - - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then -#ifdef OST - print*, 'Evaluate_FillupHead=Kelly' -#endif - endif - - - if (Get_FillupHead() == FILLUP_HEAD_INSTALL) then - data%State%StudentStation%FillupHeadInstallation = .true. - else if (Get_FillupHead() == FILLUP_HEAD_REMOVE) then - data%State%StudentStation%FillupHeadInstallation = .false. - endif - -end subroutine - - -subroutine Set_Elevator(v) - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%Elevator == v) return - #endif - data%State%unitySignals%Elevator = v - #ifdef deb - print*, 'Elevator=', data%State%unitySignals%Elevator - #endif - !**call data%State%unitySignals%OnElevatorChange%RunAll() -end subroutine - -integer function Get_Elevator() - implicit none - Get_Elevator = data%State%unitySignals%Elevator -end function - - - -subroutine Set_MudBucket(v) - use CManifolds, only: ToggleMudBox - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%MudBucket == v) return - #endif - data%State%unitySignals%MudBucket = v - if (data%State%unitySignals%MudBucket == MUD_BUCKET_INSTALL) then - call ToggleMudBox(.true.) - else if (data%State%unitySignals%MudBucket == MUD_BUCKET_REMOVE) then - call ToggleMudBox(.false.) - endif - #ifdef deb - print*, 'MudBucket=', data%State%unitySignals%MudBucket - #endif - !**call data%State%unitySignals%OnMudBucketChange%RunAll() -end subroutine - -integer function Get_MudBucket() - implicit none - Get_MudBucket = data%State%unitySignals%MudBucket -end function - -subroutine Evaluate_MudBucket() - use CStudentStationVariables!, only: data%State%StudentStation%MudBoxInstallation - implicit none - - if (Get_MudBucket() == MUD_BUCKET_INSTALL) then - data%State%StudentStation%MudBoxInstallation = .true. - else if (Get_MudBucket() == MUD_BUCKET_REMOVE) then - data%State%StudentStation%MudBoxInstallation = .false. - endif - -end subroutine - - -!! Moved from CTdsConnectionModeEnum - -subroutine Set_TdsConnectionModes(v) - use CManifolds, Only: KellyConnected, KellyDisconnected - implicit none - integer , intent(in) :: v - #ifdef ExcludeExtraChanges - if(data%State%unitySignals%TdsConnectionModes == v) return - #endif - data%State%unitySignals%TdsConnectionModes = v - - if(data%State%unitySignals%TdsConnectionModes == TDS_CONNECTION_NOTHING) then - call KellyDisconnected() - else - call KellyConnected() - endif - - #ifdef deb - print*, 'data%State%unitySignals%TdsConnectionModes=', data%State%unitySignals%TdsConnectionModes - #endif - !**call data%State%unitySignals%OnTdsConnectionModesChange%RunAll() -end subroutine - -integer function Get_TdsConnectionModes() - use SimulationVariables - implicit none - Get_TdsConnectionModes = data%State%unitySignals%TdsConnectionModes -end function - -subroutine Evaluate_TdsConnectionModes() - use CUnityInputs - use SimulationVariables - implicit none - - if (data%State%Hoisting%DriveType == TopDrive_DriveType) then - #ifdef OST - print*, 'Evaluate_TdsConnectionModes=TopDrive' - #endif - !TOPDRIVE-CODE=3 - if (Get_TdsStemIn() .and.& - Get_TdsSpine() == TDS_SPINE_CONNECT_END .and.& - !TopDriveDrillTorqueState == TdsMu_SPINE - Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then - - call Set_TdsConnectionModes(TDS_CONNECTION_SPINE) - return - end if - - !TOPDRIVE-CODE=4 - if (Get_TdsTong() == TDS_TONG_MAKEUP_END .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_SPINE ) then - - call Set_TdsConnectionModes(TDS_CONNECTION_STRING) - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = LED_OFF - return - end if - - !TOPDRIVE-CODE=5 - if (Get_TdsTong() == TDS_TONG_BREAKOUT_END .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_STRING ) then - - call Set_TdsConnectionModes(TDS_CONNECTION_SPINE) - data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = LED_OFF - return - end if - - !TOPDRIVE-CODE=6 - if (Get_TdsSpine() == TDS_SPINE_DISCONNECT_END .and.& - !Get_TdsStemIn() == .false. .and.& - Get_TdsConnectionModes() == TDS_CONNECTION_SPINE) then - - call Set_TdsConnectionModes(TDS_CONNECTION_NOTHING) - return - end if - - endif - - if (data%State%Hoisting%DriveType == Kelly_DriveType) then - #ifdef OST - print*, 'Evaluate_TdsConnectionModes=Kelly' - #endif - endif - -end subroutine - -end module UnitySignalsModule +module UnitySignalsModule + use UnitySignalVariables + use SimulationVariables +contains + +subroutine Set_TdsElevatorModes(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsElevatorModes == v) return +#endif + data%State%unitySignals%TdsElevatorModes = v + !**call TdsElevatorModesEnum%OnTdsElevatorModesChange%RunAll() +end subroutine + +integer function Get_TdsElevatorModes() + implicit none + Get_TdsElevatorModes = data%State%unitySignals%TdsElevatorModes +end function + +subroutine Set_Ibop_Install() + implicit none + call Set_Ibop(IBOP_INSTALL) +end subroutine + +subroutine Set_Ibop_Remove() + implicit none + call Set_Ibop(IBOP_REMOVE) +end subroutine + +subroutine Set_Tong(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Tong == v) return + #endif + data%State%unitySignals%Tong = v + #ifdef deb + print*, 'Tong=', data%State%unitySignals%Tong + #endif + !**call data%State%unitySignals%OnTongChange%RunAll() +end subroutine + +integer function Get_Tong() + implicit none + Get_Tong = data%State%unitySignals%Tong +end function + + +subroutine Set_TdsTong(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsTong == v) return + #endif + data%State%unitySignals%TdsTong = v + #ifdef deb + print*, 'TdsTong=', data%State%unitySignals%TdsTong + #endif + !**call data%State%unitySignals%OnTdsTongChange%RunAll() +end subroutine + +integer function Get_TdsTong() + implicit none + Get_TdsTong = data%State%unitySignals%TdsTong +end function + + +subroutine Set_TdsSwing(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsSwing == v) return + #endif + data%State%unitySignals%TdsSwing = v + #ifdef deb + print*, 'TdsSwing=', data%State%unitySignals%TdsSwing + #endif + !**call data%State%unitySignals%OnTdsSwingChange%RunAll() +end subroutine + +integer function Get_TdsSwing() + implicit none + Get_TdsSwing = data%State%unitySignals%TdsSwing +end function + + +subroutine Set_TdsSpine(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsSpine == v) return + #endif + data%State%unitySignals%TdsSpine = v + #ifdef deb + print*, 'TdsSpine=', data%State%unitySignals%TdsSpine + #endif + !**call data%State%unitySignals%OnTdsSpineChange%RunAll() +end subroutine + +integer function Get_TdsSpine() + implicit none + Get_TdsSpine = data%State%unitySignals%TdsSpine +end function + + +subroutine Set_TdsBackupClamp(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsBackupClamp == v) return + #endif + data%State%unitySignals%TdsBackupClamp = v + #ifdef deb + print*, 'TdsBackupClamp=', data%State%unitySignals%TdsBackupClamp + #endif + !**call data%State%unitySignals%OnTdsBackupClampChange%RunAll() +end subroutine + +integer function Get_TdsBackupClamp() + implicit none + Get_TdsBackupClamp = data%State%unitySignals%TdsBackupClamp +end function + + +subroutine Set_Swing(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Swing == v) return + #endif + data%State%unitySignals%Swing = v + #ifdef deb + print*, 'Swing=', data%State%unitySignals%Swing + #endif + !**call data%State%unitySignals%OnSwingChange%RunAll() +end subroutine + +integer function Get_Swing() + implicit none + Get_Swing = data%State%unitySignals%Swing +end function + + +subroutine Set_Slips(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Slips == v) return + #endif + data%State%unitySignals%Slips = v + #ifdef deb + print*, 'Slips=', data%State%unitySignals%Slips + #endif + !**call data%State%unitySignals%OnSlipsChange%RunAll() +end subroutine + +integer function Get_Slips() + implicit none + Get_Slips = data%State%unitySignals%Slips +end function + +subroutine Set_Operation(i) + implicit none + integer, intent (in) :: i + data%State%unitySignals%operation = i +end subroutine + +subroutine Set_SafetyValve(v) + implicit none + integer , intent(in) :: v +#ifdef ExcludeExtraChanges + if(data%State%unitySignals%SafetyValve == v) return +#endif + data%State%unitySignals%SafetyValve = v +#ifdef deb + if(data%State%unitySignals%SafetyValve == SAFETY_VALVE_NEUTRAL) then + print*, 'SafetyValve=SAFETY_VALVE_NEUTRAL' + else if (data%State%unitySignals%SafetyValve == SAFETY_VALVE_INSTALL) then + print*, 'SafetyValve=SAFETY_VALVE_INSTALL' + else if (data%State%unitySignals%SafetyValve == SAFETY_VALVE_INSTALL) then + print*, 'SafetyValve=SAFETY_VALVE_REMOVE' + endif +#endif + !**call data%State%unitySignals%OnSafetyValveChange%RunAll() +end subroutine + +integer function Get_SafetyValve() + implicit none + Get_SafetyValve = data%State%unitySignals%SafetyValve +end function + +subroutine Set_SafetyValve_Install() + implicit none + call Set_SafetyValve(SAFETY_VALVE_INSTALL) +end subroutine + +subroutine Set_SafetyValve_Remove() + implicit none + call Set_SafetyValve(SAFETY_VALVE_REMOVE) +end subroutine + + +subroutine Set_OperationCondition(v) + ! use CKellyEnumVariables + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%OperationCondition == v) return + #endif + data%State%unitySignals%OperationCondition = v + #ifdef deb + print*, 'OperationCondition=', data%State%unitySignals%OperationCondition + #endif + !**call data%State%unitySignals%OnOperationConditionChange%RunAll() + !**call data%State%unitySignals%OnOperationConditionChangeInt%RunAll(data%State%unitySignals%OperationCondition) +end subroutine + +integer function Get_OperationCondition() + implicit none + Get_OperationCondition = data%State%unitySignals%OperationCondition +end function + +subroutine Evaluate_OperationCondition() + implicit none +end subroutine + + +subroutine Set_MouseHole(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%MouseHole == v) return + #endif + !call sleep(2) + data%State%unitySignals%MouseHole = v + #ifdef deb + print*, 'MouseHole=', data%State%unitySignals%MouseHole + #endif + !**call data%State%unitySignals%OnMouseHoleChange%RunAll() +end subroutine + +integer function Get_MouseHole() + implicit none + Get_MouseHole = data%State%unitySignals%MouseHole +end function + + + +subroutine Set_Kelly(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Kelly == v) return + #endif + data%State%unitySignals%Kelly = v + #ifdef deb + print*, 'Kelly=', data%State%unitySignals%Kelly + #endif + !**call data%State%unitySignals%OnKellyChange%RunAll() +end subroutine + +integer function Get_Kelly() + implicit none + Get_Kelly = data%State%unitySignals%Kelly +end function + + +subroutine Set_Ibop(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Ibop == v) return + #endif + data%State%unitySignals%Ibop = v + #ifdef deb + print*, 'Ibop=', data%State%unitySignals%Ibop + #endif + !**call data%State%unitySignals%OnIbopChange%RunAll() +end subroutine + +integer function Get_Ibop() + implicit none + Get_Ibop = data%State%unitySignals%Ibop +end function + + +subroutine Set_FillupHead(v) + use CManifolds, only: ToggleFillupHead + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%FillupHead == v) return + #endif + data%State%unitySignals%FillupHead = v + + if (data%State%unitySignals%FillupHead == FILLUP_HEAD_INSTALL) then + call ToggleFillupHead(.true.) + else if (data%State%unitySignals%FillupHead == FILLUP_HEAD_REMOVE) then + call ToggleFillupHead(.false.) + endif + + #ifdef deb + print*, 'FillupHead=', data%State%unitySignals%FillupHead + #endif + !**call data%State%unitySignals%OnFillupHeadChange%RunAll() +end subroutine + +integer function Get_FillupHead() + implicit none + Get_FillupHead = data%State%unitySignals%FillupHead +end function + +subroutine Evaluate_FillupHead() + use CHoistingVariables + use SimulationVariables + use CStudentStationVariables!, only: data%State%StudentStation%FillupHeadInstallation + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then +#ifdef OST + print*, 'Evaluate_FillupHead=TopDrive' +#endif + endif + + + + + + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then +#ifdef OST + print*, 'Evaluate_FillupHead=Kelly' +#endif + endif + + + if (Get_FillupHead() == FILLUP_HEAD_INSTALL) then + data%State%StudentStation%FillupHeadInstallation = .true. + else if (Get_FillupHead() == FILLUP_HEAD_REMOVE) then + data%State%StudentStation%FillupHeadInstallation = .false. + endif + +end subroutine + + +subroutine Set_Elevator(v) + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%Elevator == v) return + #endif + data%State%unitySignals%Elevator = v + #ifdef deb + print*, 'Elevator=', data%State%unitySignals%Elevator + #endif + !**call data%State%unitySignals%OnElevatorChange%RunAll() +end subroutine + +integer function Get_Elevator() + implicit none + Get_Elevator = data%State%unitySignals%Elevator +end function + + + +subroutine Set_MudBucket(v) + use CManifolds, only: ToggleMudBox + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%MudBucket == v) return + #endif + data%State%unitySignals%MudBucket = v + if (data%State%unitySignals%MudBucket == MUD_BUCKET_INSTALL) then + call ToggleMudBox(.true.) + else if (data%State%unitySignals%MudBucket == MUD_BUCKET_REMOVE) then + call ToggleMudBox(.false.) + endif + #ifdef deb + print*, 'MudBucket=', data%State%unitySignals%MudBucket + #endif + !**call data%State%unitySignals%OnMudBucketChange%RunAll() +end subroutine + +integer function Get_MudBucket() + implicit none + Get_MudBucket = data%State%unitySignals%MudBucket +end function + +subroutine Evaluate_MudBucket() + use CStudentStationVariables!, only: data%State%StudentStation%MudBoxInstallation + implicit none + + if (Get_MudBucket() == MUD_BUCKET_INSTALL) then + data%State%StudentStation%MudBoxInstallation = .true. + else if (Get_MudBucket() == MUD_BUCKET_REMOVE) then + data%State%StudentStation%MudBoxInstallation = .false. + endif + +end subroutine + + +!! Moved from CTdsConnectionModeEnum + +subroutine Set_TdsConnectionModes(v) + use CManifolds, Only: KellyConnected, KellyDisconnected + implicit none + integer , intent(in) :: v + #ifdef ExcludeExtraChanges + if(data%State%unitySignals%TdsConnectionModes == v) return + #endif + data%State%unitySignals%TdsConnectionModes = v + + if(data%State%unitySignals%TdsConnectionModes == TDS_CONNECTION_NOTHING) then + call KellyDisconnected() + else + call KellyConnected() + endif + + #ifdef deb + print*, 'data%State%unitySignals%TdsConnectionModes=', data%State%unitySignals%TdsConnectionModes + #endif + !**call data%State%unitySignals%OnTdsConnectionModesChange%RunAll() +end subroutine + +integer function Get_TdsConnectionModes() + use SimulationVariables + implicit none + Get_TdsConnectionModes = data%State%unitySignals%TdsConnectionModes +end function + +subroutine Evaluate_TdsConnectionModes() + use CUnityInputs + use SimulationVariables + implicit none + + if (data%Configuration%Hoisting%DriveType == TopDrive_DriveType) then + #ifdef OST + print*, 'Evaluate_TdsConnectionModes=TopDrive' + #endif + !TOPDRIVE-CODE=3 + if (Get_TdsStemIn() .and.& + Get_TdsSpine() == TDS_SPINE_CONNECT_END .and.& + !TopDriveDrillTorqueState == TdsMu_SPINE + Get_TdsConnectionModes() == TDS_CONNECTION_NOTHING) then + + call Set_TdsConnectionModes(TDS_CONNECTION_SPINE) + return + end if + + !TOPDRIVE-CODE=4 + if (Get_TdsTong() == TDS_TONG_MAKEUP_END .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_SPINE ) then + + call Set_TdsConnectionModes(TDS_CONNECTION_STRING) + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = LED_OFF + return + end if + + !TOPDRIVE-CODE=5 + if (Get_TdsTong() == TDS_TONG_BREAKOUT_END .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_STRING ) then + + call Set_TdsConnectionModes(TDS_CONNECTION_SPINE) + data%EquipmentControl%TopDrivePanel%TopDriveTorqueWrenchLed = LED_OFF + return + end if + + !TOPDRIVE-CODE=6 + if (Get_TdsSpine() == TDS_SPINE_DISCONNECT_END .and.& + !Get_TdsStemIn() == .false. .and.& + Get_TdsConnectionModes() == TDS_CONNECTION_SPINE) then + + call Set_TdsConnectionModes(TDS_CONNECTION_NOTHING) + return + end if + + endif + + if (data%Configuration%Hoisting%DriveType == Kelly_DriveType) then + #ifdef OST + print*, 'Evaluate_TdsConnectionModes=Kelly' + #endif + endif + +end subroutine + +end module UnitySignalsModule diff --git a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 index d90aee1..4f0a668 100644 --- a/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 +++ b/CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 @@ -1,142 +1,142 @@ -module UnitySignalVariables - ! use CVoidEventHandlerCollection - ! use CIntegerEventHandlerCollection - - type:: UnitySignalsType - integer :: MudBucket = 0 - integer :: Elevator = 0 - integer :: FillupHead = 0 - integer :: Ibop = 0 - integer :: Kelly = 0 - integer :: MouseHole = 0 - integer :: OperationCondition = 0 - integer :: SafetyValve = 0 - integer :: operation = 0 - integer :: Slips = 0 - integer :: Slips_S = 0 - integer :: Swing = 0 - integer :: Swing_S = 0 - integer :: TdsBackupClamp = 0 - integer :: TdsSpine = 0 - integer :: TdsSwing = 0 - integer :: TdsTong = 0 - integer :: Tong = 0 - integer :: Tong_S = 0 - integer :: TdsConnectionModes = 0 - integer :: TdsElevatorModes = 0 - - end type UnitySignalsType - - enum, bind(c) - enumerator TONG_NEUTRAL - enumerator TONG_BREAKOUT_BEGIN - enumerator TONG_BREAKOUT_END - enumerator TONG_MAKEUP_BEGIN - enumerator TONG_MAKEUP_END - - enumerator TDS_SWING_NEUTRAL - enumerator TDS_SWING_OFF_BEGIN - enumerator TDS_SWING_OFF_END - enumerator TDS_SWING_DRILL_BEGIN - enumerator TDS_SWING_DRILL_END - enumerator TDS_SWING_TILT_BEGIN - enumerator TDS_SWING_TILT_END - - enumerator TDS_SPINE_NEUTRAL - enumerator TDS_SPINE_CONNECT_BEGIN - enumerator TDS_SPINE_CONNECT_END - enumerator TDS_SPINE_DISCONNECT_BEGIN - enumerator TDS_SPINE_DISCONNECT_END - - enumerator BACKUP_CLAMP_OFF_END - enumerator BACKUP_CLAMP_OFF_BEGIN - enumerator BACKUP_CLAMP_FW_BEGIN - enumerator BACKUP_CLAMP_FW_END - - enumerator SWING_NEUTRAL - enumerator SWING_MOUSE_HOLE_BEGIN - enumerator SWING_MOUSE_HOLE_END - enumerator SWING_RAT_HOLE_BEGIN - enumerator SWING_RAT_HOLE_END - enumerator SWING_WELL_BEGIN - enumerator SWING_WELL_END - end enum - enum, bind(c) - enumerator TDS_TONG_BREAKOUT_END - enumerator TDS_TONG_BREAKOUT_BEGIN - enumerator TDS_TONG_MAKEUP_BEGIN - enumerator TDS_TONG_MAKEUP_END - - enumerator SAFETY_VALVE_NEUTRAL - enumerator SAFETY_VALVE_REMOVE - enumerator SAFETY_VALVE_INSTALL - - end enum - enum, bind(c) - enumerator OPERATION_DRILL - enumerator OPERATION_TRIP - end enum - enum, bind(c) - enumerator SLIPS_NEUTRAL - enumerator SLIPS_SET_BEGIN - enumerator SLIPS_SET_END - enumerator SLIPS_UNSET_BEGIN - enumerator SLIPS_UNSET_END - - enumerator MOUSE_HOLE_NEUTRAL - enumerator MOUSE_HOLE_FILL - enumerator MOUSE_HOLE_EMPTY - - enumerator KELLY_NEUTRAL - enumerator KELLY_INSTALL - enumerator KELLY_REMOVE - - !enumerator FILLUP_HEAD_NEUTRAL - enumerator FILLUP_HEAD_REMOVE - enumerator FILLUP_HEAD_INSTALL - - enumerator ELEVATOR_NEUTRAL - - enumerator ELEVATOR_LATCH_STRING_BEGIN - enumerator ELEVATOR_LATCH_STRING_END - - enumerator ELEVATOR_UNLATCH_STRING_BEGIN - enumerator ELEVATOR_UNLATCH_STRING_END - - enumerator ELEVATOR_LATCH_STAND_BEGIN - enumerator ELEVATOR_LATCH_STAND_END - - enumerator ELEVATOR_UNLATCH_STAND_BEGIN - enumerator ELEVATOR_UNLATCH_STAND_END - - enumerator ELEVATOR_LATCH_SINGLE_BEGIN - enumerator ELEVATOR_LATCH_SINGLE_END - - enumerator ELEVATOR_UNLATCH_SINGLE_BEGIN - enumerator ELEVATOR_UNLATCH_SINGLE_END - - !enumerator MUD_BUCKET_NEUTRAL - enumerator MUD_BUCKET_REMOVE - enumerator MUD_BUCKET_INSTALL - - !enumerator IBOP_NEUTRAL - enumerator IBOP_REMOVE - enumerator IBOP_INSTALL - - enumerator TDS_CONNECTION_NOTHING - enumerator TDS_CONNECTION_STRING - enumerator TDS_CONNECTION_SPINE - - enumerator TDS_ELEVATOR_CONNECTION_NOTHING - enumerator TDS_ELEVATOR_CONNECTION_STRING - enumerator TDS_ELEVATOR_CONNECTION_SINGLE - enumerator TDS_ELEVATOR_CONNECTION_STAND - enumerator TDS_ELEVATOR_LATCH_STRING - enumerator TDS_ELEVATOR_LATCH_SINGLE - enumerator TDS_ELEVATOR_LATCH_STAND - end enum - - contains - - +module UnitySignalVariables + ! use CVoidEventHandlerCollection + ! use CIntegerEventHandlerCollection + + type:: UnitySignalsType + integer :: MudBucket = 0 + integer :: Elevator = 0 + integer :: FillupHead = 0 + integer :: Ibop = 0 + integer :: Kelly = 0 + integer :: MouseHole = 0 + integer :: OperationCondition = 0 + integer :: SafetyValve = 0 + integer :: operation = 0 + integer :: Slips = 0 + integer :: Slips_S = 0 + integer :: Swing = 0 + integer :: Swing_S = 0 + integer :: TdsBackupClamp = 0 + integer :: TdsSpine = 0 + integer :: TdsSwing = 0 + integer :: TdsTong = 0 + integer :: Tong = 0 + integer :: Tong_S = 0 + integer :: TdsConnectionModes = 0 + integer :: TdsElevatorModes = 0 + + end type UnitySignalsType + + enum, bind(c) + enumerator TONG_NEUTRAL + enumerator TONG_BREAKOUT_BEGIN + enumerator TONG_BREAKOUT_END + enumerator TONG_MAKEUP_BEGIN + enumerator TONG_MAKEUP_END + + enumerator TDS_SWING_NEUTRAL + enumerator TDS_SWING_OFF_BEGIN + enumerator TDS_SWING_OFF_END + enumerator TDS_SWING_DRILL_BEGIN + enumerator TDS_SWING_DRILL_END + enumerator TDS_SWING_TILT_BEGIN + enumerator TDS_SWING_TILT_END + + enumerator TDS_SPINE_NEUTRAL + enumerator TDS_SPINE_CONNECT_BEGIN + enumerator TDS_SPINE_CONNECT_END + enumerator TDS_SPINE_DISCONNECT_BEGIN + enumerator TDS_SPINE_DISCONNECT_END + + enumerator BACKUP_CLAMP_OFF_END + enumerator BACKUP_CLAMP_OFF_BEGIN + enumerator BACKUP_CLAMP_FW_BEGIN + enumerator BACKUP_CLAMP_FW_END + + enumerator SWING_NEUTRAL + enumerator SWING_MOUSE_HOLE_BEGIN + enumerator SWING_MOUSE_HOLE_END + enumerator SWING_RAT_HOLE_BEGIN + enumerator SWING_RAT_HOLE_END + enumerator SWING_WELL_BEGIN + enumerator SWING_WELL_END + end enum + enum, bind(c) + enumerator TDS_TONG_BREAKOUT_END + enumerator TDS_TONG_BREAKOUT_BEGIN + enumerator TDS_TONG_MAKEUP_BEGIN + enumerator TDS_TONG_MAKEUP_END + + enumerator SAFETY_VALVE_NEUTRAL + enumerator SAFETY_VALVE_REMOVE + enumerator SAFETY_VALVE_INSTALL + + end enum + enum, bind(c) + enumerator OPERATION_DRILL + enumerator OPERATION_TRIP + end enum + enum, bind(c) + enumerator SLIPS_NEUTRAL + enumerator SLIPS_SET_BEGIN + enumerator SLIPS_SET_END + enumerator SLIPS_UNSET_BEGIN + enumerator SLIPS_UNSET_END + + enumerator MOUSE_HOLE_NEUTRAL + enumerator MOUSE_HOLE_FILL + enumerator MOUSE_HOLE_EMPTY + + enumerator KELLY_NEUTRAL + enumerator KELLY_INSTALL + enumerator KELLY_REMOVE + + !enumerator FILLUP_HEAD_NEUTRAL + enumerator FILLUP_HEAD_REMOVE + enumerator FILLUP_HEAD_INSTALL + + enumerator ELEVATOR_NEUTRAL + + enumerator ELEVATOR_LATCH_STRING_BEGIN + enumerator ELEVATOR_LATCH_STRING_END + + enumerator ELEVATOR_UNLATCH_STRING_BEGIN + enumerator ELEVATOR_UNLATCH_STRING_END + + enumerator ELEVATOR_LATCH_STAND_BEGIN + enumerator ELEVATOR_LATCH_STAND_END + + enumerator ELEVATOR_UNLATCH_STAND_BEGIN + enumerator ELEVATOR_UNLATCH_STAND_END + + enumerator ELEVATOR_LATCH_SINGLE_BEGIN + enumerator ELEVATOR_LATCH_SINGLE_END + + enumerator ELEVATOR_UNLATCH_SINGLE_BEGIN + enumerator ELEVATOR_UNLATCH_SINGLE_END + + !enumerator MUD_BUCKET_NEUTRAL + enumerator MUD_BUCKET_REMOVE + enumerator MUD_BUCKET_INSTALL + + !enumerator IBOP_NEUTRAL + enumerator IBOP_REMOVE + enumerator IBOP_INSTALL + + enumerator TDS_CONNECTION_NOTHING + enumerator TDS_CONNECTION_STRING + enumerator TDS_CONNECTION_SPINE + + enumerator TDS_ELEVATOR_CONNECTION_NOTHING + enumerator TDS_ELEVATOR_CONNECTION_STRING + enumerator TDS_ELEVATOR_CONNECTION_SINGLE + enumerator TDS_ELEVATOR_CONNECTION_STAND + enumerator TDS_ELEVATOR_LATCH_STRING + enumerator TDS_ELEVATOR_LATCH_SINGLE + enumerator TDS_ELEVATOR_LATCH_STAND + end enum + + contains + + end module UnitySignalVariables \ No newline at end of file diff --git a/CSharp/Problems/CBitProblems.f90 b/CSharp/Problems/CBitProblems.f90 index 62ac3e1..8d3d411 100644 --- a/CSharp/Problems/CBitProblems.f90 +++ b/CSharp/Problems/CBitProblems.f90 @@ -1,61 +1,80 @@ -module CBitProblems - use SimulationVariables - implicit none - public - contains - - subroutine ProcessBitProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%BitProblems%PlugJets%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%PlugJets, ChangePlugJets, time) - if(data%problems%BitProblems%JetWashout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%JetWashout, ChangeJetWashout, time) - - end subroutine - - subroutine ProcessBitProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%BitProblems%PlugJets%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%PlugJets, ChangePlugJets, strokes) - if(data%problems%BitProblems%JetWashout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%JetWashout, ChangeJetWashout, strokes) - - end subroutine - - subroutine ProcessBitProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%BitProblems%PlugJets%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%PlugJets, ChangePlugJets, volume) - if(data%problems%BitProblems%JetWashout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%JetWashout, ChangeJetWashout, volume) - - end subroutine - - subroutine ProcessBitProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%BitProblems%PlugJets%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%PlugJets, ChangePlugJets, distance) - if(data%problems%BitProblems%JetWashout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%JetWashout, ChangeJetWashout, distance) - - end subroutine - - subroutine ChangePlugJets(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(data%problems%BitProblems%PlugJetsPtr)) call data%problems%BitProblems%PlugJetsPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%BitJetsPlugged = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%BitJetsPlugged = 1 - endsubroutine - - subroutine ChangeJetWashout(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(data%problems%BitProblems%JetWashoutPtr)) call data%problems%BitProblems%JetWashoutPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%BitJetsWashedOut = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%BitJetsWashedOut = 1 - endsubroutine - - +module CBitProblems + use SimulationVariables + use json_module + implicit none + public + contains + + subroutine BitProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'BitProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"JetWashout",data%problems%BitProblems%JetWashout) + call ProblemToJson(p,"PlugJets",data%problems%BitProblems%PlugJets) + call json%add(p, "JetWashoutCount",data%problems%BitProblems%JetWashoutCount) + call json%add(p, "PlugJetsCount",data%problems%BitProblems%PlugJetsCount) + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + + subroutine ProcessBitProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%BitProblems%PlugJets%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%PlugJets, ChangePlugJets, time) + if(data%problems%BitProblems%JetWashout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BitProblems%JetWashout, ChangeJetWashout, time) + end subroutine + + subroutine ProcessBitProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%BitProblems%PlugJets%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%PlugJets, ChangePlugJets, strokes) + if(data%problems%BitProblems%JetWashout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BitProblems%JetWashout, ChangeJetWashout, strokes) + + end subroutine + + subroutine ProcessBitProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%BitProblems%PlugJets%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%PlugJets, ChangePlugJets, volume) + if(data%problems%BitProblems%JetWashout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BitProblems%JetWashout, ChangeJetWashout, volume) + + end subroutine + + subroutine ProcessBitProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%BitProblems%PlugJets%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%PlugJets, ChangePlugJets, distance) + if(data%problems%BitProblems%JetWashout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BitProblems%JetWashout, ChangeJetWashout, distance) + + end subroutine + + subroutine ChangePlugJets(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(data%problems%BitProblems%PlugJetsPtr)) call data%problems%BitProblems%PlugJetsPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%BitJetsPlugged = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%BitJetsPlugged = 1 + endsubroutine + + subroutine ChangeJetWashout(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(data%problems%BitProblems%JetWashoutPtr)) call data%problems%BitProblems%JetWashoutPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%BitJetsWashedOut = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%BitJetsWashedOut = 1 + endsubroutine + + end module CBitProblems \ No newline at end of file diff --git a/CSharp/Problems/CBitProblemsVariables.f90 b/CSharp/Problems/CBitProblemsVariables.f90 index 2239304..dec34fe 100644 --- a/CSharp/Problems/CBitProblemsVariables.f90 +++ b/CSharp/Problems/CBitProblemsVariables.f90 @@ -1,15 +1,15 @@ -module CBitProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type:: BitProblemsType - type(CProblem) :: PlugJets - type(CProblem) :: JetWashout - integer :: PlugJetsCount - integer :: JetWashoutCount - end type BitProblemsType - - contains +module CBitProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type:: BitProblemsType + type(CProblem) :: PlugJets + type(CProblem) :: JetWashout + integer :: PlugJetsCount + integer :: JetWashoutCount + end type BitProblemsType + + contains end module CBitProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CBopProblems.f90 b/CSharp/Problems/CBopProblems.f90 index 3181187..dd0e84d 100644 --- a/CSharp/Problems/CBopProblems.f90 +++ b/CSharp/Problems/CBopProblems.f90 @@ -1,234 +1,265 @@ -module CBopProblems - use SimulationVariables - implicit none - public - contains - - subroutine ProcessBopProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%BopProblems%AnnularWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, time) - if(data%problems%BopProblems%AnnularFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, time) - if(data%problems%BopProblems%AnnularLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, time) - if(data%problems%BopProblems%UpperRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, time) - if(data%problems%BopProblems%UpperRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, time) - if(data%problems%BopProblems%UpperRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, time) - if(data%problems%BopProblems%MiddleRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, time) - if(data%problems%BopProblems%MiddleRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, time) - if(data%problems%BopProblems%MiddleRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, time) - if(data%problems%BopProblems%LowerRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, time) - if(data%problems%BopProblems%LowerRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, time) - if(data%problems%BopProblems%LowerRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, time) - if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, time) - if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, time) - if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, time) - if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, time) - end subroutine - - subroutine ProcessBopProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - if(data%problems%BopProblems%AnnularWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, strokes) - if(data%problems%BopProblems%AnnularFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, strokes) - if(data%problems%BopProblems%AnnularLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, strokes) - if(data%problems%BopProblems%UpperRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, strokes) - if(data%problems%BopProblems%UpperRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, strokes) - if(data%problems%BopProblems%UpperRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, strokes) - if(data%problems%BopProblems%MiddleRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, strokes) - if(data%problems%BopProblems%MiddleRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, strokes) - if(data%problems%BopProblems%MiddleRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, strokes) - if(data%problems%BopProblems%LowerRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, strokes) - if(data%problems%BopProblems%LowerRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, strokes) - if(data%problems%BopProblems%LowerRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, strokes) - if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, strokes) - if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, strokes) - if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, strokes) - if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, strokes) - end subroutine - - subroutine ProcessBopProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - if(data%problems%BopProblems%AnnularWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, volume) - if(data%problems%BopProblems%AnnularFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, volume) - if(data%problems%BopProblems%AnnularLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, volume) - if(data%problems%BopProblems%UpperRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, volume) - if(data%problems%BopProblems%UpperRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, volume) - if(data%problems%BopProblems%UpperRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, volume) - if(data%problems%BopProblems%MiddleRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, volume) - if(data%problems%BopProblems%MiddleRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, volume) - if(data%problems%BopProblems%MiddleRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, volume) - if(data%problems%BopProblems%LowerRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, volume) - if(data%problems%BopProblems%LowerRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, volume) - if(data%problems%BopProblems%LowerRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, volume) - if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, volume) - if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, volume) - if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail,volume) - if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, volume) - end subroutine - - subroutine ProcessBopProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - if(data%problems%BopProblems%AnnularWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, distance) - if(data%problems%BopProblems%AnnularFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, distance) - if(data%problems%BopProblems%AnnularLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, distance) - if(data%problems%BopProblems%UpperRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, distance) - if(data%problems%BopProblems%UpperRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, distance) - if(data%problems%BopProblems%UpperRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, distance) - if(data%problems%BopProblems%MiddleRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, distance) - if(data%problems%BopProblems%MiddleRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, distance) - if(data%problems%BopProblems%MiddleRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, distance) - if(data%problems%BopProblems%LowerRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, distance) - if(data%problems%BopProblems%LowerRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, distance) - if(data%problems%BopProblems%LowerRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, distance) - if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, distance) - if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, distance) - if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, distance) - if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, distance) - end subroutine - - - subroutine ChangeAnnularWash(status) - implicit none - integer, intent (in) :: status - ! ! if(associated(AnnularWashPtr)) call AnnularWashPtr(status) - !if(status == Clear_StatusType) print*,'On_AnnularWash_Clear' - !if(status == Executed_StatusType) print*,'On_AnnularWash_Execute' - endsubroutine - - subroutine ChangeAnnularFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(AnnularFailPtr)) call AnnularFailPtr(status) - if(status == Clear_StatusType) data%State%Annular%AnnularFailureMalf = 0 - if(status == Executed_StatusType) data%State%Annular%AnnularFailureMalf = 1 - endsubroutine - - subroutine ChangeAnnularLeak(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(AnnularLeakPtr)) call AnnularLeakPtr(status) - if(status == Clear_StatusType) data%State%Annular%AnnularLeakMalf = 0 - if(status == Executed_StatusType) data%State%Annular%AnnularLeakMalf = 1 - endsubroutine - - - - subroutine ChangeUpperRamWash(status) - implicit none - integer, intent (in) :: status - ! ! if(associated(UpperRamWashPtr)) call UpperRamWashPtr(status) - !if(status == Clear_StatusType) print*,'On_UpperRamWash_Clear' - !if(status == Executed_StatusType) print*,'On_UpperRamWash_Execute' - endsubroutine - - subroutine ChangeUpperRamFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(UpperRamFailPtr)) call UpperRamFailPtr(status) - if(status == Clear_StatusType) data%State%PipeRam1%UpperRamsFailureMalf = 0 - if(status == Executed_StatusType) data%State%PipeRam1%UpperRamsFailureMalf = 1 - endsubroutine - - subroutine ChangeUpperRamLeak(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(UpperRamLeakPtr)) call UpperRamLeakPtr(status) - if(status == Clear_StatusType) data%State%PipeRam1%UpperRamsLeakMalf = 0 - if(status == Executed_StatusType) data%State%PipeRam1%UpperRamsLeakMalf = 1 - endsubroutine - - - subroutine ChangeMiddleRamWash(status) - implicit none - integer, intent (in) :: status - ! ! if(associated(MiddleRamWashPtr)) call MiddleRamWashPtr(status) - !if(status == Clear_StatusType) print*,'On_MiddleRamWash_Clear' - !if(status == Executed_StatusType) print*,'On_MiddleRamWash_Execute' - endsubroutine - - subroutine ChangeMiddleRamFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(MiddleRamFailPtr)) call MiddleRamFailPtr(status) - if(status == Clear_StatusType) data%State%ShearRAM%MiddleRamsFailureMalf = 0 - if(status == Executed_StatusType) data%State%ShearRAM%MiddleRamsFailureMalf = 1 - endsubroutine - - subroutine ChangeMiddleRamLeak(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(MiddleRamLeakPtr)) call MiddleRamLeakPtr(status) - if(status == Clear_StatusType) data%State%ShearRAM%MiddleRamsLeakMalf = 0 - if(status == Executed_StatusType) data%State%ShearRAM%MiddleRamsLeakMalf = 1 - endsubroutine - - - - subroutine ChangeLowerRamWash(status) - implicit none - integer, intent (in) :: status - ! ! if(associated(LowerRamWashPtr)) call LowerRamWashPtr(status) - !if(status == Clear_StatusType) print*,'On_LowerRamWash_Clear' - !if(status == Executed_StatusType) print*,'On_LowerRamWash_Execute' - endsubroutine - - subroutine ChangeLowerRamFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! ! if(associated(LowerRamFailPtr)) call LowerRamFailPtr(status) - if(status == Clear_StatusType) data%State%PipeRam2%LowerRamsFailureMalf = 0 - if(status == Executed_StatusType) data%State%PipeRam2%LowerRamsFailureMalf = 1 - endsubroutine - - subroutine ChangeLowerRamLeak(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(LowerRamLeakPtr)) call LowerRamLeakPtr(status) - if(status == Clear_StatusType) data%State%PipeRam2%LowerRamsLeakMalf = 0 - if(status == Executed_StatusType) data%State%PipeRam2%LowerRamsLeakMalf = 1 - endsubroutine - - subroutine ChangeAccumulatorPumpFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(AccumulatorPumpFailPtr)) call AccumulatorPumpFailPtr(status) - if(status == Clear_StatusType) data%State%BopStackAcc%AccPupmsFailMalf = 0 - if(status == Executed_StatusType) data%State%BopStackAcc%AccPupmsFailMalf = 1 - endsubroutine - - subroutine ChangeAccumulatorPumpLeak(status) - implicit none - integer, intent (in) :: status - ! if(associated(AccumulatorPumpLeakPtr)) call AccumulatorPumpLeakPtr(status) - !if(status == Clear_StatusType) print*,'On_AccumulatorPumpLeak_Clear' - !if(status == Executed_StatusType) print*,'On_AccumulatorPumpLeak_Execute' - endsubroutine - - subroutine ChangeAccumulatorSystemFail(status) - implicit none - integer, intent (in) :: status - ! if(associated(AccumulatorSystemFailPtr)) call AccumulatorSystemFailPtr(status) - !if(status == Clear_StatusType) print*,'On_AccumulatorSystemFail_Clear' - !if(status == Executed_StatusType) print*,'On_AccumulatorSystemFail_Execute' - endsubroutine - - subroutine ChangeAccumulatorSystemLeak(status) - implicit none - integer, intent (in) :: status - ! if(associated(AccumulatorSystemLeakPtr)) call AccumulatorSystemLeakPtr(status) - !if(status == Clear_StatusType) print*,'On_AccumulatorSystemLeak_Clear' - !if(status == Executed_StatusType) print*,'On_AccumulatorSystemLeak_Execute' - endsubroutine - +module CBopProblems + use SimulationVariables + implicit none + public + contains + + subroutine BopProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'BopProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"AnnularWash",data%problems%BopProblems%AnnularWash) + call ProblemToJson(p,"AnnularFail",data%problems%BopProblems%AnnularFail) + call ProblemToJson(p,"AnnularLeak",data%problems%BopProblems%AnnularLeak) + call ProblemToJson(p,"UpperRamWash",data%problems%BopProblems%UpperRamWash) + call ProblemToJson(p,"UpperRamFail",data%problems%BopProblems%UpperRamFail) + call ProblemToJson(p,"UpperRamLeak",data%problems%BopProblems%UpperRamLeak) + call ProblemToJson(p,"MiddleRamWash",data%problems%BopProblems%MiddleRamWash) + call ProblemToJson(p,"MiddleRamFail",data%problems%BopProblems%MiddleRamFail) + call ProblemToJson(p,"MiddleRamLeak",data%problems%BopProblems%MiddleRamLeak) + call ProblemToJson(p,"LowerRamWash",data%problems%BopProblems%LowerRamWash) + call ProblemToJson(p,"LowerRamFail",data%problems%BopProblems%LowerRamFail) + call ProblemToJson(p,"LowerRamLeak",data%problems%BopProblems%LowerRamLeak) + call ProblemToJson(p,"AccumulatorPumpFail",data%problems%BopProblems%AccumulatorPumpFail) + call ProblemToJson(p,"AccumulatorPumpLeak",data%problems%BopProblems%AccumulatorPumpLeak) + call ProblemToJson(p,"AccumulatorSystemFail",data%problems%BopProblems%AccumulatorSystemFail) + call ProblemToJson(p,"AccumulatorSystemLeak",data%problems%BopProblems%AccumulatorSystemLeak) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessBopProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%BopProblems%AnnularWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, time) + if(data%problems%BopProblems%AnnularFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, time) + if(data%problems%BopProblems%AnnularLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, time) + if(data%problems%BopProblems%UpperRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, time) + if(data%problems%BopProblems%UpperRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, time) + if(data%problems%BopProblems%UpperRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, time) + if(data%problems%BopProblems%MiddleRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, time) + if(data%problems%BopProblems%MiddleRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, time) + if(data%problems%BopProblems%MiddleRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, time) + if(data%problems%BopProblems%LowerRamWash%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, time) + if(data%problems%BopProblems%LowerRamFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, time) + if(data%problems%BopProblems%LowerRamLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, time) + if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, time) + if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, time) + if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, time) + if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, time) + end subroutine + + subroutine ProcessBopProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + if(data%problems%BopProblems%AnnularWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, strokes) + if(data%problems%BopProblems%AnnularFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, strokes) + if(data%problems%BopProblems%AnnularLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, strokes) + if(data%problems%BopProblems%UpperRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, strokes) + if(data%problems%BopProblems%UpperRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, strokes) + if(data%problems%BopProblems%UpperRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, strokes) + if(data%problems%BopProblems%MiddleRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, strokes) + if(data%problems%BopProblems%MiddleRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, strokes) + if(data%problems%BopProblems%MiddleRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, strokes) + if(data%problems%BopProblems%LowerRamWash%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, strokes) + if(data%problems%BopProblems%LowerRamFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, strokes) + if(data%problems%BopProblems%LowerRamLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, strokes) + if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, strokes) + if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, strokes) + if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, strokes) + if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, strokes) + end subroutine + + subroutine ProcessBopProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + if(data%problems%BopProblems%AnnularWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, volume) + if(data%problems%BopProblems%AnnularFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, volume) + if(data%problems%BopProblems%AnnularLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, volume) + if(data%problems%BopProblems%UpperRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, volume) + if(data%problems%BopProblems%UpperRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, volume) + if(data%problems%BopProblems%UpperRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, volume) + if(data%problems%BopProblems%MiddleRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, volume) + if(data%problems%BopProblems%MiddleRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, volume) + if(data%problems%BopProblems%MiddleRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, volume) + if(data%problems%BopProblems%LowerRamWash%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, volume) + if(data%problems%BopProblems%LowerRamFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, volume) + if(data%problems%BopProblems%LowerRamLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, volume) + if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, volume) + if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, volume) + if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail,volume) + if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, volume) + end subroutine + + subroutine ProcessBopProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + if(data%problems%BopProblems%AnnularWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularWash, ChangeAnnularWash, distance) + if(data%problems%BopProblems%AnnularFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularFail, ChangeAnnularFail, distance) + if(data%problems%BopProblems%AnnularLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AnnularLeak, ChangeAnnularLeak, distance) + if(data%problems%BopProblems%UpperRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamWash, ChangeUpperRamWash, distance) + if(data%problems%BopProblems%UpperRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamFail, ChangeUpperRamFail, distance) + if(data%problems%BopProblems%UpperRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%UpperRamLeak, ChangeUpperRamLeak, distance) + if(data%problems%BopProblems%MiddleRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamWash, ChangeMiddleRamWash, distance) + if(data%problems%BopProblems%MiddleRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamFail, ChangeMiddleRamFail, distance) + if(data%problems%BopProblems%MiddleRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%MiddleRamLeak, ChangeMiddleRamLeak, distance) + if(data%problems%BopProblems%LowerRamWash%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamWash, ChangeLowerRamWash, distance) + if(data%problems%BopProblems%LowerRamFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamFail, ChangeLowerRamFail, distance) + if(data%problems%BopProblems%LowerRamLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%LowerRamLeak, ChangeLowerRamLeak, distance) + if(data%problems%BopProblems%AccumulatorPumpFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorPumpFail, ChangeAccumulatorPumpFail, distance) + if(data%problems%BopProblems%AccumulatorPumpLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorPumpLeak, ChangeAccumulatorPumpLeak, distance) + if(data%problems%BopProblems%AccumulatorSystemFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorSystemFail, ChangeAccumulatorSystemFail, distance) + if(data%problems%BopProblems%AccumulatorSystemLeak%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%BopProblems%AccumulatorSystemLeak, ChangeAccumulatorSystemLeak, distance) + end subroutine + + + subroutine ChangeAnnularWash(status) + implicit none + integer, intent (in) :: status + ! ! if(associated(AnnularWashPtr)) call AnnularWashPtr(status) + !if(status == Clear_StatusType) print*,'On_AnnularWash_Clear' + !if(status == Executed_StatusType) print*,'On_AnnularWash_Execute' + endsubroutine + + subroutine ChangeAnnularFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(AnnularFailPtr)) call AnnularFailPtr(status) + if(status == Clear_StatusType) data%State%Annular%AnnularFailureMalf = 0 + if(status == Executed_StatusType) data%State%Annular%AnnularFailureMalf = 1 + endsubroutine + + subroutine ChangeAnnularLeak(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(AnnularLeakPtr)) call AnnularLeakPtr(status) + if(status == Clear_StatusType) data%State%Annular%AnnularLeakMalf = 0 + if(status == Executed_StatusType) data%State%Annular%AnnularLeakMalf = 1 + endsubroutine + + + + subroutine ChangeUpperRamWash(status) + implicit none + integer, intent (in) :: status + ! ! if(associated(UpperRamWashPtr)) call UpperRamWashPtr(status) + !if(status == Clear_StatusType) print*,'On_UpperRamWash_Clear' + !if(status == Executed_StatusType) print*,'On_UpperRamWash_Execute' + endsubroutine + + subroutine ChangeUpperRamFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(UpperRamFailPtr)) call UpperRamFailPtr(status) + if(status == Clear_StatusType) data%State%PipeRam1%UpperRamsFailureMalf = 0 + if(status == Executed_StatusType) data%State%PipeRam1%UpperRamsFailureMalf = 1 + endsubroutine + + subroutine ChangeUpperRamLeak(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(UpperRamLeakPtr)) call UpperRamLeakPtr(status) + if(status == Clear_StatusType) data%State%PipeRam1%UpperRamsLeakMalf = 0 + if(status == Executed_StatusType) data%State%PipeRam1%UpperRamsLeakMalf = 1 + endsubroutine + + + subroutine ChangeMiddleRamWash(status) + implicit none + integer, intent (in) :: status + ! ! if(associated(MiddleRamWashPtr)) call MiddleRamWashPtr(status) + !if(status == Clear_StatusType) print*,'On_MiddleRamWash_Clear' + !if(status == Executed_StatusType) print*,'On_MiddleRamWash_Execute' + endsubroutine + + subroutine ChangeMiddleRamFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(MiddleRamFailPtr)) call MiddleRamFailPtr(status) + if(status == Clear_StatusType) data%State%ShearRAM%MiddleRamsFailureMalf = 0 + if(status == Executed_StatusType) data%State%ShearRAM%MiddleRamsFailureMalf = 1 + endsubroutine + + subroutine ChangeMiddleRamLeak(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(MiddleRamLeakPtr)) call MiddleRamLeakPtr(status) + if(status == Clear_StatusType) data%State%ShearRAM%MiddleRamsLeakMalf = 0 + if(status == Executed_StatusType) data%State%ShearRAM%MiddleRamsLeakMalf = 1 + endsubroutine + + + + subroutine ChangeLowerRamWash(status) + implicit none + integer, intent (in) :: status + ! ! if(associated(LowerRamWashPtr)) call LowerRamWashPtr(status) + !if(status == Clear_StatusType) print*,'On_LowerRamWash_Clear' + !if(status == Executed_StatusType) print*,'On_LowerRamWash_Execute' + endsubroutine + + subroutine ChangeLowerRamFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! ! if(associated(LowerRamFailPtr)) call LowerRamFailPtr(status) + if(status == Clear_StatusType) data%State%PipeRam2%LowerRamsFailureMalf = 0 + if(status == Executed_StatusType) data%State%PipeRam2%LowerRamsFailureMalf = 1 + endsubroutine + + subroutine ChangeLowerRamLeak(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(LowerRamLeakPtr)) call LowerRamLeakPtr(status) + if(status == Clear_StatusType) data%State%PipeRam2%LowerRamsLeakMalf = 0 + if(status == Executed_StatusType) data%State%PipeRam2%LowerRamsLeakMalf = 1 + endsubroutine + + subroutine ChangeAccumulatorPumpFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(AccumulatorPumpFailPtr)) call AccumulatorPumpFailPtr(status) + if(status == Clear_StatusType) data%State%BopStackAcc%AccPupmsFailMalf = 0 + if(status == Executed_StatusType) data%State%BopStackAcc%AccPupmsFailMalf = 1 + endsubroutine + + subroutine ChangeAccumulatorPumpLeak(status) + implicit none + integer, intent (in) :: status + ! if(associated(AccumulatorPumpLeakPtr)) call AccumulatorPumpLeakPtr(status) + !if(status == Clear_StatusType) print*,'On_AccumulatorPumpLeak_Clear' + !if(status == Executed_StatusType) print*,'On_AccumulatorPumpLeak_Execute' + endsubroutine + + subroutine ChangeAccumulatorSystemFail(status) + implicit none + integer, intent (in) :: status + ! if(associated(AccumulatorSystemFailPtr)) call AccumulatorSystemFailPtr(status) + !if(status == Clear_StatusType) print*,'On_AccumulatorSystemFail_Clear' + !if(status == Executed_StatusType) print*,'On_AccumulatorSystemFail_Execute' + endsubroutine + + subroutine ChangeAccumulatorSystemLeak(status) + implicit none + integer, intent (in) :: status + ! if(associated(AccumulatorSystemLeakPtr)) call AccumulatorSystemLeakPtr(status) + !if(status == Clear_StatusType) print*,'On_AccumulatorSystemLeak_Clear' + !if(status == Executed_StatusType) print*,'On_AccumulatorSystemLeak_Execute' + endsubroutine + end module CBopProblems \ No newline at end of file diff --git a/CSharp/Problems/CBopProblemsVariables.f90 b/CSharp/Problems/CBopProblemsVariables.f90 index 63ef15e..7a68ca9 100644 --- a/CSharp/Problems/CBopProblemsVariables.f90 +++ b/CSharp/Problems/CBopProblemsVariables.f90 @@ -1,175 +1,175 @@ -module CBopProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type::BopProblemsType - type(CProblem) :: AnnularWash - type(CProblem) :: AnnularFail - type(CProblem) :: AnnularLeak - type(CProblem) :: UpperRamWash - type(CProblem) :: UpperRamFail - type(CProblem) :: UpperRamLeak - type(CProblem) :: MiddleRamWash - type(CProblem) :: MiddleRamFail - type(CProblem) :: MiddleRamLeak - type(CProblem) :: LowerRamWash - type(CProblem) :: LowerRamFail - type(CProblem) :: LowerRamLeak - type(CProblem) :: AccumulatorPumpFail - type(CProblem) :: AccumulatorPumpLeak - type(CProblem) :: AccumulatorSystemFail - type(CProblem) :: AccumulatorSystemLeak - end type BopProblemsType - - contains - - - - - - - - - - - - - - ! subroutine SubscribeAnnularWash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularWash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularWash' :: SubscribeAnnularWash - ! implicit none - ! procedure (ActionInteger) :: v - ! AnnularWashPtr => v - ! end subroutine - - ! subroutine SubscribeAnnularFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularFail' :: SubscribeAnnularFail - ! implicit none - ! procedure (ActionInteger) :: v - ! AnnularFailPtr => v - ! end subroutine - - ! subroutine SubscribeAnnularLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularLeak' :: SubscribeAnnularLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! AnnularLeakPtr => v - ! end subroutine - - - ! subroutine SubscribeUpperRamWash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamWash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamWash' :: SubscribeUpperRamWash - ! implicit none - ! procedure (ActionInteger) :: v - ! UpperRamWashPtr => v - ! end subroutine - - ! subroutine SubscribeUpperRamFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamFail' :: SubscribeUpperRamFail - ! implicit none - ! procedure (ActionInteger) :: v - ! UpperRamFailPtr => v - ! end subroutine - - ! subroutine SubscribeUpperRamLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamLeak' :: SubscribeUpperRamLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! UpperRamLeakPtr => v - ! end subroutine - - - ! subroutine SubscribeMiddleRamWash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamWash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamWash' :: SubscribeMiddleRamWash - ! implicit none - ! procedure (ActionInteger) :: v - ! MiddleRamWashPtr => v - ! end subroutine - - ! subroutine SubscribeMiddleRamFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamFail' :: SubscribeMiddleRamFail - ! implicit none - ! procedure (ActionInteger) :: v - ! MiddleRamFailPtr => v - ! end subroutine - - ! subroutine SubscribeMiddleRamLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamLeak' :: SubscribeMiddleRamLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! MiddleRamLeakPtr => v - ! end subroutine - - - ! subroutine SubscribeLowerRamWash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamWash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamWash' :: SubscribeLowerRamWash - ! implicit none - ! procedure (ActionInteger) :: v - ! LowerRamWashPtr => v - ! end subroutine - - ! subroutine SubscribeLowerRamFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamFail' :: SubscribeLowerRamFail - ! implicit none - ! procedure (ActionInteger) :: v - ! LowerRamFailPtr => v - ! end subroutine - - ! subroutine SubscribeLowerRamLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamLeak' :: SubscribeLowerRamLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! LowerRamLeakPtr => v - ! end subroutine - - ! subroutine SubscribeAccumulatorPumpFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorPumpFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorPumpFail' :: SubscribeAccumulatorPumpFail - ! implicit none - ! procedure (ActionInteger) :: v - ! AccumulatorPumpFailPtr => v - ! end subroutine - - ! subroutine SubscribeAccumulatorPumpLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorPumpLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorPumpLeak' :: SubscribeAccumulatorPumpLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! AccumulatorPumpLeakPtr => v - ! end subroutine - - ! subroutine SubscribeAccumulatorSystemFail(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorSystemFail - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorSystemFail' :: SubscribeAccumulatorSystemFail - ! implicit none - ! procedure (ActionInteger) :: v - ! AccumulatorSystemFailPtr => v - ! end subroutine - - ! subroutine SubscribeAccumulatorSystemLeak(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorSystemLeak - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorSystemLeak' :: SubscribeAccumulatorSystemLeak - ! implicit none - ! procedure (ActionInteger) :: v - ! AccumulatorSystemLeakPtr => v - ! end subroutine - - - - - +module CBopProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type::BopProblemsType + type(CProblem) :: AnnularWash + type(CProblem) :: AnnularFail + type(CProblem) :: AnnularLeak + type(CProblem) :: UpperRamWash + type(CProblem) :: UpperRamFail + type(CProblem) :: UpperRamLeak + type(CProblem) :: MiddleRamWash + type(CProblem) :: MiddleRamFail + type(CProblem) :: MiddleRamLeak + type(CProblem) :: LowerRamWash + type(CProblem) :: LowerRamFail + type(CProblem) :: LowerRamLeak + type(CProblem) :: AccumulatorPumpFail + type(CProblem) :: AccumulatorPumpLeak + type(CProblem) :: AccumulatorSystemFail + type(CProblem) :: AccumulatorSystemLeak + end type BopProblemsType + + contains + + + + + + + + + + + + + + ! subroutine SubscribeAnnularWash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularWash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularWash' :: SubscribeAnnularWash + ! implicit none + ! procedure (ActionInteger) :: v + ! AnnularWashPtr => v + ! end subroutine + + ! subroutine SubscribeAnnularFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularFail' :: SubscribeAnnularFail + ! implicit none + ! procedure (ActionInteger) :: v + ! AnnularFailPtr => v + ! end subroutine + + ! subroutine SubscribeAnnularLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAnnularLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAnnularLeak' :: SubscribeAnnularLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! AnnularLeakPtr => v + ! end subroutine + + + ! subroutine SubscribeUpperRamWash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamWash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamWash' :: SubscribeUpperRamWash + ! implicit none + ! procedure (ActionInteger) :: v + ! UpperRamWashPtr => v + ! end subroutine + + ! subroutine SubscribeUpperRamFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamFail' :: SubscribeUpperRamFail + ! implicit none + ! procedure (ActionInteger) :: v + ! UpperRamFailPtr => v + ! end subroutine + + ! subroutine SubscribeUpperRamLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeUpperRamLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeUpperRamLeak' :: SubscribeUpperRamLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! UpperRamLeakPtr => v + ! end subroutine + + + ! subroutine SubscribeMiddleRamWash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamWash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamWash' :: SubscribeMiddleRamWash + ! implicit none + ! procedure (ActionInteger) :: v + ! MiddleRamWashPtr => v + ! end subroutine + + ! subroutine SubscribeMiddleRamFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamFail' :: SubscribeMiddleRamFail + ! implicit none + ! procedure (ActionInteger) :: v + ! MiddleRamFailPtr => v + ! end subroutine + + ! subroutine SubscribeMiddleRamLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeMiddleRamLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeMiddleRamLeak' :: SubscribeMiddleRamLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! MiddleRamLeakPtr => v + ! end subroutine + + + ! subroutine SubscribeLowerRamWash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamWash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamWash' :: SubscribeLowerRamWash + ! implicit none + ! procedure (ActionInteger) :: v + ! LowerRamWashPtr => v + ! end subroutine + + ! subroutine SubscribeLowerRamFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamFail' :: SubscribeLowerRamFail + ! implicit none + ! procedure (ActionInteger) :: v + ! LowerRamFailPtr => v + ! end subroutine + + ! subroutine SubscribeLowerRamLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeLowerRamLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeLowerRamLeak' :: SubscribeLowerRamLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! LowerRamLeakPtr => v + ! end subroutine + + ! subroutine SubscribeAccumulatorPumpFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorPumpFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorPumpFail' :: SubscribeAccumulatorPumpFail + ! implicit none + ! procedure (ActionInteger) :: v + ! AccumulatorPumpFailPtr => v + ! end subroutine + + ! subroutine SubscribeAccumulatorPumpLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorPumpLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorPumpLeak' :: SubscribeAccumulatorPumpLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! AccumulatorPumpLeakPtr => v + ! end subroutine + + ! subroutine SubscribeAccumulatorSystemFail(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorSystemFail + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorSystemFail' :: SubscribeAccumulatorSystemFail + ! implicit none + ! procedure (ActionInteger) :: v + ! AccumulatorSystemFailPtr => v + ! end subroutine + + ! subroutine SubscribeAccumulatorSystemLeak(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeAccumulatorSystemLeak + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeAccumulatorSystemLeak' :: SubscribeAccumulatorSystemLeak + ! implicit none + ! procedure (ActionInteger) :: v + ! AccumulatorSystemLeakPtr => v + ! end subroutine + + + + + end module CBopProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CChokeProblems.f90 b/CSharp/Problems/CChokeProblems.f90 index 1c2c5e0..6756fab 100644 --- a/CSharp/Problems/CChokeProblems.f90 +++ b/CSharp/Problems/CChokeProblems.f90 @@ -1,223 +1,252 @@ -module CChokeProblems - use SimulationVariables - implicit none - public - contains - subroutine ProcessChokeProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, time) - if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, time) - if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, time) - if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, time) - if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, time) - if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, time) - if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, time) - if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, time) - if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, time) - if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, time) - if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, time) - if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, time) - if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, time) - end subroutine - - subroutine ProcessChokeProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, strokes) - if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, strokes) - if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, strokes) - if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, strokes) - if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, strokes) - if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, strokes) - if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, strokes) - if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, strokes) - if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, strokes) - if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, strokes) - if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, strokes) - if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, strokes) - if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, strokes) - end subroutine - - subroutine ProcessChokeProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, volume) - if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, volume) - if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, volume) - if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, volume) - if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, volume) - if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, volume) - if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, volume) - if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, volume) - if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, volume) - if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, volume) - if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, volume) - if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, volume) - if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, volume) - end subroutine - - subroutine ProcessChokeProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, distance) - if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, distance) - if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, distance) - if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, distance) - if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, distance) - if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, distance) - if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, distance) - if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, distance) - if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, distance) - if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, distance) - if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, distance) - if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, distance) - if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, distance) - end subroutine - - - - - subroutine ChangeHydraulicChoke1Plugged(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke1PluggedPtr)) call HydraulicChoke1PluggedPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(1)%PlugMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(1)%PlugMalf = 1 - endsubroutine - - subroutine ChangeHydraulicChoke1Fail(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke1FailPtr)) call HydraulicChoke1FailPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(1)%FailMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(1)%FailMalf = 1 - endsubroutine - - subroutine ChangeHydraulicChoke1Washout(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - use CChokeManifoldVariables - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke1WashoutPtr)) call HydraulicChoke1WashoutPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(1)%WashoutMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(1)%WashoutMalf = 1 - - if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%HyChock1OnProblem = .false. - if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%HyChock1OnProblem = .true. - endsubroutine - - subroutine ChangeHydraulicChoke2Plugged(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke2PluggedPtr)) call HydraulicChoke2PluggedPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(2)%PlugMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(2)%PlugMalf = 1 - endsubroutine - - subroutine ChangeHydraulicChoke2Fail(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke2FailPtr)) call HydraulicChoke2FailPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(2)%FailMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(2)%FailMalf = 1 - endsubroutine - - subroutine ChangeHydraulicChoke2Washout(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - use CChokeManifoldVariables - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(HydraulicChoke2WashoutPtr)) call HydraulicChoke2WashoutPtr(status) - if(status == Clear_StatusType) data%State%CHOOKE(2)%WashoutMalf = 0 - if(status == Executed_StatusType) data%State%CHOOKE(2)%WashoutMalf = 1 - - if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%HyChock2OnProblem = .false. - if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%HyChock2OnProblem = .true. - endsubroutine - - subroutine ChangeManualChoke1Plugged(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke1PluggedPtr)) call ManualChoke1PluggedPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke1Plug = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke1Plug = 1 - endsubroutine - - subroutine ChangeManualChoke1Fail(status) - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke1FailPtr)) call ManualChoke1FailPtr(status) - !if(status == Clear_StatusType) print*,'On_ManualChoke1Fail_Clear' - !if(status == Executed_StatusType) print*,'On_ManualChoke1Fail_Execute' - endsubroutine - - subroutine ChangeManualChoke1Washout(status) - USE FricPressDropVarsModule - use CChokeManifoldVariables - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke1WashoutPtr)) call ManualChoke1WashoutPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke1Washout = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke1Washout = 1 - - if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%LeftManChokeOnProblem = .false. - if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%LeftManChokeOnProblem = .true. - endsubroutine - - subroutine ChangeManualChoke2Plugged(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke2PluggedPtr)) call ManualChoke2PluggedPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke2Plug = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke2Plug = 1 - endsubroutine - - subroutine ChangeManualChoke2Fail(status) - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke2FailPtr)) call ManualChoke2FailPtr(status) - !if(status == Clear_StatusType) print*,'On_ManualChoke2Fail_Clear' - !if(status == Executed_StatusType) print*,'On_ManualChoke2Fail_Execute' - endsubroutine - - subroutine ChangeManualChoke2Washout(status) - USE FricPressDropVarsModule - use CChokeManifoldVariables - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(ManualChoke2WashoutPtr)) call ManualChoke2WashoutPtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke2Washout = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke2Washout = 1 - - if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%RightManChokeOnProblem = .false. - if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%RightManChokeOnProblem = .true. - endsubroutine - - subroutine ChangeChokePanelAirFail(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(ChokePanelAirFailPtr)) call ChokePanelAirFailPtr(status) - if(status == Clear_StatusType) data%State%AirDrivenPump%ChokeAirFail = 0 - if(status == Executed_StatusType) data%State%AirDrivenPump%ChokeAirFail = 1 - endsubroutine - +module CChokeProblems + use SimulationVariables + implicit none + public + contains + + subroutine ChokeProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'ChokeProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"HydraulicChoke1Plugged",data%problems%ChokeProblems%HydraulicChoke1Plugged) + call ProblemToJson(p,"HydraulicChoke1Fail",data%problems%ChokeProblems%HydraulicChoke1Fail) + call ProblemToJson(p,"HydraulicChoke1Washout",data%problems%ChokeProblems%HydraulicChoke1Washout) + call ProblemToJson(p,"HydraulicChoke2Plugged",data%problems%ChokeProblems%HydraulicChoke2Plugged) + call ProblemToJson(p,"HydraulicChoke2Fail",data%problems%ChokeProblems%HydraulicChoke2Fail) + call ProblemToJson(p,"HydraulicChoke2Washout",data%problems%ChokeProblems%HydraulicChoke2Washout) + call ProblemToJson(p,"ManualChoke1Plugged",data%problems%ChokeProblems%ManualChoke1Plugged) + call ProblemToJson(p,"ManualChoke1Fail",data%problems%ChokeProblems%ManualChoke1Fail) + call ProblemToJson(p,"ManualChoke1Washout",data%problems%ChokeProblems%ManualChoke1Washout) + call ProblemToJson(p,"ManualChoke2Plugged",data%problems%ChokeProblems%ManualChoke2Plugged) + call ProblemToJson(p,"ManualChoke2Fail",data%problems%ChokeProblems%ManualChoke2Fail) + call ProblemToJson(p,"ManualChoke2Washout",data%problems%ChokeProblems%ManualChoke2Washout) + call ProblemToJson(p,"ChokePanelAirFail",data%problems%ChokeProblems%ChokePanelAirFail) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessChokeProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, time) + if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, time) + if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, time) + if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, time) + if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, time) + if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, time) + if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, time) + if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, time) + if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, time) + if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, time) + if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, time) + if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, time) + if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, time) + end subroutine + + subroutine ProcessChokeProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, strokes) + if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, strokes) + if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, strokes) + if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, strokes) + if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, strokes) + if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, strokes) + if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, strokes) + if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, strokes) + if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, strokes) + if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, strokes) + if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, strokes) + if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, strokes) + if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, strokes) + end subroutine + + subroutine ProcessChokeProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, volume) + if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, volume) + if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, volume) + if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, volume) + if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, volume) + if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, volume) + if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, volume) + if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, volume) + if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, volume) + if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, volume) + if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, volume) + if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, volume) + if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, volume) + end subroutine + + subroutine ProcessChokeProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + if(data%problems%ChokeProblems%HydraulicChoke1Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Plugged, ChangeHydraulicChoke1Plugged, distance) + if(data%problems%ChokeProblems%HydraulicChoke1Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Fail, ChangeHydraulicChoke1Fail, distance) + if(data%problems%ChokeProblems%HydraulicChoke1Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke1Washout, ChangeHydraulicChoke1Washout, distance) + if(data%problems%ChokeProblems%HydraulicChoke2Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Plugged, ChangeHydraulicChoke2Plugged, distance) + if(data%problems%ChokeProblems%HydraulicChoke2Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Fail, ChangeHydraulicChoke2Fail, distance) + if(data%problems%ChokeProblems%HydraulicChoke2Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%HydraulicChoke2Washout, ChangeHydraulicChoke2Washout, distance) + if(data%problems%ChokeProblems%ManualChoke1Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Plugged, ChangeManualChoke1Plugged, distance) + if(data%problems%ChokeProblems%ManualChoke1Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Fail, ChangeManualChoke1Fail, distance) + if(data%problems%ChokeProblems%ManualChoke1Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke1Washout, ChangeManualChoke1Washout, distance) + if(data%problems%ChokeProblems%ManualChoke2Plugged%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Plugged, ChangeManualChoke2Plugged, distance) + if(data%problems%ChokeProblems%ManualChoke2Fail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Fail, ChangeManualChoke2Fail, distance) + if(data%problems%ChokeProblems%ManualChoke2Washout%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ManualChoke2Washout, ChangeManualChoke2Washout, distance) + if(data%problems%ChokeProblems%ChokePanelAirFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%ChokeProblems%ChokePanelAirFail, ChangeChokePanelAirFail, distance) + end subroutine + + + + + subroutine ChangeHydraulicChoke1Plugged(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke1PluggedPtr)) call HydraulicChoke1PluggedPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(1)%PlugMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(1)%PlugMalf = 1 + endsubroutine + + subroutine ChangeHydraulicChoke1Fail(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke1FailPtr)) call HydraulicChoke1FailPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(1)%FailMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(1)%FailMalf = 1 + endsubroutine + + subroutine ChangeHydraulicChoke1Washout(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + use CChokeManifoldVariables + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke1WashoutPtr)) call HydraulicChoke1WashoutPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(1)%WashoutMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(1)%WashoutMalf = 1 + + if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%HyChock1OnProblem = .false. + if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%HyChock1OnProblem = .true. + endsubroutine + + subroutine ChangeHydraulicChoke2Plugged(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke2PluggedPtr)) call HydraulicChoke2PluggedPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(2)%PlugMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(2)%PlugMalf = 1 + endsubroutine + + subroutine ChangeHydraulicChoke2Fail(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke2FailPtr)) call HydraulicChoke2FailPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(2)%FailMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(2)%FailMalf = 1 + endsubroutine + + subroutine ChangeHydraulicChoke2Washout(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + use CChokeManifoldVariables + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(HydraulicChoke2WashoutPtr)) call HydraulicChoke2WashoutPtr(status) + if(status == Clear_StatusType) data%State%CHOOKE(2)%WashoutMalf = 0 + if(status == Executed_StatusType) data%State%CHOOKE(2)%WashoutMalf = 1 + + if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%HyChock2OnProblem = .false. + if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%HyChock2OnProblem = .true. + endsubroutine + + subroutine ChangeManualChoke1Plugged(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke1PluggedPtr)) call ManualChoke1PluggedPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke1Plug = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke1Plug = 1 + endsubroutine + + subroutine ChangeManualChoke1Fail(status) + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke1FailPtr)) call ManualChoke1FailPtr(status) + !if(status == Clear_StatusType) print*,'On_ManualChoke1Fail_Clear' + !if(status == Executed_StatusType) print*,'On_ManualChoke1Fail_Execute' + endsubroutine + + subroutine ChangeManualChoke1Washout(status) + USE FricPressDropVarsModule + use CChokeManifoldVariables + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke1WashoutPtr)) call ManualChoke1WashoutPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke1Washout = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke1Washout = 1 + + if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%LeftManChokeOnProblem = .false. + if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%LeftManChokeOnProblem = .true. + endsubroutine + + subroutine ChangeManualChoke2Plugged(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke2PluggedPtr)) call ManualChoke2PluggedPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke2Plug = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke2Plug = 1 + endsubroutine + + subroutine ChangeManualChoke2Fail(status) + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke2FailPtr)) call ManualChoke2FailPtr(status) + !if(status == Clear_StatusType) print*,'On_ManualChoke2Fail_Clear' + !if(status == Executed_StatusType) print*,'On_ManualChoke2Fail_Execute' + endsubroutine + + subroutine ChangeManualChoke2Washout(status) + USE FricPressDropVarsModule + use CChokeManifoldVariables + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(ManualChoke2WashoutPtr)) call ManualChoke2WashoutPtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%ManChoke2Washout = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%ManChoke2Washout = 1 + + if(status == Clear_StatusType) data%EquipmentControl%ChokeManifold%RightManChokeOnProblem = .false. + if(status == Executed_StatusType) data%EquipmentControl%ChokeManifold%RightManChokeOnProblem = .true. + endsubroutine + + subroutine ChangeChokePanelAirFail(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(ChokePanelAirFailPtr)) call ChokePanelAirFailPtr(status) + if(status == Clear_StatusType) data%State%AirDrivenPump%ChokeAirFail = 0 + if(status == Executed_StatusType) data%State%AirDrivenPump%ChokeAirFail = 1 + endsubroutine + end module CChokeProblems \ No newline at end of file diff --git a/CSharp/Problems/CChokeProblemsVariables.f90 b/CSharp/Problems/CChokeProblemsVariables.f90 index d100e11..79ca9b2 100644 --- a/CSharp/Problems/CChokeProblemsVariables.f90 +++ b/CSharp/Problems/CChokeProblemsVariables.f90 @@ -1,30 +1,30 @@ -module CChokeProblemsVariables - use CProblemDifinition - - implicit none - public - - ! Input vars - type:: ChokeProblemsType - type(CProblem) :: HydraulicChoke1Plugged - type(CProblem) :: HydraulicChoke1Fail - type(CProblem) :: HydraulicChoke1Washout - integer :: HydraulicChoke1PluggedPercent - type(CProblem) :: HydraulicChoke2Plugged - type(CProblem) :: HydraulicChoke2Fail - type(CProblem) :: HydraulicChoke2Washout - integer :: HydraulicChoke2PluggedPercent - type(CProblem) :: ManualChoke1Plugged - type(CProblem) :: ManualChoke1Fail - type(CProblem) :: ManualChoke1Washout - integer :: ManualChoke1PluggedPercent - type(CProblem) :: ManualChoke2Plugged - type(CProblem) :: ManualChoke2Fail - type(CProblem) :: ManualChoke2Washout - integer :: ManualChoke2PluggedPercent - type(CProblem) :: ChokePanelAirFail - end type ChokeProblemsType - - contains - +module CChokeProblemsVariables + use CProblemDifinition + + implicit none + public + + ! Input vars + type:: ChokeProblemsType + type(CProblem) :: HydraulicChoke1Plugged + type(CProblem) :: HydraulicChoke1Fail + type(CProblem) :: HydraulicChoke1Washout + integer :: HydraulicChoke1PluggedPercent + type(CProblem) :: HydraulicChoke2Plugged + type(CProblem) :: HydraulicChoke2Fail + type(CProblem) :: HydraulicChoke2Washout + integer :: HydraulicChoke2PluggedPercent + type(CProblem) :: ManualChoke1Plugged + type(CProblem) :: ManualChoke1Fail + type(CProblem) :: ManualChoke1Washout + integer :: ManualChoke1PluggedPercent + type(CProblem) :: ManualChoke2Plugged + type(CProblem) :: ManualChoke2Fail + type(CProblem) :: ManualChoke2Washout + integer :: ManualChoke2PluggedPercent + type(CProblem) :: ChokePanelAirFail + end type ChokeProblemsType + + contains + end module CChokeProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CDrillStemProblems.f90 b/CSharp/Problems/CDrillStemProblems.f90 index 694b736..af847e0 100644 --- a/CSharp/Problems/CDrillStemProblems.f90 +++ b/CSharp/Problems/CDrillStemProblems.f90 @@ -1,64 +1,82 @@ -module CDrillStemProblems - use SimulationVariables - implicit none - public - contains - subroutine ProcessDrillStemProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, time) - if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, time) - if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, time) - end subroutine - - subroutine ProcessDrillStemProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, strokes) - if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, strokes) - if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, strokes) - end subroutine - - subroutine ProcessDrillStemProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, volume) - if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, volume) - if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, volume) - end subroutine - - subroutine ProcessDrillStemProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, distance) - if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, distance) - if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, distance) - end subroutine - - - - subroutine ChangeStringDragIncrease(status) - implicit none - integer, intent (in) :: status - ! if(associated(StringDragIncreasePtr)) call StringDragIncreasePtr(status) - !if(status == Clear_StatusType) print*,'On_StringDragIncrease_Clear' - !if(status == Executed_StatusType) print*,'On_StringDragIncrease_Execute' - endsubroutine - - subroutine ChangeStringTorqueIncrease(status) - implicit none - integer, intent (in) :: status - ! if(associated(StringTorqueIncreasePtr)) call StringTorqueIncreasePtr(status) - !if(status == Clear_StatusType) print*,'On_StringTorqueIncrease_Clear' - !if(status == Executed_StatusType) print*,'On_StringTorqueIncrease_Execute' - endsubroutine - - subroutine ChangeStringTorqueFluctuation(status) - implicit none - integer, intent (in) :: status - ! if(associated(StringTorqueFluctuationPtr)) call StringTorqueFluctuationPtr(status) - !if(status == Clear_StatusType) print*,'On_StringTorqueFluctuation_Clear' - !if(status == Executed_StatusType) print*,'On_StringTorqueFluctuation_Execute' - endsubroutine - +module CDrillStemProblems + use SimulationVariables + implicit none + public + contains + subroutine DrillStemProblemsToJson(parent) + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'DrillStemsProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"StringDragIncrease",data%problems%DrillStemProblems%StringDragIncrease) + call ProblemToJson(p,"StringTorqueIncrease",data%problems%DrillStemProblems%StringTorqueIncrease) + call ProblemToJson(p,"StringTorqueFluctuation",data%problems%DrillStemProblems%StringTorqueFluctuation) + call json%add(p,"StringDragIncreaseTime",data%problems%DrillStemProblems%StringDragIncreaseTime) + call json%add(p,"StringTorqueIncreaseTime",data%problems%DrillStemProblems%StringTorqueIncreaseTime) + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessDrillStemProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, time) + if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, time) + if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, time) + end subroutine + + subroutine ProcessDrillStemProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, strokes) + if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, strokes) + if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, strokes) + end subroutine + + subroutine ProcessDrillStemProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, volume) + if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, volume) + if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, volume) + end subroutine + + subroutine ProcessDrillStemProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + if(data%problems%DrillStemProblems%StringDragIncrease%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringDragIncrease, ChangeStringDragIncrease, distance) + if(data%problems%DrillStemProblems%StringTorqueIncrease%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringTorqueIncrease, ChangeStringTorqueIncrease, distance) + if(data%problems%DrillStemProblems%StringTorqueFluctuation%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%DrillStemProblems%StringTorqueFluctuation, ChangeStringTorqueFluctuation, distance) + end subroutine + + + + subroutine ChangeStringDragIncrease(status) + implicit none + integer, intent (in) :: status + ! if(associated(StringDragIncreasePtr)) call StringDragIncreasePtr(status) + !if(status == Clear_StatusType) print*,'On_StringDragIncrease_Clear' + !if(status == Executed_StatusType) print*,'On_StringDragIncrease_Execute' + endsubroutine + + subroutine ChangeStringTorqueIncrease(status) + implicit none + integer, intent (in) :: status + ! if(associated(StringTorqueIncreasePtr)) call StringTorqueIncreasePtr(status) + !if(status == Clear_StatusType) print*,'On_StringTorqueIncrease_Clear' + !if(status == Executed_StatusType) print*,'On_StringTorqueIncrease_Execute' + endsubroutine + + subroutine ChangeStringTorqueFluctuation(status) + implicit none + integer, intent (in) :: status + ! if(associated(StringTorqueFluctuationPtr)) call StringTorqueFluctuationPtr(status) + !if(status == Clear_StatusType) print*,'On_StringTorqueFluctuation_Clear' + !if(status == Executed_StatusType) print*,'On_StringTorqueFluctuation_Execute' + endsubroutine + end module CDrillStemProblems \ No newline at end of file diff --git a/CSharp/Problems/CDrillStemProblemsVariables.f90 b/CSharp/Problems/CDrillStemProblemsVariables.f90 index 16829ef..9ae14fb 100644 --- a/CSharp/Problems/CDrillStemProblemsVariables.f90 +++ b/CSharp/Problems/CDrillStemProblemsVariables.f90 @@ -1,17 +1,17 @@ -module CDrillStemProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type:: DrillStemProblemsType - type(CProblem) :: StringDragIncrease - type(CProblem) :: StringTorqueIncrease - type(CProblem) :: StringTorqueFluctuation - real(8) :: StringDragIncreaseTime - real(8) :: StringTorqueIncreaseTime - end type DrillStemProblemsType - - contains - +module CDrillStemProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type:: DrillStemProblemsType + type(CProblem) :: StringDragIncrease + type(CProblem) :: StringTorqueIncrease + type(CProblem) :: StringTorqueFluctuation + real(8) :: StringDragIncreaseTime + real(8) :: StringTorqueIncreaseTime + end type DrillStemProblemsType + + contains + end module CDrillStemProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CGaugesProblems.f90 b/CSharp/Problems/CGaugesProblems.f90 index 5e474cb..32c7c7e 100644 --- a/CSharp/Problems/CGaugesProblems.f90 +++ b/CSharp/Problems/CGaugesProblems.f90 @@ -1,337 +1,374 @@ -module CGaugesProblems - use SimulationVariables - implicit none - public - contains - - subroutine ProcessGaugesProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%GaugesProblems%WeightIndicator%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, time) - if(data%problems%GaugesProblems%RotaryRpm%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, time) - if(data%problems%GaugesProblems%RotaryTorque%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, time) - if(data%problems%GaugesProblems%StandPipePressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, time) - if(data%problems%GaugesProblems%CasingPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, time) - if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, time) - if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, time) - if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, time) - if(data%problems%GaugesProblems%TripTank%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%TripTank, ChangeTripTank, time) - if(data%problems%GaugesProblems%PitGainLoss%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, time) - if(data%problems%GaugesProblems%MudTankVolume%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, time) - if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, time) - if(data%problems%GaugesProblems%TorqueLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, time) - if(data%problems%GaugesProblems%PowerLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, time) - if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, time) - if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, time) - if(data%problems%GaugesProblems%AnnularPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, time) - if(data%problems%GaugesProblems%RigAirPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, time) - if(data%problems%GaugesProblems%StandPipe1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, time) - if(data%problems%GaugesProblems%StandPipe2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, time) - if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, time) - if(data%problems%GaugesProblems%ChokePosition%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, time) - if(data%problems%GaugesProblems%CasingPressure2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, time) - end subroutine - - subroutine ProcessGaugesProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - if(data%problems%GaugesProblems%WeightIndicator%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, strokes) - if(data%problems%GaugesProblems%RotaryRpm%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, strokes) - if(data%problems%GaugesProblems%RotaryTorque%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, strokes) - if(data%problems%GaugesProblems%StandPipePressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, strokes) - if(data%problems%GaugesProblems%CasingPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, strokes) - if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, strokes) - if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, strokes) - if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, strokes) - if(data%problems%GaugesProblems%TripTank%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%TripTank, ChangeTripTank, strokes) - if(data%problems%GaugesProblems%PitGainLoss%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, strokes) - if(data%problems%GaugesProblems%MudTankVolume%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, strokes) - if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, strokes) - if(data%problems%GaugesProblems%TorqueLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, strokes) - if(data%problems%GaugesProblems%PowerLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, strokes) - if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, strokes) - if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, strokes) - if(data%problems%GaugesProblems%AnnularPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, strokes) - if(data%problems%GaugesProblems%RigAirPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, strokes) - if(data%problems%GaugesProblems%StandPipe1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, strokes) - if(data%problems%GaugesProblems%StandPipe2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, strokes) - if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, strokes) - if(data%problems%GaugesProblems%ChokePosition%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, strokes) - if(data%problems%GaugesProblems%CasingPressure2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, strokes) - end subroutine - - subroutine ProcessGaugesProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - if(data%problems%GaugesProblems%WeightIndicator%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, volume) - if(data%problems%GaugesProblems%RotaryRpm%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, volume) - if(data%problems%GaugesProblems%RotaryTorque%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, volume) - if(data%problems%GaugesProblems%StandPipePressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, volume) - if(data%problems%GaugesProblems%CasingPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, volume) - if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, volume) - if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, volume) - if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, volume) - if(data%problems%GaugesProblems%TripTank%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%TripTank, ChangeTripTank, volume) - if(data%problems%GaugesProblems%PitGainLoss%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, volume) - if(data%problems%GaugesProblems%MudTankVolume%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, volume) - if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, volume) - if(data%problems%GaugesProblems%TorqueLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, volume) - if(data%problems%GaugesProblems%PowerLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, volume) - if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, volume) - if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, volume) - if(data%problems%GaugesProblems%AnnularPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, volume) - if(data%problems%GaugesProblems%RigAirPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, volume) - if(data%problems%GaugesProblems%StandPipe1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, volume) - if(data%problems%GaugesProblems%StandPipe2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, volume) - if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, volume) - if(data%problems%GaugesProblems%ChokePosition%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, volume) - if(data%problems%GaugesProblems%CasingPressure2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, volume) - end subroutine - - subroutine ProcessGaugesProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - if(data%problems%GaugesProblems%WeightIndicator%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, distance) - if(data%problems%GaugesProblems%RotaryRpm%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, distance) - if(data%problems%GaugesProblems%RotaryTorque%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, distance) - if(data%problems%GaugesProblems%StandPipePressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, distance) - if(data%problems%GaugesProblems%CasingPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, distance) - if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, distance) - if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, distance) - if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, distance) - if(data%problems%GaugesProblems%TripTank%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%TripTank, ChangeTripTank, distance) - if(data%problems%GaugesProblems%PitGainLoss%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, distance) - if(data%problems%GaugesProblems%MudTankVolume%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, distance) - if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, distance) - if(data%problems%GaugesProblems%TorqueLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, distance) - if(data%problems%GaugesProblems%PowerLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, distance) - if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, distance) - if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, distance) - if(data%problems%GaugesProblems%AnnularPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, distance) - if(data%problems%GaugesProblems%RigAirPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, distance) - if(data%problems%GaugesProblems%StandPipe1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, distance) - if(data%problems%GaugesProblems%StandPipe2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, distance) - if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, distance) - if(data%problems%GaugesProblems%ChokePosition%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, distance) - if(data%problems%GaugesProblems%CasingPressure2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, distance) - end subroutine - - - - - - - - - - subroutine ChangeWeightIndicator(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(WeightIndicatorPtr)) call WeightIndicatorPtr(status) - if(status == Clear_StatusType) data%State%TD_General%WeightIndicatorMalf = 0 - if(status == Executed_StatusType) data%State%TD_General%WeightIndicatorMalf = 1 - endsubroutine - - subroutine ChangeRotaryRpm(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(RotaryRpmPtr)) call RotaryRpmPtr(status) - if(status == Clear_StatusType) data%State%RTable%RpmGaugeMalf = 0 - if(status == Executed_StatusType) data%State%RTable%RpmGaugeMalf = 1 - endsubroutine - - subroutine ChangeRotaryTorque(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(RotaryTorquePtr)) call RotaryTorquePtr(status) - if(status == Clear_StatusType) data%State%RTable%TorqueGaugeMalf = 0 - if(status == Executed_StatusType) data%State%RTable%TorqueGaugeMalf = 1 - endsubroutine - - subroutine ChangeStandPipePressure(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(StandPipePressurePtr)) call StandPipePressurePtr(status) - if(status == Clear_StatusType) data%State%MudSystem%StandPipePressure_DataDisplayMalf = 0 - if(status == Executed_StatusType) data%State%MudSystem%StandPipePressure_DataDisplayMalf = 1 - endsubroutine - - subroutine ChangeCasingPressure(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(CasingPressurePtr)) call CasingPressurePtr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%CasingPressure_DataDisplayMalF = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%CasingPressure_DataDisplayMalF = 1 - endsubroutine - - subroutine ChangePump1Strokes(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(Pump1StrokesPtr)) call Pump1StrokesPtr(status) - if(status == Clear_StatusType) data%State%Pump(1)%SPMGaugeMalf = 0 - if(status == Executed_StatusType) data%State%Pump(1)%SPMGaugeMalf = 1 - endsubroutine - - subroutine ChangePump2Strokes(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(Pump2StrokesPtr)) call Pump2StrokesPtr(status) - if(status == Clear_StatusType) data%State%Pump(2)%SPMGaugeMalf = 0 - if(status == Executed_StatusType) data%State%Pump(2)%SPMGaugeMalf = 1 - endsubroutine - - subroutine ChangeReturnLineTemperature(status) - implicit none - integer, intent (in) :: status - ! if(associated(ReturnLineTemperaturePtr)) call ReturnLineTemperaturePtr(status) - !if(status == Clear_StatusType) print*,'On_ReturnLineTemperature_Clear' - !if(status == Executed_StatusType) print*,'On_ReturnLineTemperature_Execute' - endsubroutine - - subroutine ChangeTripTank(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(TripTankPtr)) call TripTankPtr(status) - if(status == Clear_StatusType) data%State%MudSystem%TripTankPressure_DataDisplayMalf = 0 - if(status == Executed_StatusType) data%State%MudSystem%TripTankPressure_DataDisplayMalf = 1 - endsubroutine - - subroutine ChangePitGainLoss(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(PitGainLossPtr)) call PitGainLossPtr(status) - if(status == Clear_StatusType) data%State%MudSystem%PitGainLossGaugeMalf = 0 - if(status == Executed_StatusType) data%State%MudSystem%PitGainLossGaugeMalf = 1 - endsubroutine - - subroutine ChangeMudTankVolume(status) - implicit none - integer, intent (in) :: status - ! if(associated(MudTankVolumePtr)) call MudTankVolumePtr(status) - !if(status == Clear_StatusType) print*,'On_MudTankVolume_Clear' - !if(status == Executed_StatusType) print*,'On_MudTankVolume_Execute' - endsubroutine - - subroutine ChangeReturnMudFlow(status) - implicit none - integer, intent (in) :: status - ! if(associated(ReturnMudFlowPtr)) call ReturnMudFlowPtr(status) - !if(status == Clear_StatusType) print*,'On_ReturnMudFlow_Clear' - !if(status == Executed_StatusType) print*,'On_ReturnMudFlow_Execute' - endsubroutine - - subroutine ChangeTorqueLimit(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(TorqueLimitPtr)) call TorqueLimitPtr(status) - if(status == Clear_StatusType) data%State%RTable%TorqueLimitGaugeMalf = 0 - if(status == Executed_StatusType) data%State%RTable%TorqueLimitGaugeMalf = 1 - endsubroutine - - subroutine ChangePowerLimit(status) - implicit none - integer, intent (in) :: status - ! if(associated(PowerLimitPtr)) call PowerLimitPtr(status) - !if(status == Clear_StatusType) print*,'On_PowerLimit_Clear' - !if(status == Executed_StatusType) print*,'On_PowerLimit_Execute' - endsubroutine - - subroutine ChangeAccumulatorPressure(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(AccumulatorPressurePtr)) call AccumulatorPressurePtr(status) - if(status == Clear_StatusType) data%State%BopStackAcc%AccumulatorPressureGaugeMalf = 0 - if(status == Executed_StatusType) data%State%BopStackAcc%AccumulatorPressureGaugeMalf = 1 - endsubroutine - - subroutine ChangeManifoldPressure(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(ManifoldPressurePtr)) call ManifoldPressurePtr(status) - if(status == Clear_StatusType) data%State%BopStackAcc%ManifoldPressureGaugeMalf = 0 - if(status == Executed_StatusType) data%State%BopStackAcc%ManifoldPressureGaugeMalf = 1 - endsubroutine - - subroutine ChangeAnnularPressure(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(AnnularPressurePtr)) call AnnularPressurePtr(status) - if(status == Clear_StatusType) data%State%Annular%AnnularPressureGaugeMalf = 0 - if(status == Executed_StatusType) data%State%Annular%AnnularPressureGaugeMalf = 1 - endsubroutine - - subroutine ChangeRigAirPressure(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - ! if(associated(RigAirPressurePtr)) call RigAirPressurePtr(status) - if(status == Clear_StatusType) data%State%BopStackAcc%AirSupplyPressureGaugeMalf = 0 - if(status == Executed_StatusType) data%State%BopStackAcc%AirSupplyPressureGaugeMalf = 1 - endsubroutine - - subroutine ChangeStandPipe1(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(StandPipe1Ptr)) call StandPipe1Ptr(status) - if(status == Clear_StatusType) data%State%MudSystem%StandPipeGauge1Malf = 0 - if(status == Executed_StatusType) data%State%MudSystem%StandPipeGauge1Malf = 1 - endsubroutine - - subroutine ChangeStandPipe2(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(StandPipe2Ptr)) call StandPipe2Ptr(status) - if(status == Clear_StatusType) data%State%MudSystem%StandPipeGauge2Malf = 0 - if(status == Executed_StatusType) data%State%MudSystem%StandPipeGauge2Malf = 1 - endsubroutine - - subroutine ChangeDrillPipePressure(status) - USE MudSystemVARIABLES -use SimulationVariables !@@@ - implicit none - integer, intent (in) :: status - ! if(associated(DrillPipePressurePtr)) call DrillPipePressurePtr(status) - if(status == Clear_StatusType) data%State%MudSystem%DrillPipePressureMalf = 0 - if(status == Executed_StatusType) data%State%MudSystem%DrillPipePressureMalf = 1 - endsubroutine - - subroutine ChangeChokePosition(status) - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(ChokePositionPtr)) call ChokePositionPtr(status) - if(status == Clear_StatusType) data%State%Choke%GaugeChokePositionMailf = 0 - if(status == Executed_StatusType) data%State%Choke%GaugeChokePositionMailf = 1 - endsubroutine - - subroutine ChangeCasingPressure2(status) - USE FricPressDropVarsModule - implicit none - integer, intent (in) :: status - ! if(associated(CasingPressure2Ptr)) call CasingPressure2Ptr(status) - if(status == Clear_StatusType) data%State%FricPressDrop%CasingPressure_ChokeMalF = 0 - if(status == Executed_StatusType) data%State%FricPressDrop%CasingPressure_ChokeMalF = 1 - endsubroutine - +module CGaugesProblems + use SimulationVariables + implicit none + public + contains + subroutine GaugesProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'GaugesProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"WeightIndicator",data%problems%GaugesProblems%WeightIndicator) + call ProblemToJson(p,"RotaryRpm",data%problems%GaugesProblems%RotaryRpm) + call ProblemToJson(p,"RotaryTorque",data%problems%GaugesProblems%RotaryTorque) + call ProblemToJson(p,"StandPipePressure",data%problems%GaugesProblems%StandPipePressure) + call ProblemToJson(p,"CasingPressure",data%problems%GaugesProblems%CasingPressure) + call ProblemToJson(p,"Pump1Strokes",data%problems%GaugesProblems%Pump1Strokes) + call ProblemToJson(p,"Pump2Strokes",data%problems%GaugesProblems%Pump2Strokes) + call ProblemToJson(p,"ReturnLineTemperature",data%problems%GaugesProblems%ReturnLineTemperature) + call ProblemToJson(p,"TripTank",data%problems%GaugesProblems%TripTank) + call ProblemToJson(p,"PitGainLoss",data%problems%GaugesProblems%PitGainLoss) + call ProblemToJson(p,"MudTankVolume",data%problems%GaugesProblems%MudTankVolume) + call ProblemToJson(p,"ReturnMudFlow",data%problems%GaugesProblems%ReturnMudFlow) + call ProblemToJson(p,"TorqueLimit",data%problems%GaugesProblems%TorqueLimit) + call ProblemToJson(p,"PowerLimit",data%problems%GaugesProblems%PowerLimit) + call ProblemToJson(p,"AccumulatorPressure",data%problems%GaugesProblems%AccumulatorPressure) + call ProblemToJson(p,"ManifoldPressure",data%problems%GaugesProblems%ManifoldPressure) + call ProblemToJson(p,"AnnularPressure",data%problems%GaugesProblems%AnnularPressure) + call ProblemToJson(p,"RigAirPressure",data%problems%GaugesProblems%RigAirPressure) + call ProblemToJson(p,"StandPipe1",data%problems%GaugesProblems%StandPipe1) + call ProblemToJson(p,"StandPipe2",data%problems%GaugesProblems%StandPipe2) + call ProblemToJson(p,"DrillPipePressure",data%problems%GaugesProblems%DrillPipePressure) + call ProblemToJson(p,"ChokePosition",data%problems%GaugesProblems%ChokePosition) + call ProblemToJson(p,"CasingPressure2",data%problems%GaugesProblems%CasingPressure2) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessGaugesProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%GaugesProblems%WeightIndicator%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, time) + if(data%problems%GaugesProblems%RotaryRpm%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, time) + if(data%problems%GaugesProblems%RotaryTorque%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, time) + if(data%problems%GaugesProblems%StandPipePressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, time) + if(data%problems%GaugesProblems%CasingPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, time) + if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, time) + if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, time) + if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, time) + if(data%problems%GaugesProblems%TripTank%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%TripTank, ChangeTripTank, time) + if(data%problems%GaugesProblems%PitGainLoss%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, time) + if(data%problems%GaugesProblems%MudTankVolume%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, time) + if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, time) + if(data%problems%GaugesProblems%TorqueLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, time) + if(data%problems%GaugesProblems%PowerLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, time) + if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, time) + if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, time) + if(data%problems%GaugesProblems%AnnularPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, time) + if(data%problems%GaugesProblems%RigAirPressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, time) + if(data%problems%GaugesProblems%StandPipe1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, time) + if(data%problems%GaugesProblems%StandPipe2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, time) + if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, time) + if(data%problems%GaugesProblems%ChokePosition%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, time) + if(data%problems%GaugesProblems%CasingPressure2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, time) + end subroutine + + subroutine ProcessGaugesProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + if(data%problems%GaugesProblems%WeightIndicator%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, strokes) + if(data%problems%GaugesProblems%RotaryRpm%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, strokes) + if(data%problems%GaugesProblems%RotaryTorque%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, strokes) + if(data%problems%GaugesProblems%StandPipePressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, strokes) + if(data%problems%GaugesProblems%CasingPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, strokes) + if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, strokes) + if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, strokes) + if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, strokes) + if(data%problems%GaugesProblems%TripTank%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%TripTank, ChangeTripTank, strokes) + if(data%problems%GaugesProblems%PitGainLoss%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, strokes) + if(data%problems%GaugesProblems%MudTankVolume%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, strokes) + if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, strokes) + if(data%problems%GaugesProblems%TorqueLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, strokes) + if(data%problems%GaugesProblems%PowerLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, strokes) + if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, strokes) + if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, strokes) + if(data%problems%GaugesProblems%AnnularPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, strokes) + if(data%problems%GaugesProblems%RigAirPressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, strokes) + if(data%problems%GaugesProblems%StandPipe1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, strokes) + if(data%problems%GaugesProblems%StandPipe2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, strokes) + if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, strokes) + if(data%problems%GaugesProblems%ChokePosition%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, strokes) + if(data%problems%GaugesProblems%CasingPressure2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, strokes) + end subroutine + + subroutine ProcessGaugesProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + if(data%problems%GaugesProblems%WeightIndicator%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, volume) + if(data%problems%GaugesProblems%RotaryRpm%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, volume) + if(data%problems%GaugesProblems%RotaryTorque%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, volume) + if(data%problems%GaugesProblems%StandPipePressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, volume) + if(data%problems%GaugesProblems%CasingPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, volume) + if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, volume) + if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, volume) + if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, volume) + if(data%problems%GaugesProblems%TripTank%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%TripTank, ChangeTripTank, volume) + if(data%problems%GaugesProblems%PitGainLoss%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, volume) + if(data%problems%GaugesProblems%MudTankVolume%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, volume) + if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, volume) + if(data%problems%GaugesProblems%TorqueLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, volume) + if(data%problems%GaugesProblems%PowerLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, volume) + if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, volume) + if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, volume) + if(data%problems%GaugesProblems%AnnularPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, volume) + if(data%problems%GaugesProblems%RigAirPressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, volume) + if(data%problems%GaugesProblems%StandPipe1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, volume) + if(data%problems%GaugesProblems%StandPipe2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, volume) + if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, volume) + if(data%problems%GaugesProblems%ChokePosition%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, volume) + if(data%problems%GaugesProblems%CasingPressure2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, volume) + end subroutine + + subroutine ProcessGaugesProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + if(data%problems%GaugesProblems%WeightIndicator%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%WeightIndicator, ChangeWeightIndicator, distance) + if(data%problems%GaugesProblems%RotaryRpm%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RotaryRpm, ChangeRotaryRpm, distance) + if(data%problems%GaugesProblems%RotaryTorque%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RotaryTorque, ChangeRotaryTorque, distance) + if(data%problems%GaugesProblems%StandPipePressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipePressure, ChangeStandPipePressure, distance) + if(data%problems%GaugesProblems%CasingPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%CasingPressure, ChangeCasingPressure, distance) + if(data%problems%GaugesProblems%Pump1Strokes%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%Pump1Strokes, ChangePump1Strokes, distance) + if(data%problems%GaugesProblems%Pump2Strokes%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%Pump2Strokes, ChangePump2Strokes, distance) + if(data%problems%GaugesProblems%ReturnLineTemperature%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ReturnLineTemperature, ChangeReturnLineTemperature, distance) + if(data%problems%GaugesProblems%TripTank%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%TripTank, ChangeTripTank, distance) + if(data%problems%GaugesProblems%PitGainLoss%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%PitGainLoss, ChangePitGainLoss, distance) + if(data%problems%GaugesProblems%MudTankVolume%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%MudTankVolume, ChangeMudTankVolume, distance) + if(data%problems%GaugesProblems%ReturnMudFlow%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ReturnMudFlow, ChangeReturnMudFlow, distance) + if(data%problems%GaugesProblems%TorqueLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%TorqueLimit, ChangeTorqueLimit, distance) + if(data%problems%GaugesProblems%PowerLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%PowerLimit, ChangePowerLimit, distance) + if(data%problems%GaugesProblems%AccumulatorPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%AccumulatorPressure, ChangeAccumulatorPressure, distance) + if(data%problems%GaugesProblems%ManifoldPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ManifoldPressure, ChangeManifoldPressure, distance) + if(data%problems%GaugesProblems%AnnularPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%AnnularPressure, ChangeAnnularPressure, distance) + if(data%problems%GaugesProblems%RigAirPressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%RigAirPressure, ChangeRigAirPressure, distance) + if(data%problems%GaugesProblems%StandPipe1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipe1, ChangeStandPipe1, distance) + if(data%problems%GaugesProblems%StandPipe2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%StandPipe2, ChangeStandPipe2, distance) + if(data%problems%GaugesProblems%DrillPipePressure%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%DrillPipePressure, ChangeDrillPipePressure, distance) + if(data%problems%GaugesProblems%ChokePosition%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%ChokePosition, ChangeChokePosition, distance) + if(data%problems%GaugesProblems%CasingPressure2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%GaugesProblems%CasingPressure2, ChangeCasingPressure2, distance) + end subroutine + + + + + + + + + + subroutine ChangeWeightIndicator(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(WeightIndicatorPtr)) call WeightIndicatorPtr(status) + if(status == Clear_StatusType) data%State%TD_General%WeightIndicatorMalf = 0 + if(status == Executed_StatusType) data%State%TD_General%WeightIndicatorMalf = 1 + endsubroutine + + subroutine ChangeRotaryRpm(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(RotaryRpmPtr)) call RotaryRpmPtr(status) + if(status == Clear_StatusType) data%State%RTable%RpmGaugeMalf = 0 + if(status == Executed_StatusType) data%State%RTable%RpmGaugeMalf = 1 + endsubroutine + + subroutine ChangeRotaryTorque(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(RotaryTorquePtr)) call RotaryTorquePtr(status) + if(status == Clear_StatusType) data%State%RTable%TorqueGaugeMalf = 0 + if(status == Executed_StatusType) data%State%RTable%TorqueGaugeMalf = 1 + endsubroutine + + subroutine ChangeStandPipePressure(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(StandPipePressurePtr)) call StandPipePressurePtr(status) + if(status == Clear_StatusType) data%State%MudSystem%StandPipePressure_DataDisplayMalf = 0 + if(status == Executed_StatusType) data%State%MudSystem%StandPipePressure_DataDisplayMalf = 1 + endsubroutine + + subroutine ChangeCasingPressure(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(CasingPressurePtr)) call CasingPressurePtr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%CasingPressure_DataDisplayMalF = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%CasingPressure_DataDisplayMalF = 1 + endsubroutine + + subroutine ChangePump1Strokes(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(Pump1StrokesPtr)) call Pump1StrokesPtr(status) + if(status == Clear_StatusType) data%State%Pump(1)%SPMGaugeMalf = 0 + if(status == Executed_StatusType) data%State%Pump(1)%SPMGaugeMalf = 1 + endsubroutine + + subroutine ChangePump2Strokes(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(Pump2StrokesPtr)) call Pump2StrokesPtr(status) + if(status == Clear_StatusType) data%State%Pump(2)%SPMGaugeMalf = 0 + if(status == Executed_StatusType) data%State%Pump(2)%SPMGaugeMalf = 1 + endsubroutine + + subroutine ChangeReturnLineTemperature(status) + implicit none + integer, intent (in) :: status + ! if(associated(ReturnLineTemperaturePtr)) call ReturnLineTemperaturePtr(status) + !if(status == Clear_StatusType) print*,'On_ReturnLineTemperature_Clear' + !if(status == Executed_StatusType) print*,'On_ReturnLineTemperature_Execute' + endsubroutine + + subroutine ChangeTripTank(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(TripTankPtr)) call TripTankPtr(status) + if(status == Clear_StatusType) data%State%MudSystem%TripTankPressure_DataDisplayMalf = 0 + if(status == Executed_StatusType) data%State%MudSystem%TripTankPressure_DataDisplayMalf = 1 + endsubroutine + + subroutine ChangePitGainLoss(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(PitGainLossPtr)) call PitGainLossPtr(status) + if(status == Clear_StatusType) data%State%MudSystem%PitGainLossGaugeMalf = 0 + if(status == Executed_StatusType) data%State%MudSystem%PitGainLossGaugeMalf = 1 + endsubroutine + + subroutine ChangeMudTankVolume(status) + implicit none + integer, intent (in) :: status + ! if(associated(MudTankVolumePtr)) call MudTankVolumePtr(status) + !if(status == Clear_StatusType) print*,'On_MudTankVolume_Clear' + !if(status == Executed_StatusType) print*,'On_MudTankVolume_Execute' + endsubroutine + + subroutine ChangeReturnMudFlow(status) + implicit none + integer, intent (in) :: status + ! if(associated(ReturnMudFlowPtr)) call ReturnMudFlowPtr(status) + !if(status == Clear_StatusType) print*,'On_ReturnMudFlow_Clear' + !if(status == Executed_StatusType) print*,'On_ReturnMudFlow_Execute' + endsubroutine + + subroutine ChangeTorqueLimit(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(TorqueLimitPtr)) call TorqueLimitPtr(status) + if(status == Clear_StatusType) data%State%RTable%TorqueLimitGaugeMalf = 0 + if(status == Executed_StatusType) data%State%RTable%TorqueLimitGaugeMalf = 1 + endsubroutine + + subroutine ChangePowerLimit(status) + implicit none + integer, intent (in) :: status + ! if(associated(PowerLimitPtr)) call PowerLimitPtr(status) + !if(status == Clear_StatusType) print*,'On_PowerLimit_Clear' + !if(status == Executed_StatusType) print*,'On_PowerLimit_Execute' + endsubroutine + + subroutine ChangeAccumulatorPressure(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(AccumulatorPressurePtr)) call AccumulatorPressurePtr(status) + if(status == Clear_StatusType) data%State%BopStackAcc%AccumulatorPressureGaugeMalf = 0 + if(status == Executed_StatusType) data%State%BopStackAcc%AccumulatorPressureGaugeMalf = 1 + endsubroutine + + subroutine ChangeManifoldPressure(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(ManifoldPressurePtr)) call ManifoldPressurePtr(status) + if(status == Clear_StatusType) data%State%BopStackAcc%ManifoldPressureGaugeMalf = 0 + if(status == Executed_StatusType) data%State%BopStackAcc%ManifoldPressureGaugeMalf = 1 + endsubroutine + + subroutine ChangeAnnularPressure(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(AnnularPressurePtr)) call AnnularPressurePtr(status) + if(status == Clear_StatusType) data%State%Annular%AnnularPressureGaugeMalf = 0 + if(status == Executed_StatusType) data%State%Annular%AnnularPressureGaugeMalf = 1 + endsubroutine + + subroutine ChangeRigAirPressure(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + ! if(associated(RigAirPressurePtr)) call RigAirPressurePtr(status) + if(status == Clear_StatusType) data%State%BopStackAcc%AirSupplyPressureGaugeMalf = 0 + if(status == Executed_StatusType) data%State%BopStackAcc%AirSupplyPressureGaugeMalf = 1 + endsubroutine + + subroutine ChangeStandPipe1(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(StandPipe1Ptr)) call StandPipe1Ptr(status) + if(status == Clear_StatusType) data%State%MudSystem%StandPipeGauge1Malf = 0 + if(status == Executed_StatusType) data%State%MudSystem%StandPipeGauge1Malf = 1 + endsubroutine + + subroutine ChangeStandPipe2(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(StandPipe2Ptr)) call StandPipe2Ptr(status) + if(status == Clear_StatusType) data%State%MudSystem%StandPipeGauge2Malf = 0 + if(status == Executed_StatusType) data%State%MudSystem%StandPipeGauge2Malf = 1 + endsubroutine + + subroutine ChangeDrillPipePressure(status) + USE MudSystemVARIABLES +use SimulationVariables !@@@ + implicit none + integer, intent (in) :: status + ! if(associated(DrillPipePressurePtr)) call DrillPipePressurePtr(status) + if(status == Clear_StatusType) data%State%MudSystem%DrillPipePressureMalf = 0 + if(status == Executed_StatusType) data%State%MudSystem%DrillPipePressureMalf = 1 + endsubroutine + + subroutine ChangeChokePosition(status) + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(ChokePositionPtr)) call ChokePositionPtr(status) + if(status == Clear_StatusType) data%State%Choke%GaugeChokePositionMailf = 0 + if(status == Executed_StatusType) data%State%Choke%GaugeChokePositionMailf = 1 + endsubroutine + + subroutine ChangeCasingPressure2(status) + USE FricPressDropVarsModule + implicit none + integer, intent (in) :: status + ! if(associated(CasingPressure2Ptr)) call CasingPressure2Ptr(status) + if(status == Clear_StatusType) data%State%FricPressDrop%CasingPressure_ChokeMalF = 0 + if(status == Executed_StatusType) data%State%FricPressDrop%CasingPressure_ChokeMalF = 1 + endsubroutine + end module CGaugesProblems \ No newline at end of file diff --git a/CSharp/Problems/CGaugesProblemsVariables.f90 b/CSharp/Problems/CGaugesProblemsVariables.f90 index 643b6c7..eb5c2d9 100644 --- a/CSharp/Problems/CGaugesProblemsVariables.f90 +++ b/CSharp/Problems/CGaugesProblemsVariables.f90 @@ -1,33 +1,33 @@ -module CGaugesProblemsVariables - use CProblemDifinition - implicit none - public - type :: GaugesProblemsType - type(CProblem) :: WeightIndicator - type(CProblem) :: RotaryRpm - type(CProblem) :: RotaryTorque - type(CProblem) :: StandPipePressure - type(CProblem) :: CasingPressure - type(CProblem) :: Pump1Strokes - type(CProblem) :: Pump2Strokes - type(CProblem) :: ReturnLineTemperature - type(CProblem) :: TripTank - type(CProblem) :: PitGainLoss - type(CProblem) :: MudTankVolume - type(CProblem) :: ReturnMudFlow - type(CProblem) :: TorqueLimit - type(CProblem) :: PowerLimit - type(CProblem) :: AccumulatorPressure - type(CProblem) :: ManifoldPressure - type(CProblem) :: AnnularPressure - type(CProblem) :: RigAirPressure - type(CProblem) :: StandPipe1 - type(CProblem) :: StandPipe2 - type(CProblem) :: DrillPipePressure - type(CProblem) :: ChokePosition - type(CProblem) :: CasingPressure2 - end type GaugesProblemsType - - contains - +module CGaugesProblemsVariables + use CProblemDifinition + implicit none + public + type :: GaugesProblemsType + type(CProblem) :: WeightIndicator + type(CProblem) :: RotaryRpm + type(CProblem) :: RotaryTorque + type(CProblem) :: StandPipePressure + type(CProblem) :: CasingPressure + type(CProblem) :: Pump1Strokes + type(CProblem) :: Pump2Strokes + type(CProblem) :: ReturnLineTemperature + type(CProblem) :: TripTank + type(CProblem) :: PitGainLoss + type(CProblem) :: MudTankVolume + type(CProblem) :: ReturnMudFlow + type(CProblem) :: TorqueLimit + type(CProblem) :: PowerLimit + type(CProblem) :: AccumulatorPressure + type(CProblem) :: ManifoldPressure + type(CProblem) :: AnnularPressure + type(CProblem) :: RigAirPressure + type(CProblem) :: StandPipe1 + type(CProblem) :: StandPipe2 + type(CProblem) :: DrillPipePressure + type(CProblem) :: ChokePosition + type(CProblem) :: CasingPressure2 + end type GaugesProblemsType + + contains + end module CGaugesProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CHoistingProblems.f90 b/CSharp/Problems/CHoistingProblems.f90 index f602414..23dcadc 100644 --- a/CSharp/Problems/CHoistingProblems.f90 +++ b/CSharp/Problems/CHoistingProblems.f90 @@ -1,71 +1,88 @@ -module CHoistingProblems - use SimulationVariables - implicit none - public - contains - - subroutine ProcessHoistingProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%HoistingProblems%MotorFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, time) - if(data%problems%HoistingProblems%ClutchEngage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, time) - if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, time) - end subroutine - - subroutine ProcessHoistingProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - if(data%problems%HoistingProblems%MotorFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, strokes) - if(data%problems%HoistingProblems%ClutchEngage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, strokes) - if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, strokes) - end subroutine - - subroutine ProcessHoistingProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - if(data%problems%HoistingProblems%MotorFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, volume) - if(data%problems%HoistingProblems%ClutchEngage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, volume) - if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, volume) - end subroutine - - subroutine ProcessHoistingProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - if(data%problems%HoistingProblems%MotorFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, distance) - if(data%problems%HoistingProblems%ClutchEngage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, distance) - if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, distance) - end subroutine - - - - - - - subroutine ChangeMotorFail(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(MotorFailPtr)) call MotorFailPtr(status) - if(status == Clear_StatusType) data%State%Drawworks%MotorFaileMalf=0 - if(status == Executed_StatusType) data%State%Drawworks%MotorFaileMalf=1 - endsubroutine - - subroutine ChangeClutchEngage(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(ClutchEngagePtr)) call ClutchEngagePtr(status) - if(status == Clear_StatusType) data%State%Drawworks%ClutchEngageMalf=0 - if(status == Executed_StatusType) data%State%Drawworks%ClutchEngageMalf=1 - endsubroutine - - subroutine ChangeClutchDisengage(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - ! if(associated(ClutchDisengagePtr)) call ClutchDisengagePtr(status) - if(status == Clear_StatusType) data%State%Drawworks%ClutchDisengageMalf=0 - if(status == Executed_StatusType) data%State%Drawworks%ClutchDisengageMalf=1 - endsubroutine - +module CHoistingProblems + use SimulationVariables + implicit none + public + contains + subroutine HoistingProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'HoistingProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"MotorFail",data%problems%HoistingProblems%MotorFail) + call ProblemToJson(p,"ClutchEngage",data%problems%HoistingProblems%ClutchEngage) + call ProblemToJson(p,"ClutchDisengage",data%problems%HoistingProblems%ClutchDisengage) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessHoistingProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%HoistingProblems%MotorFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, time) + if(data%problems%HoistingProblems%ClutchEngage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, time) + if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, time) + end subroutine + + subroutine ProcessHoistingProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + if(data%problems%HoistingProblems%MotorFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, strokes) + if(data%problems%HoistingProblems%ClutchEngage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, strokes) + if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, strokes) + end subroutine + + subroutine ProcessHoistingProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + if(data%problems%HoistingProblems%MotorFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, volume) + if(data%problems%HoistingProblems%ClutchEngage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, volume) + if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, volume) + end subroutine + + subroutine ProcessHoistingProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + if(data%problems%HoistingProblems%MotorFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%MotorFail, ChangeMotorFail, distance) + if(data%problems%HoistingProblems%ClutchEngage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchEngage, ChangeClutchEngage, distance) + if(data%problems%HoistingProblems%ClutchDisengage%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%HoistingProblems%ClutchDisengage, ChangeClutchDisengage, distance) + end subroutine + + + + + + + subroutine ChangeMotorFail(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(MotorFailPtr)) call MotorFailPtr(status) + if(status == Clear_StatusType) data%State%Drawworks%MotorFaileMalf=0 + if(status == Executed_StatusType) data%State%Drawworks%MotorFaileMalf=1 + endsubroutine + + subroutine ChangeClutchEngage(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(ClutchEngagePtr)) call ClutchEngagePtr(status) + if(status == Clear_StatusType) data%State%Drawworks%ClutchEngageMalf=0 + if(status == Executed_StatusType) data%State%Drawworks%ClutchEngageMalf=1 + endsubroutine + + subroutine ChangeClutchDisengage(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + ! if(associated(ClutchDisengagePtr)) call ClutchDisengagePtr(status) + if(status == Clear_StatusType) data%State%Drawworks%ClutchDisengageMalf=0 + if(status == Executed_StatusType) data%State%Drawworks%ClutchDisengageMalf=1 + endsubroutine + end module CHoistingProblems \ No newline at end of file diff --git a/CSharp/Problems/CHoistingProblemsVariables.f90 b/CSharp/Problems/CHoistingProblemsVariables.f90 index 1057ada..14e76be 100644 --- a/CSharp/Problems/CHoistingProblemsVariables.f90 +++ b/CSharp/Problems/CHoistingProblemsVariables.f90 @@ -1,17 +1,17 @@ -module CHoistingProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type :: HoistingProblemsType - type(CProblem) :: MotorFail - type(CProblem) :: ClutchEngage - type(CProblem) :: ClutchDisengage - end type HoistingProblemsType - - - contains - - +module CHoistingProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type :: HoistingProblemsType + type(CProblem) :: MotorFail + type(CProblem) :: ClutchEngage + type(CProblem) :: ClutchDisengage + end type HoistingProblemsType + + + contains + + end module CHoistingProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CKickProblems.f90 b/CSharp/Problems/CKickProblems.f90 index 350dfba..f6768cd 100644 --- a/CSharp/Problems/CKickProblems.f90 +++ b/CSharp/Problems/CKickProblems.f90 @@ -1,54 +1,73 @@ -module CKickProblems - use SimulationVariables - implicit none - public - !constants - integer :: Gas_FluidType = 0 - integer :: Oil_FluidType = 1 - integer :: Water_FluidType = 2 - - contains - - - subroutine ProcessKickProblemsDueTime(time) - implicit none - integer :: time - - if(data%problems%KickProblems%Kick%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%KickProblems%Kick, ChangeKick, time) - - end subroutine - - subroutine ProcessKickProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%KickProblems%Kick%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%KickProblems%Kick, ChangeKick, strokes) - - end subroutine - - subroutine ProcessKickProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%KickProblems%Kick%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%KickProblems%Kick, ChangeKick, volume) - - end subroutine - - subroutine ProcessKickProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%KickProblems%Kick%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%KickProblems%Kick, ChangeKick, distance) - - end subroutine - - subroutine ChangeKick(status) - implicit none - integer, intent (in) :: status - ! if(associated(data%problems%KickProblems%KickPtr)) call data%problems%KickProblems%KickPtr(status) - !if(status == Clear_StatusType) print*,'On_Kick_Clear' - !if(status == Executed_StatusType) print*,'On_Kick_Execute' - endsubroutine - - +module CKickProblems + use SimulationVariables + implicit none + public + !constants + ! integer :: Gas_FluidType = 0 + ! integer :: Oil_FluidType = 1 + ! integer :: Water_FluidType = 2 + + contains + subroutine KickProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'KickProblems') + + call ProblemToJson(p,"Kick",data%problems%KickProblems%Kick) + call json%add(p,"FluidType",data%problems%KickProblems%FluidType) + call json%add(p,"FlowRate",data%problems%KickProblems%FlowRate) + call json%add(p,"OverBalancePressure",data%problems%KickProblems%OverBalancePressure) + call json%add(p,"IsAutoMigrationRateSelected",data%problems%KickProblems%IsAutoMigrationRateSelected) + call json%add(p,"AutoMigrationRate",data%problems%KickProblems%AutoMigrationRate) ! 2. add member of data type to new node + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + + subroutine ProcessKickProblemsDueTime(time) + implicit none + integer :: time + + if(data%problems%KickProblems%Kick%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%KickProblems%Kick, ChangeKick, time) + + end subroutine + + subroutine ProcessKickProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%KickProblems%Kick%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%KickProblems%Kick, ChangeKick, strokes) + + end subroutine + + subroutine ProcessKickProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%KickProblems%Kick%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%KickProblems%Kick, ChangeKick, volume) + + end subroutine + + subroutine ProcessKickProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%KickProblems%Kick%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%KickProblems%Kick, ChangeKick, distance) + + end subroutine + + subroutine ChangeKick(status) + implicit none + integer, intent (in) :: status + ! if(associated(data%problems%KickProblems%KickPtr)) call data%problems%KickProblems%KickPtr(status) + !if(status == Clear_StatusType) print*,'On_Kick_Clear' + !if(status == Executed_StatusType) print*,'On_Kick_Execute' + endsubroutine + + end module CKickProblems \ No newline at end of file diff --git a/CSharp/Problems/CKickProblemsVariables.f90 b/CSharp/Problems/CKickProblemsVariables.f90 index 495c62e..9d70c54 100644 --- a/CSharp/Problems/CKickProblemsVariables.f90 +++ b/CSharp/Problems/CKickProblemsVariables.f90 @@ -1,18 +1,18 @@ -module CKickProblemsVariables - use CProblemDifinition - implicit none - public - - - - ! Input vars - type :: KickProblemsType - type(CProblem) :: Kick - integer :: FluidType - integer :: FlowRate - integer :: OverBalancePressure - logical :: IsAutoMigrationRateSelected - real(8) :: AutoMigrationRate - end type KickProblemsType - +module CKickProblemsVariables + use CProblemDifinition + implicit none + public + + + + ! Input vars + type :: KickProblemsType + type(CProblem) :: Kick + integer :: FluidType + integer :: FlowRate + integer :: OverBalancePressure + logical :: IsAutoMigrationRateSelected + real(8) :: AutoMigrationRate + end type KickProblemsType + end module CKickProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CLostProblems.f90 b/CSharp/Problems/CLostProblems.f90 index bdc53f7..6a155e4 100644 --- a/CSharp/Problems/CLostProblems.f90 +++ b/CSharp/Problems/CLostProblems.f90 @@ -1,48 +1,65 @@ -module CLostProblems - use SimulationVariables - implicit none - public - contains - subroutine ProcessLostProblemsDueTime(time) - implicit none - integer :: time - if(data%problems%LostProblems%LostCirculation%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, time) - end subroutine - - subroutine ProcessLostProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%LostProblems%LostCirculation%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, strokes) - - end subroutine - - subroutine ProcessLostProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%LostProblems%LostCirculation%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, volume) - - end subroutine - - subroutine ProcessLostProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%LostProblems%LostCirculation%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, distance) - - end subroutine - - - - - subroutine ChangeLostCirculation(status) - implicit none - integer, intent (in) :: status - ! if(associated(LostCirculationPtr)) call LostCirculationPtr(status) - !if(status == Clear_StatusType) print*,'On_LostCirculation_Clear' - !if(status == Executed_StatusType) print*,'On_LostCirculation_Execute' - endsubroutine - - +module CLostProblems + use SimulationVariables + implicit none + public + contains + subroutine LostProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'Configuration') + + ! 2. add member of data type to new node + call ProblemToJson(p,"LostCirculation",data%problems%LostProblems%LostCirculation) + call json%add(p,"FlowRate",data%problems%LostProblems%FlowRate) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessLostProblemsDueTime(time) + implicit none + integer :: time + if(data%problems%LostProblems%LostCirculation%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, time) + end subroutine + + subroutine ProcessLostProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%LostProblems%LostCirculation%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, strokes) + + end subroutine + + subroutine ProcessLostProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%LostProblems%LostCirculation%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, volume) + + end subroutine + + subroutine ProcessLostProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%LostProblems%LostCirculation%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%LostProblems%LostCirculation, ChangeLostCirculation, distance) + + end subroutine + + + + + subroutine ChangeLostCirculation(status) + implicit none + integer, intent (in) :: status + ! if(associated(LostCirculationPtr)) call LostCirculationPtr(status) + !if(status == Clear_StatusType) print*,'On_LostCirculation_Clear' + !if(status == Executed_StatusType) print*,'On_LostCirculation_Execute' + endsubroutine + + end module CLostProblems \ No newline at end of file diff --git a/CSharp/Problems/CLostProblemsVariables.f90 b/CSharp/Problems/CLostProblemsVariables.f90 index 88dd41a..e023371 100644 --- a/CSharp/Problems/CLostProblemsVariables.f90 +++ b/CSharp/Problems/CLostProblemsVariables.f90 @@ -1,17 +1,17 @@ -module CLostProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type::LostProblemsType - type(CProblem) :: LostCirculation - real(8) :: FlowRate - end type LostProblemsType - - ! procedure (ActionInteger), pointer :: LostCirculationPtr - - contains - - +module CLostProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type::LostProblemsType + type(CProblem) :: LostCirculation + real(8) :: FlowRate + end type LostProblemsType + + ! procedure (ActionInteger), pointer :: LostCirculationPtr + + contains + + end module CLostProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CMudTreatmentProblems.f90 b/CSharp/Problems/CMudTreatmentProblems.f90 index 2b4caa4..dfe85a0 100644 --- a/CSharp/Problems/CMudTreatmentProblems.f90 +++ b/CSharp/Problems/CMudTreatmentProblems.f90 @@ -1,91 +1,108 @@ -module CMudTreatmentProblems - use SimulationVariables - implicit none - public - contains - - subroutine ProcessMudTreatmentProblemsDueTime(time) - implicit none - integer :: time - - if(data%problems%MudTreatmentProblems%Degasser%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, time) - if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, time) - if(data%problems%MudTreatmentProblems%Desander%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Desander, ChangeDesander, time) - if(data%problems%MudTreatmentProblems%Desilter%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, time) - - end subroutine - - - subroutine ProcessMudTreatmentProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%MudTreatmentProblems%Degasser%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, strokes) - if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, strokes) - if(data%problems%MudTreatmentProblems%Desander%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Desander, ChangeDesander, strokes) - if(data%problems%MudTreatmentProblems%Desilter%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, strokes) - - end subroutine - - - subroutine ProcessMudTreatmentProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%MudTreatmentProblems%Degasser%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, volume) - if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, volume) - if(data%problems%MudTreatmentProblems%Desander%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Desander, ChangeDesander, volume) - if(data%problems%MudTreatmentProblems%Desilter%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, volume) - - end subroutine - - subroutine ProcessMudTreatmentProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%MudTreatmentProblems%Degasser%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, distance) - if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, distance) - if(data%problems%MudTreatmentProblems%Desander%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Desander, ChangeDesander, distance) - if(data%problems%MudTreatmentProblems%Desilter%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, distance) - - end subroutine - - - - - - - - subroutine ChangeDegasser(status) - implicit none - integer, intent (in) :: status - !if(associated(DegasserPtr)) call DegasserPtr(status) - !if(status == Clear_StatusType) print*,'On_Degasser_Clear' - !if(status == Executed_StatusType) print*,'On_Degasser_Execute' - endsubroutine - - subroutine ChangeShaleShaker(status) - implicit none - integer, intent (in) :: status - !if(associated(ShaleShakerPtr)) call ShaleShakerPtr(status) - !if(status == Clear_StatusType) print*,'On_ShaleShaker_Clear' - !if(status == Executed_StatusType) print*,'On_ShaleShaker_Execute' - endsubroutine - - subroutine ChangeDesander(status) - implicit none - integer, intent (in) :: status - !if(associated(DesanderPtr)) call DesanderPtr(status) - !if(status == Clear_StatusType) print*,'On_Desander_Clear' - !if(status == Executed_StatusType) print*,'On_Desander_Execute' - endsubroutine - - subroutine ChangeDesilter(status) - implicit none - integer, intent (in) :: status - !if(associated(DesilterPtr)) call DesilterPtr(status) - !if(status == Clear_StatusType) print*,'On_Desilter_Clear' - !if(status == Executed_StatusType) print*,'On_Desilter_Execute' - endsubroutine - +module CMudTreatmentProblems + use SimulationVariables + implicit none + public + contains + subroutine MudTreatmentProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'MudTreatmentProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"Degasser",data%problems%MudTreatmentProblems%Degasser) + call ProblemToJson(p,"ShaleShaker",data%problems%MudTreatmentProblems%ShaleShaker) + call ProblemToJson(p,"Desander",data%problems%MudTreatmentProblems%Desander) + call ProblemToJson(p,"Desilter",data%problems%MudTreatmentProblems%Desilter) + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessMudTreatmentProblemsDueTime(time) + implicit none + integer :: time + + if(data%problems%MudTreatmentProblems%Degasser%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, time) + if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, time) + if(data%problems%MudTreatmentProblems%Desander%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Desander, ChangeDesander, time) + if(data%problems%MudTreatmentProblems%Desilter%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, time) + + end subroutine + + + subroutine ProcessMudTreatmentProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%MudTreatmentProblems%Degasser%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, strokes) + if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, strokes) + if(data%problems%MudTreatmentProblems%Desander%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Desander, ChangeDesander, strokes) + if(data%problems%MudTreatmentProblems%Desilter%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, strokes) + + end subroutine + + + subroutine ProcessMudTreatmentProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%MudTreatmentProblems%Degasser%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, volume) + if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, volume) + if(data%problems%MudTreatmentProblems%Desander%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Desander, ChangeDesander, volume) + if(data%problems%MudTreatmentProblems%Desilter%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, volume) + + end subroutine + + subroutine ProcessMudTreatmentProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%MudTreatmentProblems%Degasser%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Degasser, ChangeDegasser, distance) + if(data%problems%MudTreatmentProblems%ShaleShaker%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%ShaleShaker, ChangeShaleShaker, distance) + if(data%problems%MudTreatmentProblems%Desander%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Desander, ChangeDesander, distance) + if(data%problems%MudTreatmentProblems%Desilter%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%MudTreatmentProblems%Desilter, ChangeDesilter, distance) + + end subroutine + + + + + + + + subroutine ChangeDegasser(status) + implicit none + integer, intent (in) :: status + !if(associated(DegasserPtr)) call DegasserPtr(status) + !if(status == Clear_StatusType) print*,'On_Degasser_Clear' + !if(status == Executed_StatusType) print*,'On_Degasser_Execute' + endsubroutine + + subroutine ChangeShaleShaker(status) + implicit none + integer, intent (in) :: status + !if(associated(ShaleShakerPtr)) call ShaleShakerPtr(status) + !if(status == Clear_StatusType) print*,'On_ShaleShaker_Clear' + !if(status == Executed_StatusType) print*,'On_ShaleShaker_Execute' + endsubroutine + + subroutine ChangeDesander(status) + implicit none + integer, intent (in) :: status + !if(associated(DesanderPtr)) call DesanderPtr(status) + !if(status == Clear_StatusType) print*,'On_Desander_Clear' + !if(status == Executed_StatusType) print*,'On_Desander_Execute' + endsubroutine + + subroutine ChangeDesilter(status) + implicit none + integer, intent (in) :: status + !if(associated(DesilterPtr)) call DesilterPtr(status) + !if(status == Clear_StatusType) print*,'On_Desilter_Clear' + !if(status == Executed_StatusType) print*,'On_Desilter_Execute' + endsubroutine + end module CMudTreatmentProblems \ No newline at end of file diff --git a/CSharp/Problems/CMudTreatmentProblemsVariables.f90 b/CSharp/Problems/CMudTreatmentProblemsVariables.f90 index daa4fd6..99b9e0b 100644 --- a/CSharp/Problems/CMudTreatmentProblemsVariables.f90 +++ b/CSharp/Problems/CMudTreatmentProblemsVariables.f90 @@ -1,17 +1,17 @@ -module CMudTreatmentProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - Type::MudTreatmentProblemsType - type(CProblem) :: Degasser - type(CProblem) :: ShaleShaker - type(CProblem) :: Desander - type(CProblem) :: Desilter - end type MudTreatmentProblemsType - - contains - - +module CMudTreatmentProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + Type::MudTreatmentProblemsType + type(CProblem) :: Degasser + type(CProblem) :: ShaleShaker + type(CProblem) :: Desander + type(CProblem) :: Desilter + end type MudTreatmentProblemsType + + contains + + end module CMudTreatmentProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/COtherProblems.f90 b/CSharp/Problems/COtherProblems.f90 index 70e5f66..a762c9e 100644 --- a/CSharp/Problems/COtherProblems.f90 +++ b/CSharp/Problems/COtherProblems.f90 @@ -1,169 +1,195 @@ -module COtherProblems - use COtherProblemsVariables - implicit none - public - contains - subroutine ProcessOtherProblemsDueTime(time) - implicit none - integer :: time - - if(data%problems%OtherProblems%RigAlarm%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, time) - if(data%problems%OtherProblems%RigWaterSupply%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, time) - if(data%problems%OtherProblems%RigAir%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigAir, ChangeRigAir, time) - if(data%problems%OtherProblems%Gen1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen1, ChangeGen1, time) - if(data%problems%OtherProblems%Gen2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen2, ChangeGen2, time) - if(data%problems%OtherProblems%Gen3%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen3, ChangeGen3, time) - if(data%problems%OtherProblems%Gen4%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen4, ChangeGen4, time) - if(data%problems%OtherProblems%Scr1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr1, ChangeScr1, time) - if(data%problems%OtherProblems%Scr2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr2, ChangeScr2, time) - if(data%problems%OtherProblems%Scr3%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr3, ChangeScr3, time) - if(data%problems%OtherProblems%Scr4%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr4, ChangeScr4, time) - - end subroutine - - subroutine ProcessOtherProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%OtherProblems%RigAlarm%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, strokes) - if(data%problems%OtherProblems%RigWaterSupply%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, strokes) - if(data%problems%OtherProblems%RigAir%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigAir, ChangeRigAir, strokes) - if(data%problems%OtherProblems%Gen1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen1, ChangeGen1, strokes) - if(data%problems%OtherProblems%Gen2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen2, ChangeGen2, strokes) - if(data%problems%OtherProblems%Gen3%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen3, ChangeGen3, strokes) - if(data%problems%OtherProblems%Gen4%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen4, ChangeGen4, strokes) - if(data%problems%OtherProblems%Scr1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr1, ChangeScr1, strokes) - if(data%problems%OtherProblems%Scr2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr2, ChangeScr2, strokes) - if(data%problems%OtherProblems%Scr3%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr3, ChangeScr3, strokes) - if(data%problems%OtherProblems%Scr4%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr4, ChangeScr4, strokes) - - end subroutine - - subroutine ProcessOtherProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%OtherProblems%RigAlarm%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, volume) - if(data%problems%OtherProblems%RigWaterSupply%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, volume) - if(data%problems%OtherProblems%RigAir%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigAir, ChangeRigAir, volume) - if(data%problems%OtherProblems%Gen1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen1, ChangeGen1, volume) - if(data%problems%OtherProblems%Gen2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen2, ChangeGen2, volume) - if(data%problems%OtherProblems%Gen3%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen3, ChangeGen3, volume) - if(data%problems%OtherProblems%Gen4%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen4, ChangeGen4, volume) - if(data%problems%OtherProblems%Scr1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr1, ChangeScr1, volume) - if(data%problems%OtherProblems%Scr2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr2, ChangeScr2, volume) - if(data%problems%OtherProblems%Scr3%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr3, ChangeScr3, volume) - if(data%problems%OtherProblems%Scr4%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr4, ChangeScr4, volume) - - end subroutine - - subroutine ProcessOtherProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%OtherProblems%RigAlarm%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, distance) - if(data%problems%OtherProblems%RigWaterSupply%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, distance) - if(data%problems%OtherProblems%RigAir%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigAir, ChangeRigAir, distance) - if(data%problems%OtherProblems%Gen1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen1, ChangeGen1, distance) - if(data%problems%OtherProblems%Gen2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen2, ChangeGen2, distance) - if(data%problems%OtherProblems%Gen3%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen3, ChangeGen3, distance) - if(data%problems%OtherProblems%Gen4%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen4, ChangeGen4, distance) - if(data%problems%OtherProblems%Scr1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr1, ChangeScr1, distance) - if(data%problems%OtherProblems%Scr2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr2, ChangeScr2, distance) - if(data%problems%OtherProblems%Scr3%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr3, ChangeScr3, distance) - if(data%problems%OtherProblems%Scr4%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr4, ChangeScr4, distance) - - end subroutine - - - subroutine ChangeRigAlarm(status) - implicit none - integer, intent (in) :: status - !if(associated(RigAlarmPtr)) call RigAlarmPtr(status) - !if(status == Clear_StatusType) print*,'On_RigAlarm_Clear' - !if(status == Executed_StatusType) print*,'On_RigAlarm_Execute' - endsubroutine - - subroutine ChangeRigWaterSupply(status) - implicit none - integer, intent (in) :: status - !if(associated(RigWaterSupplyPtr)) call RigWaterSupplyPtr(status) - !if(status == Clear_StatusType) print*,'On_RigWaterSupply_Clear' - !if(status == Executed_StatusType) print*,'On_RigWaterSupply_Execute' - endsubroutine - - subroutine ChangeRigAir(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(RigAirPtr)) call RigAirPtr(status) - if(status == Clear_StatusType) data%State%BopStackAcc%RigAirMalf = 0 - if(status == Executed_StatusType) data%State%BopStackAcc%RigAirMalf = 1 - endsubroutine - - subroutine ChangeGen1(status) - implicit none - integer, intent (in) :: status - !if(associated(Gen1Ptr)) call Gen1Ptr(status) - !if(status == Clear_StatusType) print*,'On_Gen1_Clear' - !if(status == Executed_StatusType) print*,'On_Gen1_Execute' - endsubroutine - - subroutine ChangeGen2(status) - implicit none - integer, intent (in) :: status - !if(associated(Gen2Ptr)) call Gen2Ptr(status) - !if(status == Clear_StatusType) print*,'On_Gen2_Clear' - !if(status == Executed_StatusType) print*,'On_Gen2_Execute' - endsubroutine - - subroutine ChangeGen3(status) - implicit none - integer, intent (in) :: status - !if(associated(Gen3Ptr)) call Gen3Ptr(status) - !if(status == Clear_StatusType) print*,'On_Gen3_Clear' - !if(status == Executed_StatusType) print*,'On_Gen3_Execute' - endsubroutine - - subroutine ChangeGen4(status) - implicit none - integer, intent (in) :: status - !if(associated(Gen4Ptr)) call Gen4Ptr(status) - !if(status == Clear_StatusType) print*,'On_Gen4_Clear' - !if(status == Executed_StatusType) print*,'On_Gen4_Execute' - endsubroutine - - subroutine ChangeScr1(status) - implicit none - integer, intent (in) :: status - !if(associated(Scr1Ptr)) call Scr1Ptr(status) - !if(status == Clear_StatusType) print*,'On_Scr1_Clear' - !if(status == Executed_StatusType) print*,'On_Scr1_Execute' - endsubroutine - - subroutine ChangeScr2(status) - implicit none - integer, intent (in) :: status - !if(associated(Scr2Ptr)) call Scr2Ptr(status) - !if(status == Clear_StatusType) print*,'On_Scr2_Clear' - !if(status == Executed_StatusType) print*,'On_Scr2_Execute' - endsubroutine - - subroutine ChangeScr3(status) - implicit none - integer, intent (in) :: status - !if(associated(Scr3Ptr)) call Scr3Ptr(status) - !if(status == Clear_StatusType) print*,'On_Scr3_Clear' - !if(status == Executed_StatusType) print*,'On_Scr3_Execute' - endsubroutine - - subroutine ChangeScr4(status) - implicit none - integer, intent (in) :: status - !if(associated(Scr4Ptr)) call Scr4Ptr(status) - !if(status == Clear_StatusType) print*,'On_Scr4_Clear' - !if(status == Executed_StatusType) print*,'On_Scr4_Execute' - endsubroutine - - +module COtherProblems + use SimulationVariables + implicit none + public + contains + subroutine OtherProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'OtherProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"RigAlarm",data%problems%OtherProblems%RigAlarm) + call ProblemToJson(p,"RigWaterSupply",data%problems%OtherProblems%RigWaterSupply) + call ProblemToJson(p,"RigAir",data%problems%OtherProblems%RigAir) + call ProblemToJson(p,"Gen1",data%problems%OtherProblems%Gen1) + call ProblemToJson(p,"Gen2",data%problems%OtherProblems%Gen2) + call ProblemToJson(p,"Gen3",data%problems%OtherProblems%Gen3) + call ProblemToJson(p,"Gen4",data%problems%OtherProblems%Gen4) + call ProblemToJson(p,"Scr1",data%problems%OtherProblems%Scr1) + call ProblemToJson(p,"Scr2",data%problems%OtherProblems%Scr2) + call ProblemToJson(p,"Scr3",data%problems%OtherProblems%Scr3) + call ProblemToJson(p,"Scr4",data%problems%OtherProblems%Scr4) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessOtherProblemsDueTime(time) + implicit none + integer :: time + + if(data%problems%OtherProblems%RigAlarm%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, time) + if(data%problems%OtherProblems%RigWaterSupply%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, time) + if(data%problems%OtherProblems%RigAir%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%RigAir, ChangeRigAir, time) + if(data%problems%OtherProblems%Gen1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen1, ChangeGen1, time) + if(data%problems%OtherProblems%Gen2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen2, ChangeGen2, time) + if(data%problems%OtherProblems%Gen3%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen3, ChangeGen3, time) + if(data%problems%OtherProblems%Gen4%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Gen4, ChangeGen4, time) + if(data%problems%OtherProblems%Scr1%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr1, ChangeScr1, time) + if(data%problems%OtherProblems%Scr2%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr2, ChangeScr2, time) + if(data%problems%OtherProblems%Scr3%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr3, ChangeScr3, time) + if(data%problems%OtherProblems%Scr4%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%OtherProblems%Scr4, ChangeScr4, time) + + end subroutine + + subroutine ProcessOtherProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%OtherProblems%RigAlarm%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, strokes) + if(data%problems%OtherProblems%RigWaterSupply%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, strokes) + if(data%problems%OtherProblems%RigAir%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%RigAir, ChangeRigAir, strokes) + if(data%problems%OtherProblems%Gen1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen1, ChangeGen1, strokes) + if(data%problems%OtherProblems%Gen2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen2, ChangeGen2, strokes) + if(data%problems%OtherProblems%Gen3%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen3, ChangeGen3, strokes) + if(data%problems%OtherProblems%Gen4%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Gen4, ChangeGen4, strokes) + if(data%problems%OtherProblems%Scr1%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr1, ChangeScr1, strokes) + if(data%problems%OtherProblems%Scr2%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr2, ChangeScr2, strokes) + if(data%problems%OtherProblems%Scr3%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr3, ChangeScr3, strokes) + if(data%problems%OtherProblems%Scr4%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%OtherProblems%Scr4, ChangeScr4, strokes) + + end subroutine + + subroutine ProcessOtherProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%OtherProblems%RigAlarm%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, volume) + if(data%problems%OtherProblems%RigWaterSupply%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, volume) + if(data%problems%OtherProblems%RigAir%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%RigAir, ChangeRigAir, volume) + if(data%problems%OtherProblems%Gen1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen1, ChangeGen1, volume) + if(data%problems%OtherProblems%Gen2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen2, ChangeGen2, volume) + if(data%problems%OtherProblems%Gen3%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen3, ChangeGen3, volume) + if(data%problems%OtherProblems%Gen4%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Gen4, ChangeGen4, volume) + if(data%problems%OtherProblems%Scr1%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr1, ChangeScr1, volume) + if(data%problems%OtherProblems%Scr2%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr2, ChangeScr2, volume) + if(data%problems%OtherProblems%Scr3%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr3, ChangeScr3, volume) + if(data%problems%OtherProblems%Scr4%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%OtherProblems%Scr4, ChangeScr4, volume) + + end subroutine + + subroutine ProcessOtherProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%OtherProblems%RigAlarm%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigAlarm, ChangeRigAlarm, distance) + if(data%problems%OtherProblems%RigWaterSupply%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigWaterSupply, ChangeRigWaterSupply, distance) + if(data%problems%OtherProblems%RigAir%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%RigAir, ChangeRigAir, distance) + if(data%problems%OtherProblems%Gen1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen1, ChangeGen1, distance) + if(data%problems%OtherProblems%Gen2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen2, ChangeGen2, distance) + if(data%problems%OtherProblems%Gen3%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen3, ChangeGen3, distance) + if(data%problems%OtherProblems%Gen4%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Gen4, ChangeGen4, distance) + if(data%problems%OtherProblems%Scr1%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr1, ChangeScr1, distance) + if(data%problems%OtherProblems%Scr2%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr2, ChangeScr2, distance) + if(data%problems%OtherProblems%Scr3%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr3, ChangeScr3, distance) + if(data%problems%OtherProblems%Scr4%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%OtherProblems%Scr4, ChangeScr4, distance) + + end subroutine + + + subroutine ChangeRigAlarm(status) + implicit none + integer, intent (in) :: status + !if(associated(RigAlarmPtr)) call RigAlarmPtr(status) + !if(status == Clear_StatusType) print*,'On_RigAlarm_Clear' + !if(status == Executed_StatusType) print*,'On_RigAlarm_Execute' + endsubroutine + + subroutine ChangeRigWaterSupply(status) + implicit none + integer, intent (in) :: status + !if(associated(RigWaterSupplyPtr)) call RigWaterSupplyPtr(status) + !if(status == Clear_StatusType) print*,'On_RigWaterSupply_Clear' + !if(status == Executed_StatusType) print*,'On_RigWaterSupply_Execute' + endsubroutine + + subroutine ChangeRigAir(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(RigAirPtr)) call RigAirPtr(status) + if(status == Clear_StatusType) data%State%BopStackAcc%RigAirMalf = 0 + if(status == Executed_StatusType) data%State%BopStackAcc%RigAirMalf = 1 + endsubroutine + + subroutine ChangeGen1(status) + implicit none + integer, intent (in) :: status + !if(associated(Gen1Ptr)) call Gen1Ptr(status) + !if(status == Clear_StatusType) print*,'On_Gen1_Clear' + !if(status == Executed_StatusType) print*,'On_Gen1_Execute' + endsubroutine + + subroutine ChangeGen2(status) + implicit none + integer, intent (in) :: status + !if(associated(Gen2Ptr)) call Gen2Ptr(status) + !if(status == Clear_StatusType) print*,'On_Gen2_Clear' + !if(status == Executed_StatusType) print*,'On_Gen2_Execute' + endsubroutine + + subroutine ChangeGen3(status) + implicit none + integer, intent (in) :: status + !if(associated(Gen3Ptr)) call Gen3Ptr(status) + !if(status == Clear_StatusType) print*,'On_Gen3_Clear' + !if(status == Executed_StatusType) print*,'On_Gen3_Execute' + endsubroutine + + subroutine ChangeGen4(status) + implicit none + integer, intent (in) :: status + !if(associated(Gen4Ptr)) call Gen4Ptr(status) + !if(status == Clear_StatusType) print*,'On_Gen4_Clear' + !if(status == Executed_StatusType) print*,'On_Gen4_Execute' + endsubroutine + + subroutine ChangeScr1(status) + implicit none + integer, intent (in) :: status + !if(associated(Scr1Ptr)) call Scr1Ptr(status) + !if(status == Clear_StatusType) print*,'On_Scr1_Clear' + !if(status == Executed_StatusType) print*,'On_Scr1_Execute' + endsubroutine + + subroutine ChangeScr2(status) + implicit none + integer, intent (in) :: status + !if(associated(Scr2Ptr)) call Scr2Ptr(status) + !if(status == Clear_StatusType) print*,'On_Scr2_Clear' + !if(status == Executed_StatusType) print*,'On_Scr2_Execute' + endsubroutine + + subroutine ChangeScr3(status) + implicit none + integer, intent (in) :: status + !if(associated(Scr3Ptr)) call Scr3Ptr(status) + !if(status == Clear_StatusType) print*,'On_Scr3_Clear' + !if(status == Executed_StatusType) print*,'On_Scr3_Execute' + endsubroutine + + subroutine ChangeScr4(status) + implicit none + integer, intent (in) :: status + !if(associated(Scr4Ptr)) call Scr4Ptr(status) + !if(status == Clear_StatusType) print*,'On_Scr4_Clear' + !if(status == Executed_StatusType) print*,'On_Scr4_Execute' + endsubroutine + + end module COtherProblems \ No newline at end of file diff --git a/CSharp/Problems/COtherProblemsVariables.f90 b/CSharp/Problems/COtherProblemsVariables.f90 index bbc20b6..e663006 100644 --- a/CSharp/Problems/COtherProblemsVariables.f90 +++ b/CSharp/Problems/COtherProblemsVariables.f90 @@ -1,35 +1,35 @@ -module COtherProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - TYPE:: OtherProblemsType - type(CProblem) :: RigAlarm - type(CProblem) :: RigWaterSupply - type(CProblem) :: RigAir - type(CProblem) :: Gen1 - type(CProblem) :: Gen2 - type(CProblem) :: Gen3 - type(CProblem) :: Gen4 - type(CProblem) :: Scr1 - type(CProblem) :: Scr2 - type(CProblem) :: Scr3 - type(CProblem) :: Scr4 - end type OtherProblemsType - contains - - - - - - - - - - - - - - +module COtherProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + TYPE:: OtherProblemsType + type(CProblem) :: RigAlarm + type(CProblem) :: RigWaterSupply + type(CProblem) :: RigAir + type(CProblem) :: Gen1 + type(CProblem) :: Gen2 + type(CProblem) :: Gen3 + type(CProblem) :: Gen4 + type(CProblem) :: Scr1 + type(CProblem) :: Scr2 + type(CProblem) :: Scr3 + type(CProblem) :: Scr4 + end type OtherProblemsType + contains + + + + + + + + + + + + + + end module COtherProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CProblemDifinition.f90 b/CSharp/Problems/CProblemDifinition.f90 index 51f0ff3..d8c9adf 100644 --- a/CSharp/Problems/CProblemDifinition.f90 +++ b/CSharp/Problems/CProblemDifinition.f90 @@ -1,78 +1,98 @@ -module CProblemDifinition - use CIActionReference - implicit none - public - - ! procedure (ActionInteger), pointer :: Nil => null() - - integer, parameter :: Time_ProblemType = 0 - integer, parameter :: PumpStrokes_ProblemType = 1 - integer, parameter :: VolumePumped_ProblemType = 2 - integer, parameter :: DistanceDrilled_ProblemType = 3 - - integer, parameter :: Clear_StatusType = 0 - integer, parameter :: Now_StatusType = 1 - integer, parameter :: Later_StatusType = 2 - integer, parameter :: Executed_StatusType = 3 - - type, bind(c), public :: CProblem - integer :: ProblemType - integer :: StatusType - real(8) :: Value - real(8) :: DueValue - end type CProblem - - contains - - subroutine Execute(problem, action) - type(CProblem), intent(inout) :: problem - procedure (ActionInteger), pointer, intent(in) :: action - problem%StatusType = Executed_StatusType - if(problem%StatusType == Executed_StatusType .and. associated(action)) call action(Executed_StatusType) - end subroutine - - - - subroutine ProcessDueTime(problem, action, time) - use CLog3 - implicit none - type(CProblem) :: problem - procedure (ActionInteger), pointer, intent(in) :: action - integer :: time - if(problem%ProblemType == Time_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then - if(time >= int(problem%DueValue)) call Execute(problem, action) - end if - end subroutine - - subroutine ProcessDuePumpStrokes(problem, action, strokes) - implicit none - type(CProblem) :: problem - procedure (ActionInteger), pointer, intent(in) :: action - integer :: strokes - if(problem%ProblemType == PumpStrokes_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then - if(strokes >= int(problem%DueValue)) call Execute(problem, action) - end if - end subroutine - - subroutine ProcessDueVolumePumped(problem, action, volume) - implicit none - type(CProblem) :: problem - procedure (ActionInteger), pointer, intent(in) :: action - real(8) :: volume - if(problem%ProblemType == VolumePumped_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then - if(volume >= problem%DueValue) call Execute(problem, action) - end if - end subroutine - - subroutine ProcessDueDistanceDrilled(problem, action, distance) - implicit none - type(CProblem) :: problem - procedure (ActionInteger), pointer, intent(in) :: action - real(8) :: distance - if(problem%ProblemType == DistanceDrilled_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then - if(distance >= problem%DueValue) call Execute(problem, action) - end if - end subroutine - - +module CProblemDifinition + use json_module + use CIActionReference + implicit none + public + + integer, parameter :: Time_ProblemType = 0 + integer, parameter :: PumpStrokes_ProblemType = 1 + integer, parameter :: VolumePumped_ProblemType = 2 + integer, parameter :: DistanceDrilled_ProblemType = 3 + + integer, parameter :: Clear_StatusType = 0 + integer, parameter :: Now_StatusType = 1 + integer, parameter :: Later_StatusType = 2 + integer, parameter :: Executed_StatusType = 3 + + type, bind(c), public :: CProblem + integer :: ProblemType + integer :: StatusType + real(8) :: Value + real(8) :: DueValue + end type CProblem + + contains + + subroutine ProblemToJson(parent,name,problem) + type(json_value),pointer :: parent + character(len=*)::name + type(CProblem)::problem + type(json_core) :: json + type(json_value),pointer :: p + + + ! 1. create new node + call json%create_object(p,name) + + ! 2. add member of data type to new node + call json%add(p,"ProblemType",problem%ProblemType) + call json%add(p,"StatusType",problem%StatusType) + call json%add(p,"Value",problem%Value) + call json%add(p,"DueValue",problem%DueValue) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine Execute(problem, action) + type(CProblem), intent(inout) :: problem + procedure (ActionInteger), pointer, intent(in) :: action + problem%StatusType = Executed_StatusType + if(problem%StatusType == Executed_StatusType .and. associated(action)) call action(Executed_StatusType) + end subroutine + + + + subroutine ProcessDueTime(problem, action, time) + use CLog3 + implicit none + type(CProblem) :: problem + procedure (ActionInteger), pointer, intent(in) :: action + integer :: time + if(problem%ProblemType == Time_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then + if(time >= int(problem%DueValue)) call Execute(problem, action) + end if + end subroutine + + subroutine ProcessDuePumpStrokes(problem, action, strokes) + implicit none + type(CProblem) :: problem + procedure (ActionInteger), pointer, intent(in) :: action + integer :: strokes + if(problem%ProblemType == PumpStrokes_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then + if(strokes >= int(problem%DueValue)) call Execute(problem, action) + end if + end subroutine + + subroutine ProcessDueVolumePumped(problem, action, volume) + implicit none + type(CProblem) :: problem + procedure (ActionInteger), pointer, intent(in) :: action + real(8) :: volume + if(problem%ProblemType == VolumePumped_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then + if(volume >= problem%DueValue) call Execute(problem, action) + end if + end subroutine + + subroutine ProcessDueDistanceDrilled(problem, action, distance) + implicit none + type(CProblem) :: problem + procedure (ActionInteger), pointer, intent(in) :: action + real(8) :: distance + if(problem%ProblemType == DistanceDrilled_ProblemType .and. problem%StatusType /= Executed_StatusType .and. problem%StatusType /= Clear_StatusType) then + if(distance >= problem%DueValue) call Execute(problem, action) + end if + end subroutine + + end module CProblemDifinition \ No newline at end of file diff --git a/CSharp/Problems/CPumpProblems.f90 b/CSharp/Problems/CPumpProblems.f90 index 19b0c67..af567ac 100644 --- a/CSharp/Problems/CPumpProblems.f90 +++ b/CSharp/Problems/CPumpProblems.f90 @@ -1,123 +1,144 @@ -module CPumpProblems - use SimulationVariables - implicit none - public - contains - subroutine ProcessPumpProblemsDueTime(time) - implicit none - integer :: time - - if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, time) - if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, time) - if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, time) - if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, time) - if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, time) - if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, time) - - end subroutine - - subroutine ProcessPumpProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, strokes) - if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, strokes) - if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, strokes) - if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, strokes) - if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, strokes) - if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, strokes) - - end subroutine - - subroutine ProcessPumpProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, volume) - if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, volume) - if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, volume) - if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, volume) - if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, volume) - if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, volume) - - end subroutine - - subroutine ProcessPumpProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, distance) - if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, distance) - if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, distance) - if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, distance) - if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, distance) - if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, distance) - - end subroutine - - - - - - - - - - - - subroutine ChangePump1PowerFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(Pump1PowerFailPtr)) call Pump1PowerFailPtr(status) - if(status == Clear_StatusType) data%State%Pump(1)%PowerFailMalf=0 - if(status == Executed_StatusType) data%State%Pump(1)%PowerFailMalf=1 - endsubroutine - - subroutine ChangePump1BlowPopOffValve(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(Pump1BlowPopOffValvePtr)) call Pump1BlowPopOffValvePtr(status) - if(status == Clear_StatusType) data%State%Pump(1)%BlowPopOffMalf=0 - if(status == Executed_StatusType) data%State%Pump(1)%BlowPopOffMalf=1 - endsubroutine - - subroutine ChangePump2PowerFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(Pump2PowerFailPtr)) call Pump2PowerFailPtr(status) - if(status == Clear_StatusType) data%State%Pump(2)%PowerFailMalf=0 - if(status == Executed_StatusType) data%State%Pump(2)%PowerFailMalf=1 - endsubroutine - - subroutine ChangePump2BlowPopOffValve(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(Pump2BlowPopOffValvePtr)) call Pump2BlowPopOffValvePtr(status) - if(status == Clear_StatusType) data%State%Pump(2)%BlowPopOffMalf=0 - if(status == Executed_StatusType) data%State%Pump(2)%BlowPopOffMalf=1 - endsubroutine - - subroutine ChangeCementPumpPowerFail(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(CementPumpPowerFailPtr)) call CementPumpPowerFailPtr(status) - if(status == Clear_StatusType) data%State%Pump(3)%PowerFailMalf=0 - if(status == Executed_StatusType) data%State%Pump(3)%PowerFailMalf=1 - endsubroutine - - subroutine ChangeCementPumpBlowPopOffValve(status) - use SimulationVariables - implicit none - integer, intent (in) :: status - !if(associated(CementPumpBlowPopOffValvePtr)) call CementPumpBlowPopOffValvePtr(status) - if(status == Clear_StatusType) data%State%Pump(3)%BlowPopOffMalf=0 - if(status == Executed_StatusType) data%State%Pump(3)%BlowPopOffMalf=1 - endsubroutine - - +module CPumpProblems + use SimulationVariables + implicit none + public + contains + subroutine PumpProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'PumpProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"Pump1PowerFail",data%problems%PumpProblems%Pump1PowerFail) + call ProblemToJson(p,"Pump1BlowPopOffValve",data%problems%PumpProblems%Pump1BlowPopOffValve) + call ProblemToJson(p,"Pump2PowerFail",data%problems%PumpProblems%Pump2PowerFail) + call ProblemToJson(p,"Pump2BlowPopOffValve",data%problems%PumpProblems%Pump2BlowPopOffValve) + call ProblemToJson(p,"CementPumpPowerFail",data%problems%PumpProblems%CementPumpPowerFail) + call ProblemToJson(p,"CementPumpBlowPopOffValve",data%problems%PumpProblems%CementPumpBlowPopOffValve) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessPumpProblemsDueTime(time) + implicit none + integer :: time + + if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, time) + if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, time) + if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, time) + if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, time) + if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, time) + if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, time) + + end subroutine + + subroutine ProcessPumpProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, strokes) + if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, strokes) + if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, strokes) + if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, strokes) + if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, strokes) + if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, strokes) + + end subroutine + + subroutine ProcessPumpProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, volume) + if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, volume) + if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, volume) + if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, volume) + if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, volume) + if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, volume) + + end subroutine + + subroutine ProcessPumpProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%PumpProblems%Pump1PowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump1PowerFail, ChangePump1PowerFail, distance) + if(data%problems%PumpProblems%Pump1BlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump1BlowPopOffValve, ChangePump1BlowPopOffValve, distance) + if(data%problems%PumpProblems%Pump2PowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump2PowerFail, ChangePump2PowerFail, distance) + if(data%problems%PumpProblems%Pump2BlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%Pump2BlowPopOffValve, ChangePump2BlowPopOffValve, distance) + if(data%problems%PumpProblems%CementPumpPowerFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%CementPumpPowerFail, ChangeCementPumpPowerFail, distance) + if(data%problems%PumpProblems%CementPumpBlowPopOffValve%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%PumpProblems%CementPumpBlowPopOffValve, ChangeCementPumpBlowPopOffValve, distance) + + end subroutine + + + + + + + + + + + + subroutine ChangePump1PowerFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(Pump1PowerFailPtr)) call Pump1PowerFailPtr(status) + if(status == Clear_StatusType) data%State%Pump(1)%PowerFailMalf=0 + if(status == Executed_StatusType) data%State%Pump(1)%PowerFailMalf=1 + endsubroutine + + subroutine ChangePump1BlowPopOffValve(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(Pump1BlowPopOffValvePtr)) call Pump1BlowPopOffValvePtr(status) + if(status == Clear_StatusType) data%State%Pump(1)%BlowPopOffMalf=0 + if(status == Executed_StatusType) data%State%Pump(1)%BlowPopOffMalf=1 + endsubroutine + + subroutine ChangePump2PowerFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(Pump2PowerFailPtr)) call Pump2PowerFailPtr(status) + if(status == Clear_StatusType) data%State%Pump(2)%PowerFailMalf=0 + if(status == Executed_StatusType) data%State%Pump(2)%PowerFailMalf=1 + endsubroutine + + subroutine ChangePump2BlowPopOffValve(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(Pump2BlowPopOffValvePtr)) call Pump2BlowPopOffValvePtr(status) + if(status == Clear_StatusType) data%State%Pump(2)%BlowPopOffMalf=0 + if(status == Executed_StatusType) data%State%Pump(2)%BlowPopOffMalf=1 + endsubroutine + + subroutine ChangeCementPumpPowerFail(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(CementPumpPowerFailPtr)) call CementPumpPowerFailPtr(status) + if(status == Clear_StatusType) data%State%Pump(3)%PowerFailMalf=0 + if(status == Executed_StatusType) data%State%Pump(3)%PowerFailMalf=1 + endsubroutine + + subroutine ChangeCementPumpBlowPopOffValve(status) + use SimulationVariables + implicit none + integer, intent (in) :: status + !if(associated(CementPumpBlowPopOffValvePtr)) call CementPumpBlowPopOffValvePtr(status) + if(status == Clear_StatusType) data%State%Pump(3)%BlowPopOffMalf=0 + if(status == Executed_StatusType) data%State%Pump(3)%BlowPopOffMalf=1 + endsubroutine + + end module CPumpProblems \ No newline at end of file diff --git a/CSharp/Problems/CPumpProblemsVariables.f90 b/CSharp/Problems/CPumpProblemsVariables.f90 index 39d76fd..be08475 100644 --- a/CSharp/Problems/CPumpProblemsVariables.f90 +++ b/CSharp/Problems/CPumpProblemsVariables.f90 @@ -1,19 +1,19 @@ -module CPumpProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type :: PumpProblemsType - type(CProblem) :: Pump1PowerFail - type(CProblem) :: Pump1BlowPopOffValve - type(CProblem) :: Pump2PowerFail - type(CProblem) :: Pump2BlowPopOffValve - type(CProblem) :: CementPumpPowerFail - type(CProblem) :: CementPumpBlowPopOffValve - end type PumpProblemsType - - contains - - +module CPumpProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type :: PumpProblemsType + type(CProblem) :: Pump1PowerFail + type(CProblem) :: Pump1BlowPopOffValve + type(CProblem) :: Pump2PowerFail + type(CProblem) :: Pump2BlowPopOffValve + type(CProblem) :: CementPumpPowerFail + type(CProblem) :: CementPumpBlowPopOffValve + end type PumpProblemsType + + contains + + end module CPumpProblemsVariables \ No newline at end of file diff --git a/CSharp/Problems/CRotaryProblems.f90 b/CSharp/Problems/CRotaryProblems.f90 index 7b0a19b..5d92c0e 100644 --- a/CSharp/Problems/CRotaryProblems.f90 +++ b/CSharp/Problems/CRotaryProblems.f90 @@ -1,66 +1,83 @@ -module CRotaryProblems - use SimulationVariables - implicit none - public - contains - subroutine ProcessRotaryProblemsDueTime(time) - implicit none - integer :: time - - if(data%problems%RotaryProblems%MotorFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, time) - if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, time) - - end subroutine - - subroutine ProcessRotaryProblemsDuePumpStrokes(strokes) - implicit none - integer :: strokes - - if(data%problems%RotaryProblems%MotorFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, strokes) - if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, strokes) - - end subroutine - - subroutine ProcessRotaryProblemsDueVolumePumped(volume) - implicit none - real(8) :: volume - - if(data%problems%RotaryProblems%MotorFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, volume) - if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, volume) - - end subroutine - - subroutine ProcessRotaryProblemsDueDistanceDrilled(distance) - implicit none - real(8) :: distance - - if(data%problems%RotaryProblems%MotorFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, distance) - if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, distance) - - end subroutine - - - - - - - - subroutine ChangeMotorFail(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - !if(associated(MotorFailPtr)) call MotorFailPtr(status) - if(status == Clear_StatusType) data%State%RTable%MotorFaileMalf=0 - if(status == Executed_StatusType) data%State%RTable%MotorFaileMalf=1 - endsubroutine - - subroutine ChangeOverideTorqueLimit(status) - use SimulationVariables !@ - implicit none - integer, intent (in) :: status - !if(associated(OverideTorqueLimitPtr)) call OverideTorqueLimitPtr(status) - if(status == Clear_StatusType) data%State%RTable%OverideTorqueLimitMalf=0 - if(status == Executed_StatusType) data%State%RTable%OverideTorqueLimitMalf=1 - endsubroutine - +module CRotaryProblems + use SimulationVariables + implicit none + public + contains + subroutine RotaryProblemsToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'RotaryProblems') + + ! 2. add member of data type to new node + call ProblemToJson(p,"MotorFail",data%problems%RotaryProblems%MotorFail) + call ProblemToJson(p,"OverideTorqueLimit",data%problems%RotaryProblems%OverideTorqueLimit) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProcessRotaryProblemsDueTime(time) + implicit none + integer :: time + + if(data%problems%RotaryProblems%MotorFail%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, time) + if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == Time_ProblemType) call ProcessDueTime(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, time) + + end subroutine + + subroutine ProcessRotaryProblemsDuePumpStrokes(strokes) + implicit none + integer :: strokes + + if(data%problems%RotaryProblems%MotorFail%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, strokes) + if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == PumpStrokes_ProblemType) call ProcessDuePumpStrokes(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, strokes) + + end subroutine + + subroutine ProcessRotaryProblemsDueVolumePumped(volume) + implicit none + real(8) :: volume + + if(data%problems%RotaryProblems%MotorFail%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, volume) + if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == VolumePumped_ProblemType) call ProcessDueVolumePumped(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, volume) + + end subroutine + + subroutine ProcessRotaryProblemsDueDistanceDrilled(distance) + implicit none + real(8) :: distance + + if(data%problems%RotaryProblems%MotorFail%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%RotaryProblems%MotorFail, ChangeMotorFail, distance) + if(data%problems%RotaryProblems%OverideTorqueLimit%ProblemType == DistanceDrilled_ProblemType) call ProcessDueDistanceDrilled(data%problems%RotaryProblems%OverideTorqueLimit, ChangeOverideTorqueLimit, distance) + + end subroutine + + + + + + + + subroutine ChangeMotorFail(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + !if(associated(MotorFailPtr)) call MotorFailPtr(status) + if(status == Clear_StatusType) data%State%RTable%MotorFaileMalf=0 + if(status == Executed_StatusType) data%State%RTable%MotorFaileMalf=1 + endsubroutine + + subroutine ChangeOverideTorqueLimit(status) + use SimulationVariables !@ + implicit none + integer, intent (in) :: status + !if(associated(OverideTorqueLimitPtr)) call OverideTorqueLimitPtr(status) + if(status == Clear_StatusType) data%State%RTable%OverideTorqueLimitMalf=0 + if(status == Executed_StatusType) data%State%RTable%OverideTorqueLimitMalf=1 + endsubroutine + end module CRotaryProblems \ No newline at end of file diff --git a/CSharp/Problems/CRotaryProblemsVariables.f90 b/CSharp/Problems/CRotaryProblemsVariables.f90 index 2c2230b..071a52f 100644 --- a/CSharp/Problems/CRotaryProblemsVariables.f90 +++ b/CSharp/Problems/CRotaryProblemsVariables.f90 @@ -1,14 +1,14 @@ -module CRotaryProblemsVariables - use CProblemDifinition - implicit none - public - - ! Input vars - type::RotaryProblemsType - type(CProblem) :: MotorFail - type(CProblem) :: OverideTorqueLimit - end type RotaryProblemsType - - contains - +module CRotaryProblemsVariables + use CProblemDifinition + implicit none + public + + ! Input vars + type::RotaryProblemsType + type(CProblem) :: MotorFail + type(CProblem) :: OverideTorqueLimit + end type RotaryProblemsType + + contains + end module CRotaryProblemsVariables \ No newline at end of file diff --git a/CSharp/StudentStation/CStudentStationVariables.f90 b/CSharp/StudentStation/CStudentStationVariables.f90 index e7b8801..799d58c 100644 --- a/CSharp/StudentStation/CStudentStationVariables.f90 +++ b/CSharp/StudentStation/CStudentStationVariables.f90 @@ -1,15 +1,15 @@ -module CStudentStationVariables - ! use CVoidEventHandlerCollection - implicit none - public - - ! Input vars - type StudentStationType - logical :: FillupHeadInstallation - logical :: PitGainLossZero - logical :: MudBoxInstallation - logical :: TapSelector - end type StudentStationType - - contains +module CStudentStationVariables + ! use CVoidEventHandlerCollection + implicit none + public + + ! Input vars + type StudentStationType + logical :: FillupHeadInstallation + logical :: PitGainLossZero + logical :: MudBoxInstallation + logical :: TapSelector + end type StudentStationType + + contains end module CStudentStationVariables \ No newline at end of file diff --git a/CSharp/Warnings/CWarnings.f90 b/CSharp/Warnings/CWarnings.f90 index 7ce39f1..eb2fe44 100644 --- a/CSharp/Warnings/CWarnings.f90 +++ b/CSharp/Warnings/CWarnings.f90 @@ -1,568 +1,568 @@ -module CWarnings - ! use CWarnings - use SimulationVariables - implicit none - public - contains - subroutine Activate_PumpWithKellyDisconnected() - implicit none - if(data%Warnings%PumpWithKellyDisconnected) return - data%Warnings%PumpWithKellyDisconnected = .true. - call RunPumpWithKellyDisconnected() - end subroutine - - subroutine Activate_PumpWithTopdriveDisconnected() - implicit none - if(data%Warnings%PumpWithTopdriveDisconnected) return - data%Warnings%PumpWithTopdriveDisconnected = .true. - call RunPumpWithTopdriveDisconnected() - end subroutine - - subroutine Activate_Pump1PopOffValveBlown() - implicit none - if(data%Warnings%Pump1PopOffValveBlown) return - data%Warnings%Pump1PopOffValveBlown = .true. - call RunPump1PopOffValveBlown() - end subroutine - - subroutine Activate_Pump1Failure() - implicit none - if(data%Warnings%Pump1Failure) return - data%Warnings%Pump1Failure = .true. - call RunPump1Failure() - end subroutine - - subroutine Activate_Pump2PopOffValveBlown() - implicit none - if(data%Warnings%Pump2PopOffValveBlown) return - data%Warnings%Pump2PopOffValveBlown = .true. - call RunPump2PopOffValveBlown() - end subroutine - - subroutine Activate_Pump2Failure() - implicit none - if(data%Warnings%Pump2Failure) return - data%Warnings%Pump2Failure = .true. - call RunPump2Failure() - end subroutine - - subroutine Activate_Pump3PopOffValveBlown() - implicit none - if(data%Warnings%Pump3PopOffValveBlown) return - data%Warnings%Pump3PopOffValveBlown = .true. - call RunPump3PopOffValveBlown() - end subroutine - - subroutine Activate_Pump3Failure() - implicit none - if(data%Warnings%Pump3Failure) return - data%Warnings%Pump3Failure = .true. - call RunPump3Failure() - end subroutine - - subroutine Activate_DrawworksGearsAbuse() - implicit none - if(data%Warnings%DrawworksGearsAbuse) return - data%Warnings%DrawworksGearsAbuse = .true. - call RunDrawworksGearsAbuse() - end subroutine - - subroutine Activate_RotaryGearsAbuse() - implicit none - if(data%Warnings%RotaryGearsAbuse) return - data%Warnings%RotaryGearsAbuse = .true. - call RunRotaryGearsAbuse() - end subroutine - - subroutine Activate_HoistLineBreak() - implicit none - if(data%Warnings%HoistLineBreak) return - data%Warnings%HoistLineBreak = .true. - call RunHoistLineBreak() - end subroutine - - subroutine Activate_PartedDrillString() - implicit none - if(data%Warnings%PartedDrillString) return - data%Warnings%PartedDrillString = .true. - call RunPartedDrillString() - end subroutine - - subroutine Activate_ActiveTankOverflow() - implicit none - if(data%Warnings%ActiveTankOverflow) return - data%Warnings%ActiveTankOverflow = .true. - call RunActiveTankOverflow() - end subroutine - - subroutine Activate_ActiveTankUnderVolume() - implicit none - if(data%Warnings%ActiveTankUnderVolume) return - data%Warnings%ActiveTankUnderVolume = .true. - call RunActiveTankUnderVolume() - end subroutine - - subroutine Activate_TripTankOverflow() - implicit none - if(data%Warnings%TripTankOverflow) return - data%Warnings%TripTankOverflow = .true. - call RunTripTankOverflow() - end subroutine - - subroutine Activate_DrillPipeTwistOff() - implicit none - if(data%Warnings%DrillPipeTwistOff) return - data%Warnings%DrillPipeTwistOff = .true. - call RunDrillPipeTwistOff() - end subroutine - - subroutine Activate_DrillPipeParted() - implicit none - if(data%Warnings%DrillPipeParted) return - data%Warnings%DrillPipeParted = .true. - call RunDrillPipeParted() - end subroutine - - subroutine Activate_TripWithSlipsSet() - implicit none - if(data%Warnings%TripWithSlipsSet) return - data%Warnings%TripWithSlipsSet = .true. - call RunTripWithSlipsSet() - end subroutine - - subroutine Activate_Blowout() - implicit none - if(data%Warnings%Blowout) return - data%Warnings%Blowout = .true. - call RunBlowout() - end subroutine - - subroutine Activate_UndergroundBlowout() - implicit none - if(data%Warnings%UndergroundBlowout) return - data%Warnings%UndergroundBlowout = .true. - call RunUndergroundBlowout() - end subroutine - - subroutine Activate_MaximumWellDepthExceeded() - implicit none - if(data%Warnings%MaximumWellDepthExceeded) return - data%Warnings%MaximumWellDepthExceeded = .true. - call RunMaximumWellDepthExceeded() - end subroutine - - subroutine Activate_CrownCollision() - implicit none - if(data%Warnings%CrownCollision) return - data%Warnings%CrownCollision = .true. - call RunCrownCollision() - end subroutine - - subroutine Activate_FloorCollision() - implicit none - if(data%Warnings%FloorCollision) return - data%Warnings%FloorCollision = .true. - call RunFloorCollision() - end subroutine - - subroutine Activate_TopdriveRotaryTableConfilict() - implicit none - if(data%Warnings%TopdriveRotaryTableConfilict) return - data%Warnings%TopdriveRotaryTableConfilict = .true. - call RunTopdriveRotaryTableConfilict() - end subroutine - - - - - - - - - - - - - - - - - - - - - - - - - - - subroutine Deactivate_PumpWithKellyDisconnected() - implicit none - if(.not.data%Warnings%PumpWithKellyDisconnected) return - data%Warnings%PumpWithKellyDisconnected = .false. - call RunPumpWithKellyDisconnected() - end subroutine - - subroutine Deactivate_PumpWithTopdriveDisconnected() - implicit none - if(.not.data%Warnings%PumpWithTopdriveDisconnected) return - data%Warnings%PumpWithTopdriveDisconnected = .false. - call RunPumpWithTopdriveDisconnected() - end subroutine - - subroutine Deactivate_Pump1PopOffValveBlown() - use CManifolds - implicit none - if(.not.data%Warnings%Pump1PopOffValveBlown) return - data%Warnings%Pump1PopOffValveBlown = .false. - call ChangeValve(65, .false.) - call RunPump1PopOffValveBlown() - end subroutine - - subroutine Deactivate_Pump1Failure() - use CManifolds - implicit none - if(.not.data%Warnings%Pump1Failure) return - data%Warnings%Pump1Failure = .false. - call RunPump1Failure() - end subroutine - - subroutine Deactivate_Pump2PopOffValveBlown() - use CManifolds - implicit none - if(.not.data%Warnings%Pump2PopOffValveBlown) return - data%Warnings%Pump2PopOffValveBlown = .false. - call ChangeValve(66, .false.) - call RunPump2PopOffValveBlown() - end subroutine - - subroutine Deactivate_Pump2Failure() - use CManifolds - implicit none - if(.not.data%Warnings%Pump2Failure) return - data%Warnings%Pump2Failure = .false. - call RunPump2Failure() - end subroutine - - subroutine Deactivate_Pump3PopOffValveBlown() - use CManifolds - implicit none - if(.not.data%Warnings%Pump3PopOffValveBlown) return - data%Warnings%Pump3PopOffValveBlown = .false. - call RunPump3PopOffValveBlown() - end subroutine - - subroutine Deactivate_Pump3Failure() - use CManifolds - implicit none - if(.not.data%Warnings%Pump3Failure) return - data%Warnings%Pump3Failure = .false. - call RunPump3Failure() - end subroutine - - subroutine Deactivate_DrawworksGearsAbuse() - implicit none - if(.not.data%Warnings%DrawworksGearsAbuse) return - data%Warnings%DrawworksGearsAbuse = .false. - call RunDrawworksGearsAbuse() - end subroutine - - subroutine Deactivate_RotaryGearsAbuse() - implicit none - if(.not.data%Warnings%RotaryGearsAbuse) return - data%Warnings%RotaryGearsAbuse = .false. - call RunRotaryGearsAbuse() - end subroutine - - subroutine Deactivate_HoistLineBreak() - implicit none - if(.not.data%Warnings%HoistLineBreak) return - data%Warnings%HoistLineBreak = .false. - call RunHoistLineBreak() - end subroutine - - subroutine Deactivate_PartedDrillString() - implicit none - if(.not.data%Warnings%PartedDrillString) return - data%Warnings%PartedDrillString = .false. - call RunPartedDrillString() - end subroutine - - subroutine Deactivate_ActiveTankOverflow() - implicit none - if(.not.data%Warnings%ActiveTankOverflow) return - data%Warnings%ActiveTankOverflow = .false. - call RunActiveTankOverflow() - end subroutine - - subroutine Deactivate_ActiveTankUnderVolume() - implicit none - if(.not.data%Warnings%ActiveTankUnderVolume) return - data%Warnings%ActiveTankUnderVolume = .false. - call RunActiveTankUnderVolume() - end subroutine - - subroutine Deactivate_TripTankOverflow() - implicit none - if(.not.data%Warnings%TripTankOverflow) return - data%Warnings%TripTankOverflow = .false. - call RunTripTankOverflow() - end subroutine - - subroutine Deactivate_DrillPipeTwistOff() - implicit none - if(.not.data%Warnings%DrillPipeTwistOff) return - data%Warnings%DrillPipeTwistOff = .false. - call RunDrillPipeTwistOff() - end subroutine - - subroutine Deactivate_DrillPipeParted() - implicit none - if(.not.data%Warnings%DrillPipeParted) return - data%Warnings%DrillPipeParted = .false. - call RunDrillPipeParted() - end subroutine - - subroutine Deactivate_TripWithSlipsSet() - implicit none - if(.not.data%Warnings%TripWithSlipsSet) return - data%Warnings%TripWithSlipsSet = .false. - call RunTripWithSlipsSet() - end subroutine - - subroutine Deactivate_Blowout() - implicit none - if(.not.data%Warnings%Blowout) return - data%Warnings%Blowout = .false. - call RunBlowout() - end subroutine - - subroutine Deactivate_UndergroundBlowout() - implicit none - if(.not.data%Warnings%UndergroundBlowout) return - data%Warnings%UndergroundBlowout = .false. - call RunUndergroundBlowout() - end subroutine - - subroutine Deactivate_MaximumWellDepthExceeded() - implicit none - if(.not.data%Warnings%MaximumWellDepthExceeded) return - data%Warnings%MaximumWellDepthExceeded = .false. - call RunMaximumWellDepthExceeded() - end subroutine - - subroutine Deactivate_CrownCollision() - implicit none - if(.not.data%Warnings%CrownCollision) return - data%Warnings%CrownCollision = .false. - call RunCrownCollision() - end subroutine - - subroutine Deactivate_FloorCollision() - implicit none - if(.not.data%Warnings%FloorCollision) return - data%Warnings%FloorCollision = .false. - call RunFloorCollision() - end subroutine - - subroutine Deactivate_TopdriveRotaryTableConfilict() - implicit none - if(.not.data%Warnings%TopdriveRotaryTableConfilict) return - data%Warnings%TopdriveRotaryTableConfilict = .false. - call RunTopdriveRotaryTableConfilict() - end subroutine - - - - - - - - - - - - - - - - - - - - - - - - - - subroutine RunPumpWithKellyDisconnected() - implicit none - ! if(associated(PumpWithKellyDisconnectedPtr)) then - ! call PumpWithKellyDisconnectedPtr(data%Warnings%PumpWithKellyDisconnected) - ! end if - end subroutine - - subroutine RunPumpWithTopdriveDisconnected() - implicit none - ! if(associated(PumpWithTopdriveDisconnectedPtr)) then - ! call PumpWithTopdriveDisconnectedPtr(data%Warnings%PumpWithTopdriveDisconnected) - ! end if - end subroutine - - subroutine RunPump1PopOffValveBlown() - implicit none - ! if(associated(Pump1PopOffValveBlownPtr)) then - ! call Pump1PopOffValveBlownPtr(data%Warnings%Pump1PopOffValveBlown) - ! end if - end subroutine - - subroutine RunPump1Failure() - ! implicit none - ! if(associated(Pump1FailurePtr)) then - ! call Pump1FailurePtr(data%Warnings%Pump1Failure) - ! end if - end subroutine - - subroutine RunPump2PopOffValveBlown() - ! implicit none - ! if(associated(Pump2PopOffValveBlownPtr)) then - ! call Pump2PopOffValveBlownPtr(data%Warnings%Pump2PopOffValveBlown) - ! end if - end subroutine - - subroutine RunPump2Failure() - implicit none - ! if(associated(Pump2FailurePtr)) then - ! call Pump2FailurePtr(data%Warnings%Pump2Failure) - ! end if - end subroutine - - subroutine RunPump3PopOffValveBlown() - implicit none - ! if(associated(Pump3PopOffValveBlownPtr)) then - ! call Pump3PopOffValveBlownPtr(data%Warnings%Pump3PopOffValveBlown) - ! end if - end subroutine - - subroutine RunPump3Failure() - implicit none - ! if(associated(Pump3FailurePtr)) then - ! call Pump3FailurePtr(data%Warnings%Pump3Failure) - ! end if - end subroutine - - subroutine RunDrawworksGearsAbuse() - implicit none - ! if(associated(DrawworksGearsAbusePtr)) then - ! call DrawworksGearsAbusePtr(data%Warnings%DrawworksGearsAbuse) - ! end if - end subroutine - - subroutine RunRotaryGearsAbuse() - implicit none - ! if(associated(RotaryGearsAbusePtr)) then - ! call RotaryGearsAbusePtr(data%Warnings%RotaryGearsAbuse) - ! end if - end subroutine - - subroutine RunHoistLineBreak() - implicit none - ! if(associated(HoistLineBreakPtr)) then - ! call HoistLineBreakPtr(data%Warnings%HoistLineBreak) - ! end if - end subroutine - - subroutine RunPartedDrillString() - implicit none - ! if(associated(PartedDrillStringPtr)) then - ! call PartedDrillStringPtr(data%Warnings%PartedDrillString) - ! end if - end subroutine - - subroutine RunActiveTankOverflow() - implicit none - ! if(associated(ActiveTankOverflowPtr)) then - ! call ActiveTankOverflowPtr(data%Warnings%ActiveTankOverflow) - ! end if - end subroutine - - subroutine RunActiveTankUnderVolume() - implicit none - ! if(associated(ActiveTankUnderVolumePtr)) then - ! call ActiveTankUnderVolumePtr(data%Warnings%ActiveTankUnderVolume) - ! end if - end subroutine - - subroutine RunTripTankOverflow() - implicit none - ! if(associated(TripTankOverflowPtr)) then - ! call TripTankOverflowPtr(data%Warnings%TripTankOverflow) - ! end if - end subroutine - - subroutine RunDrillPipeTwistOff() - implicit none - ! if(associated(DrillPipeTwistOffPtr)) then - ! call DrillPipeTwistOffPtr(data%Warnings%DrillPipeTwistOff) - ! end if - end subroutine - - subroutine RunDrillPipeParted() - implicit none - ! if(associated(DrillPipePartedPtr)) then - ! call DrillPipePartedPtr(data%Warnings%DrillPipeParted) - ! end if - end subroutine - - subroutine RunTripWithSlipsSet() - implicit none - ! if(associated(TripWithSlipsSetPtr)) then - ! call TripWithSlipsSetPtr(data%Warnings%TripWithSlipsSet) - ! end if - end subroutine - - subroutine RunBlowout() - implicit none - ! if(associated(BlowoutPtr)) then - ! call BlowoutPtr(data%Warnings%Blowout) - ! end if - end subroutine - - subroutine RunUndergroundBlowout() - implicit none - ! if(associated(UndergroundBlowoutPtr)) then - ! call UndergroundBlowoutPtr(data%Warnings%UndergroundBlowout) - ! end if - end subroutine - - subroutine RunMaximumWellDepthExceeded() - implicit none - ! if(associated(MaximumWellDepthExceededPtr)) then - ! call MaximumWellDepthExceededPtr(data%Warnings%MaximumWellDepthExceeded) - ! end if - end subroutine - - subroutine RunCrownCollision() - implicit none - ! if(associated(CrownCollisionPtr)) then - ! call CrownCollisionPtr(data%Warnings%CrownCollision) - ! end if - end subroutine - - subroutine RunFloorCollision() - implicit none - ! if(associated(FloorCollisionPtr)) then - ! call FloorCollisionPtr(data%Warnings%FloorCollision) - ! end if - end subroutine - - subroutine RunTopdriveRotaryTableConfilict() - implicit none - ! if(associated(TopdriveRotaryTableConfilictPtr)) then - ! call TopdriveRotaryTableConfilictPtr(data%Warnings%TopdriveRotaryTableConfilict) - ! end if - end subroutine - +module CWarnings + ! use CWarnings + use SimulationVariables + implicit none + public + contains + subroutine Activate_PumpWithKellyDisconnected() + implicit none + if(data%Warnings%PumpWithKellyDisconnected) return + data%Warnings%PumpWithKellyDisconnected = .true. + call RunPumpWithKellyDisconnected() + end subroutine + + subroutine Activate_PumpWithTopdriveDisconnected() + implicit none + if(data%Warnings%PumpWithTopdriveDisconnected) return + data%Warnings%PumpWithTopdriveDisconnected = .true. + call RunPumpWithTopdriveDisconnected() + end subroutine + + subroutine Activate_Pump1PopOffValveBlown() + implicit none + if(data%Warnings%Pump1PopOffValveBlown) return + data%Warnings%Pump1PopOffValveBlown = .true. + call RunPump1PopOffValveBlown() + end subroutine + + subroutine Activate_Pump1Failure() + implicit none + if(data%Warnings%Pump1Failure) return + data%Warnings%Pump1Failure = .true. + call RunPump1Failure() + end subroutine + + subroutine Activate_Pump2PopOffValveBlown() + implicit none + if(data%Warnings%Pump2PopOffValveBlown) return + data%Warnings%Pump2PopOffValveBlown = .true. + call RunPump2PopOffValveBlown() + end subroutine + + subroutine Activate_Pump2Failure() + implicit none + if(data%Warnings%Pump2Failure) return + data%Warnings%Pump2Failure = .true. + call RunPump2Failure() + end subroutine + + subroutine Activate_Pump3PopOffValveBlown() + implicit none + if(data%Warnings%Pump3PopOffValveBlown) return + data%Warnings%Pump3PopOffValveBlown = .true. + call RunPump3PopOffValveBlown() + end subroutine + + subroutine Activate_Pump3Failure() + implicit none + if(data%Warnings%Pump3Failure) return + data%Warnings%Pump3Failure = .true. + call RunPump3Failure() + end subroutine + + subroutine Activate_DrawworksGearsAbuse() + implicit none + if(data%Warnings%DrawworksGearsAbuse) return + data%Warnings%DrawworksGearsAbuse = .true. + call RunDrawworksGearsAbuse() + end subroutine + + subroutine Activate_RotaryGearsAbuse() + implicit none + if(data%Warnings%RotaryGearsAbuse) return + data%Warnings%RotaryGearsAbuse = .true. + call RunRotaryGearsAbuse() + end subroutine + + subroutine Activate_HoistLineBreak() + implicit none + if(data%Warnings%HoistLineBreak) return + data%Warnings%HoistLineBreak = .true. + call RunHoistLineBreak() + end subroutine + + subroutine Activate_PartedDrillString() + implicit none + if(data%Warnings%PartedDrillString) return + data%Warnings%PartedDrillString = .true. + call RunPartedDrillString() + end subroutine + + subroutine Activate_ActiveTankOverflow() + implicit none + if(data%Warnings%ActiveTankOverflow) return + data%Warnings%ActiveTankOverflow = .true. + call RunActiveTankOverflow() + end subroutine + + subroutine Activate_ActiveTankUnderVolume() + implicit none + if(data%Warnings%ActiveTankUnderVolume) return + data%Warnings%ActiveTankUnderVolume = .true. + call RunActiveTankUnderVolume() + end subroutine + + subroutine Activate_TripTankOverflow() + implicit none + if(data%Warnings%TripTankOverflow) return + data%Warnings%TripTankOverflow = .true. + call RunTripTankOverflow() + end subroutine + + subroutine Activate_DrillPipeTwistOff() + implicit none + if(data%Warnings%DrillPipeTwistOff) return + data%Warnings%DrillPipeTwistOff = .true. + call RunDrillPipeTwistOff() + end subroutine + + subroutine Activate_DrillPipeParted() + implicit none + if(data%Warnings%DrillPipeParted) return + data%Warnings%DrillPipeParted = .true. + call RunDrillPipeParted() + end subroutine + + subroutine Activate_TripWithSlipsSet() + implicit none + if(data%Warnings%TripWithSlipsSet) return + data%Warnings%TripWithSlipsSet = .true. + call RunTripWithSlipsSet() + end subroutine + + subroutine Activate_Blowout() + implicit none + if(data%Warnings%Blowout) return + data%Warnings%Blowout = .true. + call RunBlowout() + end subroutine + + subroutine Activate_UndergroundBlowout() + implicit none + if(data%Warnings%UndergroundBlowout) return + data%Warnings%UndergroundBlowout = .true. + call RunUndergroundBlowout() + end subroutine + + subroutine Activate_MaximumWellDepthExceeded() + implicit none + if(data%Warnings%MaximumWellDepthExceeded) return + data%Warnings%MaximumWellDepthExceeded = .true. + call RunMaximumWellDepthExceeded() + end subroutine + + subroutine Activate_CrownCollision() + implicit none + if(data%Warnings%CrownCollision) return + data%Warnings%CrownCollision = .true. + call RunCrownCollision() + end subroutine + + subroutine Activate_FloorCollision() + implicit none + if(data%Warnings%FloorCollision) return + data%Warnings%FloorCollision = .true. + call RunFloorCollision() + end subroutine + + subroutine Activate_TopdriveRotaryTableConfilict() + implicit none + if(data%Warnings%TopdriveRotaryTableConfilict) return + data%Warnings%TopdriveRotaryTableConfilict = .true. + call RunTopdriveRotaryTableConfilict() + end subroutine + + + + + + + + + + + + + + + + + + + + + + + + + + + subroutine Deactivate_PumpWithKellyDisconnected() + implicit none + if(.not.data%Warnings%PumpWithKellyDisconnected) return + data%Warnings%PumpWithKellyDisconnected = .false. + call RunPumpWithKellyDisconnected() + end subroutine + + subroutine Deactivate_PumpWithTopdriveDisconnected() + implicit none + if(.not.data%Warnings%PumpWithTopdriveDisconnected) return + data%Warnings%PumpWithTopdriveDisconnected = .false. + call RunPumpWithTopdriveDisconnected() + end subroutine + + subroutine Deactivate_Pump1PopOffValveBlown() + use CManifolds + implicit none + if(.not.data%Warnings%Pump1PopOffValveBlown) return + data%Warnings%Pump1PopOffValveBlown = .false. + call ChangeValve(65, .false.) + call RunPump1PopOffValveBlown() + end subroutine + + subroutine Deactivate_Pump1Failure() + use CManifolds + implicit none + if(.not.data%Warnings%Pump1Failure) return + data%Warnings%Pump1Failure = .false. + call RunPump1Failure() + end subroutine + + subroutine Deactivate_Pump2PopOffValveBlown() + use CManifolds + implicit none + if(.not.data%Warnings%Pump2PopOffValveBlown) return + data%Warnings%Pump2PopOffValveBlown = .false. + call ChangeValve(66, .false.) + call RunPump2PopOffValveBlown() + end subroutine + + subroutine Deactivate_Pump2Failure() + use CManifolds + implicit none + if(.not.data%Warnings%Pump2Failure) return + data%Warnings%Pump2Failure = .false. + call RunPump2Failure() + end subroutine + + subroutine Deactivate_Pump3PopOffValveBlown() + use CManifolds + implicit none + if(.not.data%Warnings%Pump3PopOffValveBlown) return + data%Warnings%Pump3PopOffValveBlown = .false. + call RunPump3PopOffValveBlown() + end subroutine + + subroutine Deactivate_Pump3Failure() + use CManifolds + implicit none + if(.not.data%Warnings%Pump3Failure) return + data%Warnings%Pump3Failure = .false. + call RunPump3Failure() + end subroutine + + subroutine Deactivate_DrawworksGearsAbuse() + implicit none + if(.not.data%Warnings%DrawworksGearsAbuse) return + data%Warnings%DrawworksGearsAbuse = .false. + call RunDrawworksGearsAbuse() + end subroutine + + subroutine Deactivate_RotaryGearsAbuse() + implicit none + if(.not.data%Warnings%RotaryGearsAbuse) return + data%Warnings%RotaryGearsAbuse = .false. + call RunRotaryGearsAbuse() + end subroutine + + subroutine Deactivate_HoistLineBreak() + implicit none + if(.not.data%Warnings%HoistLineBreak) return + data%Warnings%HoistLineBreak = .false. + call RunHoistLineBreak() + end subroutine + + subroutine Deactivate_PartedDrillString() + implicit none + if(.not.data%Warnings%PartedDrillString) return + data%Warnings%PartedDrillString = .false. + call RunPartedDrillString() + end subroutine + + subroutine Deactivate_ActiveTankOverflow() + implicit none + if(.not.data%Warnings%ActiveTankOverflow) return + data%Warnings%ActiveTankOverflow = .false. + call RunActiveTankOverflow() + end subroutine + + subroutine Deactivate_ActiveTankUnderVolume() + implicit none + if(.not.data%Warnings%ActiveTankUnderVolume) return + data%Warnings%ActiveTankUnderVolume = .false. + call RunActiveTankUnderVolume() + end subroutine + + subroutine Deactivate_TripTankOverflow() + implicit none + if(.not.data%Warnings%TripTankOverflow) return + data%Warnings%TripTankOverflow = .false. + call RunTripTankOverflow() + end subroutine + + subroutine Deactivate_DrillPipeTwistOff() + implicit none + if(.not.data%Warnings%DrillPipeTwistOff) return + data%Warnings%DrillPipeTwistOff = .false. + call RunDrillPipeTwistOff() + end subroutine + + subroutine Deactivate_DrillPipeParted() + implicit none + if(.not.data%Warnings%DrillPipeParted) return + data%Warnings%DrillPipeParted = .false. + call RunDrillPipeParted() + end subroutine + + subroutine Deactivate_TripWithSlipsSet() + implicit none + if(.not.data%Warnings%TripWithSlipsSet) return + data%Warnings%TripWithSlipsSet = .false. + call RunTripWithSlipsSet() + end subroutine + + subroutine Deactivate_Blowout() + implicit none + if(.not.data%Warnings%Blowout) return + data%Warnings%Blowout = .false. + call RunBlowout() + end subroutine + + subroutine Deactivate_UndergroundBlowout() + implicit none + if(.not.data%Warnings%UndergroundBlowout) return + data%Warnings%UndergroundBlowout = .false. + call RunUndergroundBlowout() + end subroutine + + subroutine Deactivate_MaximumWellDepthExceeded() + implicit none + if(.not.data%Warnings%MaximumWellDepthExceeded) return + data%Warnings%MaximumWellDepthExceeded = .false. + call RunMaximumWellDepthExceeded() + end subroutine + + subroutine Deactivate_CrownCollision() + implicit none + if(.not.data%Warnings%CrownCollision) return + data%Warnings%CrownCollision = .false. + call RunCrownCollision() + end subroutine + + subroutine Deactivate_FloorCollision() + implicit none + if(.not.data%Warnings%FloorCollision) return + data%Warnings%FloorCollision = .false. + call RunFloorCollision() + end subroutine + + subroutine Deactivate_TopdriveRotaryTableConfilict() + implicit none + if(.not.data%Warnings%TopdriveRotaryTableConfilict) return + data%Warnings%TopdriveRotaryTableConfilict = .false. + call RunTopdriveRotaryTableConfilict() + end subroutine + + + + + + + + + + + + + + + + + + + + + + + + + + subroutine RunPumpWithKellyDisconnected() + implicit none + ! if(associated(PumpWithKellyDisconnectedPtr)) then + ! call PumpWithKellyDisconnectedPtr(data%Warnings%PumpWithKellyDisconnected) + ! end if + end subroutine + + subroutine RunPumpWithTopdriveDisconnected() + implicit none + ! if(associated(PumpWithTopdriveDisconnectedPtr)) then + ! call PumpWithTopdriveDisconnectedPtr(data%Warnings%PumpWithTopdriveDisconnected) + ! end if + end subroutine + + subroutine RunPump1PopOffValveBlown() + implicit none + ! if(associated(Pump1PopOffValveBlownPtr)) then + ! call Pump1PopOffValveBlownPtr(data%Warnings%Pump1PopOffValveBlown) + ! end if + end subroutine + + subroutine RunPump1Failure() + ! implicit none + ! if(associated(Pump1FailurePtr)) then + ! call Pump1FailurePtr(data%Warnings%Pump1Failure) + ! end if + end subroutine + + subroutine RunPump2PopOffValveBlown() + ! implicit none + ! if(associated(Pump2PopOffValveBlownPtr)) then + ! call Pump2PopOffValveBlownPtr(data%Warnings%Pump2PopOffValveBlown) + ! end if + end subroutine + + subroutine RunPump2Failure() + implicit none + ! if(associated(Pump2FailurePtr)) then + ! call Pump2FailurePtr(data%Warnings%Pump2Failure) + ! end if + end subroutine + + subroutine RunPump3PopOffValveBlown() + implicit none + ! if(associated(Pump3PopOffValveBlownPtr)) then + ! call Pump3PopOffValveBlownPtr(data%Warnings%Pump3PopOffValveBlown) + ! end if + end subroutine + + subroutine RunPump3Failure() + implicit none + ! if(associated(Pump3FailurePtr)) then + ! call Pump3FailurePtr(data%Warnings%Pump3Failure) + ! end if + end subroutine + + subroutine RunDrawworksGearsAbuse() + implicit none + ! if(associated(DrawworksGearsAbusePtr)) then + ! call DrawworksGearsAbusePtr(data%Warnings%DrawworksGearsAbuse) + ! end if + end subroutine + + subroutine RunRotaryGearsAbuse() + implicit none + ! if(associated(RotaryGearsAbusePtr)) then + ! call RotaryGearsAbusePtr(data%Warnings%RotaryGearsAbuse) + ! end if + end subroutine + + subroutine RunHoistLineBreak() + implicit none + ! if(associated(HoistLineBreakPtr)) then + ! call HoistLineBreakPtr(data%Warnings%HoistLineBreak) + ! end if + end subroutine + + subroutine RunPartedDrillString() + implicit none + ! if(associated(PartedDrillStringPtr)) then + ! call PartedDrillStringPtr(data%Warnings%PartedDrillString) + ! end if + end subroutine + + subroutine RunActiveTankOverflow() + implicit none + ! if(associated(ActiveTankOverflowPtr)) then + ! call ActiveTankOverflowPtr(data%Warnings%ActiveTankOverflow) + ! end if + end subroutine + + subroutine RunActiveTankUnderVolume() + implicit none + ! if(associated(ActiveTankUnderVolumePtr)) then + ! call ActiveTankUnderVolumePtr(data%Warnings%ActiveTankUnderVolume) + ! end if + end subroutine + + subroutine RunTripTankOverflow() + implicit none + ! if(associated(TripTankOverflowPtr)) then + ! call TripTankOverflowPtr(data%Warnings%TripTankOverflow) + ! end if + end subroutine + + subroutine RunDrillPipeTwistOff() + implicit none + ! if(associated(DrillPipeTwistOffPtr)) then + ! call DrillPipeTwistOffPtr(data%Warnings%DrillPipeTwistOff) + ! end if + end subroutine + + subroutine RunDrillPipeParted() + implicit none + ! if(associated(DrillPipePartedPtr)) then + ! call DrillPipePartedPtr(data%Warnings%DrillPipeParted) + ! end if + end subroutine + + subroutine RunTripWithSlipsSet() + implicit none + ! if(associated(TripWithSlipsSetPtr)) then + ! call TripWithSlipsSetPtr(data%Warnings%TripWithSlipsSet) + ! end if + end subroutine + + subroutine RunBlowout() + implicit none + ! if(associated(BlowoutPtr)) then + ! call BlowoutPtr(data%Warnings%Blowout) + ! end if + end subroutine + + subroutine RunUndergroundBlowout() + implicit none + ! if(associated(UndergroundBlowoutPtr)) then + ! call UndergroundBlowoutPtr(data%Warnings%UndergroundBlowout) + ! end if + end subroutine + + subroutine RunMaximumWellDepthExceeded() + implicit none + ! if(associated(MaximumWellDepthExceededPtr)) then + ! call MaximumWellDepthExceededPtr(data%Warnings%MaximumWellDepthExceeded) + ! end if + end subroutine + + subroutine RunCrownCollision() + implicit none + ! if(associated(CrownCollisionPtr)) then + ! call CrownCollisionPtr(data%Warnings%CrownCollision) + ! end if + end subroutine + + subroutine RunFloorCollision() + implicit none + ! if(associated(FloorCollisionPtr)) then + ! call FloorCollisionPtr(data%Warnings%FloorCollision) + ! end if + end subroutine + + subroutine RunTopdriveRotaryTableConfilict() + implicit none + ! if(associated(TopdriveRotaryTableConfilictPtr)) then + ! call TopdriveRotaryTableConfilictPtr(data%Warnings%TopdriveRotaryTableConfilict) + ! end if + end subroutine + end module CWarnings \ No newline at end of file diff --git a/CSharp/Warnings/CWarningsVariables.f90 b/CSharp/Warnings/CWarningsVariables.f90 index 6c27656..00a2958 100644 --- a/CSharp/Warnings/CWarningsVariables.f90 +++ b/CSharp/Warnings/CWarningsVariables.f90 @@ -1,33 +1,33 @@ -module CWarningsVariables - implicit none - public - - type:: WarmingsType - logical :: PumpWithKellyDisconnected - logical :: PumpWithTopdriveDisconnected - logical :: Pump1PopOffValveBlown - logical :: Pump1Failure - logical :: Pump2PopOffValveBlown - logical :: Pump2Failure - logical :: Pump3PopOffValveBlown - logical :: Pump3Failure - logical :: DrawworksGearsAbuse - logical :: RotaryGearsAbuse - logical :: HoistLineBreak - logical :: PartedDrillString - logical :: ActiveTankOverflow - logical :: ActiveTankUnderVolume - logical :: TripTankOverflow - logical :: DrillPipeTwistOff - logical :: DrillPipeParted - logical :: TripWithSlipsSet - logical :: Blowout - logical :: UndergroundBlowout - logical :: MaximumWellDepthExceeded - logical :: CrownCollision - logical :: FloorCollision - logical :: TopdriveRotaryTableConfilict - end type WarmingsType - contains - +module CWarningsVariables + implicit none + public + + type:: WarmingsType + logical :: PumpWithKellyDisconnected + logical :: PumpWithTopdriveDisconnected + logical :: Pump1PopOffValveBlown + logical :: Pump1Failure + logical :: Pump2PopOffValveBlown + logical :: Pump2Failure + logical :: Pump3PopOffValveBlown + logical :: Pump3Failure + logical :: DrawworksGearsAbuse + logical :: RotaryGearsAbuse + logical :: HoistLineBreak + logical :: PartedDrillString + logical :: ActiveTankOverflow + logical :: ActiveTankUnderVolume + logical :: TripTankOverflow + logical :: DrillPipeTwistOff + logical :: DrillPipeParted + logical :: TripWithSlipsSet + logical :: Blowout + logical :: UndergroundBlowout + logical :: MaximumWellDepthExceeded + logical :: CrownCollision + logical :: FloorCollision + logical :: TopdriveRotaryTableConfilict + end type WarmingsType + contains + end module CWarningsVariables \ No newline at end of file diff --git a/Common/DynamicDoubleArray.f90 b/Common/DynamicDoubleArray.f90 index c835b76..4c88c84 100644 --- a/Common/DynamicDoubleArray.f90 +++ b/Common/DynamicDoubleArray.f90 @@ -1,157 +1,157 @@ -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 - - +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 \ No newline at end of file diff --git a/Common/DynamicIntegerArray.f90 b/Common/DynamicIntegerArray.f90 index 56f1363..f51aab7 100644 --- a/Common/DynamicIntegerArray.f90 +++ b/Common/DynamicIntegerArray.f90 @@ -1,159 +1,159 @@ -module DynamicIntegerArray - implicit none - public - - type, public :: DynamicIntegerArrayType - integer, 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 DynamicIntegerArrayType - private::First,Last,Length - - contains - - - integer function First(this) - implicit none - class(DynamicIntegerArrayType), intent(in) :: this - if(allocated(this%Array) .and. size(this%Array) > 0) then - First = this%Array(1) - return - end if - First = 0 - end function - - integer function Last(this) - implicit none - class(DynamicIntegerArrayType), 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(DynamicIntegerArrayType), 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(DynamicIntegerArrayType), intent(inout) :: this - integer, allocatable :: tempArr(:) - integer, 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(DynamicIntegerArrayType), intent(inout) :: this - integer, allocatable :: tempArr(:) - integer, intent(in) :: index - integer, intent(in) :: value - integer :: i, 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(DynamicIntegerArrayType), intent(inout) :: this - integer, allocatable :: tempArr(:) - integer, 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(DynamicIntegerArrayType), intent(inout) :: this - if(allocated(this%Array)) deallocate(this%Array) - end subroutine - - - subroutine Remove(this, index) - implicit none - class(DynamicIntegerArrayType), intent(inout) :: this - integer, intent(in) :: index - integer, 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 - - +module DynamicIntegerArray + implicit none + public + + type, public :: DynamicIntegerArrayType + integer, 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 DynamicIntegerArrayType + private::First,Last,Length + + contains + + + integer function First(this) + implicit none + class(DynamicIntegerArrayType), intent(in) :: this + if(allocated(this%Array) .and. size(this%Array) > 0) then + First = this%Array(1) + return + end if + First = 0 + end function + + integer function Last(this) + implicit none + class(DynamicIntegerArrayType), 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(DynamicIntegerArrayType), 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(DynamicIntegerArrayType), intent(inout) :: this + integer, allocatable :: tempArr(:) + integer, 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(DynamicIntegerArrayType), intent(inout) :: this + integer, allocatable :: tempArr(:) + integer, intent(in) :: index + integer, intent(in) :: value + integer :: i, 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(DynamicIntegerArrayType), intent(inout) :: this + integer, allocatable :: tempArr(:) + integer, 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(DynamicIntegerArrayType), intent(inout) :: this + if(allocated(this%Array)) deallocate(this%Array) + end subroutine + + + subroutine Remove(this, index) + implicit none + class(DynamicIntegerArrayType), intent(inout) :: this + integer, intent(in) :: index + integer, 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 DynamicIntegerArray \ No newline at end of file diff --git a/Common/DynamicLogicalArray.f90 b/Common/DynamicLogicalArray.f90 index 473671b..8bc5753 100644 --- a/Common/DynamicLogicalArray.f90 +++ b/Common/DynamicLogicalArray.f90 @@ -1,158 +1,158 @@ -module DynamicLogicalArray - implicit none - public - - type, public :: DynamicLogicalArrayType - logical, 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 DynamicLogicalArrayType - private::First,Last,Length - - contains - - - logical function First(this) - implicit none - class(DynamicLogicalArrayType), intent(in) :: this - if(allocated(this%Array) .and. size(this%Array) > 0) then - First = this%Array(1) - return - end if - First = 0 - end function - - logical function Last(this) - implicit none - class(DynamicLogicalArrayType), 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(DynamicLogicalArrayType), 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(DynamicLogicalArrayType), intent(inout) :: this - logical, allocatable :: tempArr(:) - logical, 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(DynamicLogicalArrayType), intent(inout) :: this - logical, allocatable :: tempArr(:) - integer, intent(in) :: index - logical, intent(in) :: value - integer :: i, 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(DynamicLogicalArrayType), intent(inout) :: this - logical, allocatable :: tempArr(:) - logical, 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(DynamicLogicalArrayType), intent(inout) :: this - if(allocated(this%Array)) deallocate(this%Array) - end subroutine - - - subroutine Remove(this, index) - implicit none - class(DynamicLogicalArrayType), intent(inout) :: this - integer, intent(in) :: index - logical, 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 - - +module DynamicLogicalArray + implicit none + public + + type, public :: DynamicLogicalArrayType + logical, 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 DynamicLogicalArrayType + private::First,Last,Length + + contains + + + logical function First(this) + implicit none + class(DynamicLogicalArrayType), intent(in) :: this + if(allocated(this%Array) .and. size(this%Array) > 0) then + First = this%Array(1) + return + end if + First = 0 + end function + + logical function Last(this) + implicit none + class(DynamicLogicalArrayType), 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(DynamicLogicalArrayType), 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(DynamicLogicalArrayType), intent(inout) :: this + logical, allocatable :: tempArr(:) + logical, 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(DynamicLogicalArrayType), intent(inout) :: this + logical, allocatable :: tempArr(:) + integer, intent(in) :: index + logical, intent(in) :: value + integer :: i, 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(DynamicLogicalArrayType), intent(inout) :: this + logical, allocatable :: tempArr(:) + logical, 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(DynamicLogicalArrayType), intent(inout) :: this + if(allocated(this%Array)) deallocate(this%Array) + end subroutine + + + subroutine Remove(this, index) + implicit none + class(DynamicLogicalArrayType), intent(inout) :: this + integer, intent(in) :: index + logical, 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 DynamicLogicalArray \ No newline at end of file diff --git a/Common/DynamicRealArray.f90 b/Common/DynamicRealArray.f90 index 5d217bf..39168ca 100644 --- a/Common/DynamicRealArray.f90 +++ b/Common/DynamicRealArray.f90 @@ -1,158 +1,158 @@ -module DynamicRealArray - implicit none - public - - type, public :: DynamicRealArrayType - real, 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 DynamicRealArrayType - private::First,Last,Length - - contains - - - real function First(this) - implicit none - class(DynamicRealArrayType), 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 function Last(this) - implicit none - class(DynamicRealArrayType), 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(DynamicRealArrayType), 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(DynamicRealArrayType), intent(inout) :: this - real, allocatable :: tempArr(:) - real, 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(DynamicRealArrayType), intent(inout) :: this - real, allocatable :: tempArr(:) - integer, intent(in) :: index - real, intent(in) :: value - integer :: i, 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(DynamicRealArrayType), intent(inout) :: this - real, allocatable :: tempArr(:) - real, 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(DynamicRealArrayType), intent(inout) :: this - if(allocated(this%Array)) deallocate(this%Array) - end subroutine - - - subroutine Remove(this, index) - implicit none - class(DynamicRealArrayType), intent(inout) :: this - integer, intent(in) :: index - real, 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 - - +module DynamicRealArray + implicit none + public + + type, public :: DynamicRealArrayType + real, 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 DynamicRealArrayType + private::First,Last,Length + + contains + + + real function First(this) + implicit none + class(DynamicRealArrayType), 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 function Last(this) + implicit none + class(DynamicRealArrayType), 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(DynamicRealArrayType), 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(DynamicRealArrayType), intent(inout) :: this + real, allocatable :: tempArr(:) + real, 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(DynamicRealArrayType), intent(inout) :: this + real, allocatable :: tempArr(:) + integer, intent(in) :: index + real, intent(in) :: value + integer :: i, 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(DynamicRealArrayType), intent(inout) :: this + real, allocatable :: tempArr(:) + real, 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(DynamicRealArrayType), intent(inout) :: this + if(allocated(this%Array)) deallocate(this%Array) + end subroutine + + + subroutine Remove(this, index) + implicit none + class(DynamicRealArrayType), intent(inout) :: this + integer, intent(in) :: index + real, 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 DynamicRealArray \ No newline at end of file diff --git a/Data Structures.txt b/Data Structures.txt index 36db7b1..e473b2e 100644 --- a/Data Structures.txt +++ b/Data Structures.txt @@ -1,134 +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 +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/Equipments/BopStack/ANNULAR.f90 b/Equipments/BopStack/ANNULAR.f90 index e691ec5..108b30b 100644 --- a/Equipments/BopStack/ANNULAR.f90 +++ b/Equipments/BopStack/ANNULAR.f90 @@ -1,429 +1,429 @@ -SUBROUTINE ANNULAR_SUB1 - use SimulationVariables - use CBopControlPanel - use SimulationVariables - use PressureDisplayVARIABLESModule - USE CEquipmentsConstants - USE CBopStackVariables - - implicit none - - !write(*,*) 'checkpoint 1' -!===================================================================== -! ANNULAR PREVENTER- BOP CAMERON Type U 5000 -! START CONDITIONS FOR ANNULAR PREVENTER -!===================================================================== - - data%State%RAM(1)%SuccessionCounter = data%State%RAM(1)%SuccessionCounter + 1 - - if (data%EquipmentControl%BopControlPanel%AnnularValve == 1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - if (data%State%BopStackInput%AnnularCloseLedMine == LedOn) then - RETURN - end if - - - if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then - data%State%RAM(1)%SuccessionCounter = 0 ! also in starup - data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter - endif - - - - if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(1)%First_CloseTimecheck= 1 - - data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOff - data%State%BopStackInput%AnnularOpenLedMine = LedOff - data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOn !LedBlinking - - data%State%RAM(1)%FourwayValve = 1 - - endif - - endif - - - if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure) then ! 1: Open , 0: Close - - - data%State%RAM(1)%FourwayValve = 0 - - - - data%State%Annular%Annular_closed=0 - !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) - data%State%RAM(1)%vdis_tot=0 - data%State%RAM(1)%vdis_bottles=0. - data%State%RAM(1)%fvr_air=0. - data%State%RAM(1)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(1)%Qzero=70 - data%State%RAM(1)%Q=data%State%RAM(1)%Qzero - data%State%RAM(1)%flow=70 - data%State%Annular%tolAnnular=0.0018 - if (data%State%Annular%finished_Annular==1) then - data%State%Annular%AnnularLeverOld=-1.0 - else - data%State%Annular%AnnularLeverOld=data%EquipmentControl%BopControlPanel%AnnularValve - endif - data%State%Annular%finished_Annular=0 - data%State%Annular%AnnularIsClosing = .true. - data%State%Annular%AnnularIsOpening = .false. - - data%State%RAM(2)%bop_type = 3 - !AbopAnnular=963.1 !(in^2) - data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerClose*231.)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) ! 231 in^3 = 1 gal - data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/(2.*231) !=17.98 galon for IDAnnularBase=13 5/8 , ODDrillpipe_inAnnularBase=5 - !WRITE(*,*) 'a)NeededVolumeAnnular=' , NeededVolumeAnnular - !write(*,*) 'close 1' - endif - - - if (data%EquipmentControl%BopControlPanel%AnnularValve == -1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 ) then - - if (data%State%BopStackInput%AnnularOpenLedMine == LedOn) then - RETURN - end if - - !CasingPressure : PressureGauges(2) *****temp conditionssssss - - !note: (AnnularSealingPressure) is only for opening while well is pressurised - - - if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then - data%State%RAM(1)%SuccessionCounter = 0 ! also in starup - data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter - endif - - - - if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(1)%First_OpenTimecheck= 1 - - data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff !new - data%State%BopStackInput%AnnularCloseLedMine = LedOff !new - data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn !LedBlinking - - data%State%RAM(1)%FourwayValve = 1 - - endif - - endif - - - - - - if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure & - .and. (data%State%Annular%Annular_closed==0 .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2) <=100.0) .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2)>100.0 .and. data%State%Annular%Pannular_reg>=data%State%AnnularComputational%AnnularSealingPressure))) then ! 1: Open , 0: Close - !write(*,*) 'open 2' - - data%State%RAM(1)%FourwayValve = 0 - - - - data%State%Annular%Annular_closed=0 - !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) - data%State%RAM(1)%vdis_tot=0 - data%State%RAM(1)%vdis_bottles=0. - data%State%RAM(1)%fvr_air=0. - data%State%RAM(1)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(1)%Qzero=70 - data%State%RAM(1)%Q=data%State%RAM(1)%Qzero - data%State%RAM(1)%flow=70 - data%State%Annular%tolAnnular=0.0018 - - - - if (data%State%Annular%finished_Annular==1) then - data%State%Annular%AnnularLeverOld=1.0 - else - data%State%Annular%AnnularLeverOld=data%EquipmentControl%BopControlPanel%AnnularValve - endif - data%State%Annular%finished_Annular=0 - data%State%Annular%AnnularIsOpening = .true. - data%State%Annular%AnnularIsClosing = .false. - - - !if (AnnularOpenLed == LedOn) then - ! RETURN - !end if - - - - data%State%RAM(1)%bop_type = 3 - !AbopAnnular=758.48 !(in^2) - data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerOpen*231)/((data%State%Annular%IDAnnularBase-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/2.) - data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnular)/(2.*231) !=14.16 galon for IDAnnularBase=13 5/8 , ODDrillpipe_inAnnular=5 - !write(*,*) 'open 1' - - endif - -!===================================================================== - -if (data%State%Annular%AnnularIsOpening .or. data%State%Annular%AnnularIsClosing .or. data%State%RAM(1)%Bottles_Charged_MalfActive) then - CALL ANNULAR_SUB2 -end if - - - - - END SUBROUTINE ANNULAR_SUB1 - - - - - - - - - - - - - - -SUBROUTINE ANNULAR_SUB2 - use SimulationVariables - use PressureDisplayVARIABLESModule - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - USE CBopStackVariables - ! use CSimulationVariables - - implicit none - - - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - - - ! loop5: do while (finished_Annular==0) - - !write(*,*) 'checkpoint 2' - - - data%State%RAM(1)%SuccessionCounter = data%State%RAM(1)%SuccessionCounter + 1 - - ! CALL CPU_TIME(Annular_StartTime) - - if (data%EquipmentControl%BopControlPanel%AnnularValve == 1.0 .and. data%State%Annular%AnnularLeverOld == -1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - if ( data%State%RAM(1)%First_CloseTimecheck == 0 ) then - - - - if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then - data%State%RAM(1)%SuccessionCounter = 0 ! also in starup - data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter - endif - - - - if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOff - data%State%BopStackInput%AnnularOpenLedMine = LedOff - data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOn !LedBlinking - - data%State%RAM(1)%FourwayValve = 1 - - endif - - endif - !write(*,*) 'chekkk 1' - - endif - - - if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - !write(*,*) 'close 4' - - data%State%RAM(1)%FourwayValve = 0 - - - data%State%Annular%Annular_closed=0 - !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) - data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular - data%State%Annular%AnnularLeverOld = data%EquipmentControl%BopControlPanel%AnnularValve - - CALL OpenAnnular - data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code - data%State%RAM(1)%bop_type = 3 - !AbopAnnular=963.1 !(in^2) - data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerClose*231)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) - !write(*,*) 'NeededVolumeShearRams1=',NeededVolumeShearRams - data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnular-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/(2*231.) - ! write(*,*) 'NeededVolumeAnnular=',NeededVolumeAnnular - - data%State%RAM(1)%vdis_bottles=0. - data%State%RAM(1)%fvr_air=0. - data%State%RAM(1)%vdis_elecp=0. - data%State%Annular%AnnularIsClosing = .true. - data%State%Annular%AnnularIsOpening = .false. - !write(*,*) 'close 2' - - endif - - if (data%EquipmentControl%BopControlPanel%AnnularValve == -1.0 .and. data%State%Annular%AnnularLeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 ) then - - !CasingPressure : PressureGauges(2) *****temp conditionssssss - - !note: (AnnularSealingPressure) is only for opening while well is pressurised - - if ( data%State%RAM(1)%First_OpenTimecheck == 0 ) then - - if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then - data%State%RAM(1)%SuccessionCounter = 0 ! also in starup - data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter - endif - - if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff - data%State%BopStackInput%AnnularCloseLedMine= LedOff - data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn !LedBlinking - - data%State%RAM(1)%FourwayValve = 1 - - endif - - endif - !write(*,*) 'chekkk 2' - - endif - - - - if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure & - .and. (data%State%Annular%Annular_closed==0 .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2) <=100.0) .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2)>100.0 .and. data%State%Annular%Pannular_reg>=data%State%AnnularComputational%AnnularSealingPressure))) then - !write(*,*) 'open 4' - - data%State%RAM(1)%FourwayValve = 0 - - - data%State%Annular%Annular_closed=0 - !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) - data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular - data%State%Annular%AnnularLeverOld = data%EquipmentControl%BopControlPanel%AnnularValve - - CALL OpenAnnular - data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code - data%State%RAM(1)%bop_type = 3 - !AbopAnnular=758.48 !(in^2) - data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerOpen*231)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) - data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-data%State%Annular%IDAnnular)/(2*231.) - data%State%RAM(1)%vdis_bottles=0. - data%State%RAM(1)%fvr_air=0. - data%State%RAM(1)%vdis_elecp=0. - - data%State%Annular%AnnularIsOpening = .true. - data%State%Annular%AnnularIsClosing = .false. - - !write(*,*) 'open 2' - - endif - - - - data%State%RAM(1)%First_CloseTimecheck = 0 - data%State%RAM(1)%First_OpenTimecheck = 0 - - data%State%RAM(1)%time=data%State%RAM(1)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - - - - -!=================================================== -! BOP -!=================================================== -if (data%State%Annular%Annular_closed==0) then !bop closing - !write(*,*) 'AnnularIsClosing,AnnularIsOpening' , AnnularIsClosing,AnnularIsOpening - call bop_codeAnnular(1) !ramtype=4 1=RNUMBER -endif !bop is closing -!================================================================ -if (data%State%Annular%Annular_closed==1) then - data%State%RAM(1)%Q=0 - !p_bop=pram_reg - data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular -endif - -data%State%RAM(1)%timecounter_ram=data%State%RAM(1)%timecounter_ram+1 - - - - - -! MiddleRamsStatus = IDshearBop -! UpperRamsStatus = IDPipeRam1 -! LowerRamsStatus = IDPipeRam2 -! AnnularStatus = IDAnnular -! AccumulatorPressureGauge = p_acc -! ManifoldPressureGauge= pram_reg -! AnnularPressureGauge=Pannular_reg -! -! -! -! WRITE(60,60) data%State%RAM(1)%time,data%State%RAM(1)%Q,data%State%RAM(1)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(1)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - ! call sleepqq(100) - - - !CALL CPU_TIME(Annular_EndTime) - ! - ! - !data%State%Pump(1)%INT_CPU_TIME=IDINT((Annular_EndTime-Annular_StartTime)*1000.) - !data%State%Pump(1)%Dt_ref=IDINT(DeltaT_BOP*1000.) - ! - !call sleepqq(data%State%Pump(1)%Dt_ref-data%State%Pump(1)%INT_CPU_TIME) - - - - - -if (data%State%Annular%Annular_closed==1) then - ! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then - data%State%Annular%finished_Annular=1 - ! endif -endif - - ! if (IsStopped == .true.) return - - - ! end do loop5 !while finished_Annular==0 - - - - - - if ( data%State%Annular%finished_Annular==1 .and. data%State%RAM(1)%Bottles_Charged_MalfActive==.true.) then - call bop_codeAnnular(1) !ramtype=4 1=RNUMBER - ! call sleepqq(100) - endif - +SUBROUTINE ANNULAR_SUB1 + use SimulationVariables + use CBopControlPanel + use SimulationVariables + use PressureDisplayVARIABLESModule + USE CEquipmentsConstants + USE CBopStackVariables + + implicit none + + !write(*,*) 'checkpoint 1' +!===================================================================== +! ANNULAR PREVENTER- BOP CAMERON Type U 5000 +! START CONDITIONS FOR ANNULAR PREVENTER +!===================================================================== + + data%State%RAM(1)%SuccessionCounter = data%State%RAM(1)%SuccessionCounter + 1 + + if (data%EquipmentControl%BopControlPanel%AnnularValve == 1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + if (data%State%BopStackInput%AnnularCloseLedMine == LedOn) then + RETURN + end if + + + if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then + data%State%RAM(1)%SuccessionCounter = 0 ! also in starup + data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter + endif + + + + if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(1)%First_CloseTimecheck= 1 + + data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOff + data%State%BopStackInput%AnnularOpenLedMine = LedOff + data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOn !LedBlinking + + data%State%RAM(1)%FourwayValve = 1 + + endif + + endif + + + if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure) then ! 1: Open , 0: Close + + + data%State%RAM(1)%FourwayValve = 0 + + + + data%State%Annular%Annular_closed=0 + !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) + data%State%RAM(1)%vdis_tot=0 + data%State%RAM(1)%vdis_bottles=0. + data%State%RAM(1)%fvr_air=0. + data%State%RAM(1)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(1)%Qzero=70 + data%State%RAM(1)%Q=data%State%RAM(1)%Qzero + data%State%RAM(1)%flow=70 + data%State%Annular%tolAnnular=0.0018 + if (data%State%Annular%finished_Annular==1) then + data%State%Annular%AnnularLeverOld=-1.0 + else + data%State%Annular%AnnularLeverOld=data%EquipmentControl%BopControlPanel%AnnularValve + endif + data%State%Annular%finished_Annular=0 + data%State%Annular%AnnularIsClosing = .true. + data%State%Annular%AnnularIsOpening = .false. + + data%State%RAM(2)%bop_type = 3 + !AbopAnnular=963.1 !(in^2) + data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerClose*231.)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) ! 231 in^3 = 1 gal + data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/(2.*231) !=17.98 galon for IDAnnularBase=13 5/8 , ODDrillpipe_inAnnularBase=5 + !WRITE(*,*) 'a)NeededVolumeAnnular=' , NeededVolumeAnnular + !write(*,*) 'close 1' + endif + + + if (data%EquipmentControl%BopControlPanel%AnnularValve == -1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 ) then + + if (data%State%BopStackInput%AnnularOpenLedMine == LedOn) then + RETURN + end if + + !CasingPressure : PressureGauges(2) *****temp conditionssssss + + !note: (AnnularSealingPressure) is only for opening while well is pressurised + + + if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then + data%State%RAM(1)%SuccessionCounter = 0 ! also in starup + data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter + endif + + + + if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(1)%First_OpenTimecheck= 1 + + data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff !new + data%State%BopStackInput%AnnularCloseLedMine = LedOff !new + data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn !LedBlinking + + data%State%RAM(1)%FourwayValve = 1 + + endif + + endif + + + + + + if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure & + .and. (data%State%Annular%Annular_closed==0 .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2) <=100.0) .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2)>100.0 .and. data%State%Annular%Pannular_reg>=data%State%AnnularComputational%AnnularSealingPressure))) then ! 1: Open , 0: Close + !write(*,*) 'open 2' + + data%State%RAM(1)%FourwayValve = 0 + + + + data%State%Annular%Annular_closed=0 + !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) + data%State%RAM(1)%vdis_tot=0 + data%State%RAM(1)%vdis_bottles=0. + data%State%RAM(1)%fvr_air=0. + data%State%RAM(1)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(1)%Qzero=70 + data%State%RAM(1)%Q=data%State%RAM(1)%Qzero + data%State%RAM(1)%flow=70 + data%State%Annular%tolAnnular=0.0018 + + + + if (data%State%Annular%finished_Annular==1) then + data%State%Annular%AnnularLeverOld=1.0 + else + data%State%Annular%AnnularLeverOld=data%EquipmentControl%BopControlPanel%AnnularValve + endif + data%State%Annular%finished_Annular=0 + data%State%Annular%AnnularIsOpening = .true. + data%State%Annular%AnnularIsClosing = .false. + + + !if (AnnularOpenLed == LedOn) then + ! RETURN + !end if + + + + data%State%RAM(1)%bop_type = 3 + !AbopAnnular=758.48 !(in^2) + data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerOpen*231)/((data%State%Annular%IDAnnularBase-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/2.) + data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnular)/(2.*231) !=14.16 galon for IDAnnularBase=13 5/8 , ODDrillpipe_inAnnular=5 + !write(*,*) 'open 1' + + endif + +!===================================================================== + +if (data%State%Annular%AnnularIsOpening .or. data%State%Annular%AnnularIsClosing .or. data%State%RAM(1)%Bottles_Charged_MalfActive) then + CALL ANNULAR_SUB2 +end if + + + + + END SUBROUTINE ANNULAR_SUB1 + + + + + + + + + + + + + + +SUBROUTINE ANNULAR_SUB2 + use SimulationVariables + use PressureDisplayVARIABLESModule + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + USE CBopStackVariables + ! use CSimulationVariables + + implicit none + + + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + + + ! loop5: do while (finished_Annular==0) + + !write(*,*) 'checkpoint 2' + + + data%State%RAM(1)%SuccessionCounter = data%State%RAM(1)%SuccessionCounter + 1 + + ! CALL CPU_TIME(Annular_StartTime) + + if (data%EquipmentControl%BopControlPanel%AnnularValve == 1.0 .and. data%State%Annular%AnnularLeverOld == -1.0 .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + if ( data%State%RAM(1)%First_CloseTimecheck == 0 ) then + + + + if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then + data%State%RAM(1)%SuccessionCounter = 0 ! also in starup + data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter + endif + + + + if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOff + data%State%BopStackInput%AnnularOpenLedMine = LedOff + data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOn !LedBlinking + + data%State%RAM(1)%FourwayValve = 1 + + endif + + endif + !write(*,*) 'chekkk 1' + + endif + + + if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + !write(*,*) 'close 4' + + data%State%RAM(1)%FourwayValve = 0 + + + data%State%Annular%Annular_closed=0 + !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) + data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular + data%State%Annular%AnnularLeverOld = data%EquipmentControl%BopControlPanel%AnnularValve + + CALL OpenAnnular + data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code + data%State%RAM(1)%bop_type = 3 + !AbopAnnular=963.1 !(in^2) + data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerClose*231)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) + !write(*,*) 'NeededVolumeShearRams1=',NeededVolumeShearRams + data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnular-max(data%State%Annular%ODDrillpipe_inAnnular,data%State%Annular%ODDrillpipe_inAnnularBase))/(2*231.) + ! write(*,*) 'NeededVolumeAnnular=',NeededVolumeAnnular + + data%State%RAM(1)%vdis_bottles=0. + data%State%RAM(1)%fvr_air=0. + data%State%RAM(1)%vdis_elecp=0. + data%State%Annular%AnnularIsClosing = .true. + data%State%Annular%AnnularIsOpening = .false. + !write(*,*) 'close 2' + + endif + + if (data%EquipmentControl%BopControlPanel%AnnularValve == -1.0 .and. data%State%Annular%AnnularLeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%Annular%AnnularFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 ) then + + !CasingPressure : PressureGauges(2) *****temp conditionssssss + + !note: (AnnularSealingPressure) is only for opening while well is pressurised + + if ( data%State%RAM(1)%First_OpenTimecheck == 0 ) then + + if ( data%State%RAM(1)%SuccessionCounter /= data%State%RAM(1)%SuccessionCounterOld+1 ) then + data%State%RAM(1)%SuccessionCounter = 0 ! also in starup + data%State%RAM(1)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(1)%SuccessionCounterOld= data%State%RAM(1)%SuccessionCounter + endif + + if ( data%State%RAM(1)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff + data%State%BopStackInput%AnnularCloseLedMine= LedOff + data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn !LedBlinking + + data%State%RAM(1)%FourwayValve = 1 + + endif + + endif + !write(*,*) 'chekkk 2' + + endif + + + + if (data%State%RAM(1)%FourwayValve == 1 .and. data%State%Annular%Pannular_reg>data%State%AnnularComputational%AnnularMovingPressure & + .and. (data%State%Annular%Annular_closed==0 .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2) <=100.0) .or. (data%State%Annular%Annular_closed==1 .and. data%State%PressureDisplay%PressureGauges(2)>100.0 .and. data%State%Annular%Pannular_reg>=data%State%AnnularComputational%AnnularSealingPressure))) then + !write(*,*) 'open 4' + + data%State%RAM(1)%FourwayValve = 0 + + + data%State%Annular%Annular_closed=0 + !Annular_closed_withPossibility= Annular_closed * TD_BOPConnectionPossibility(1) + data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular + data%State%Annular%AnnularLeverOld = data%EquipmentControl%BopControlPanel%AnnularValve + + CALL OpenAnnular + data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code + data%State%RAM(1)%bop_type = 3 + !AbopAnnular=758.48 !(in^2) + data%State%Annular%AbopAnnular=(data%Configuration%BopStack%AnnularPreventerOpen*231)/((data%State%Annular%IDAnnularBase-data%State%Annular%ODDrillpipe_inAnnularBase)/2.) + data%State%Annular%NeededVolumeAnnular=data%State%Annular%AbopAnnular*(data%State%Annular%IDAnnularBase-data%State%Annular%IDAnnular)/(2*231.) + data%State%RAM(1)%vdis_bottles=0. + data%State%RAM(1)%fvr_air=0. + data%State%RAM(1)%vdis_elecp=0. + + data%State%Annular%AnnularIsOpening = .true. + data%State%Annular%AnnularIsClosing = .false. + + !write(*,*) 'open 2' + + endif + + + + data%State%RAM(1)%First_CloseTimecheck = 0 + data%State%RAM(1)%First_OpenTimecheck = 0 + + data%State%RAM(1)%time=data%State%RAM(1)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + + + + +!=================================================== +! BOP +!=================================================== +if (data%State%Annular%Annular_closed==0) then !bop closing + !write(*,*) 'AnnularIsClosing,AnnularIsOpening' , AnnularIsClosing,AnnularIsOpening + call bop_codeAnnular(1) !ramtype=4 1=RNUMBER +endif !bop is closing +!================================================================ +if (data%State%Annular%Annular_closed==1) then + data%State%RAM(1)%Q=0 + !p_bop=pram_reg + data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular +endif + +data%State%RAM(1)%timecounter_ram=data%State%RAM(1)%timecounter_ram+1 + + + + + +! MiddleRamsStatus = IDshearBop +! UpperRamsStatus = IDPipeRam1 +! LowerRamsStatus = IDPipeRam2 +! AnnularStatus = IDAnnular +! AccumulatorPressureGauge = p_acc +! ManifoldPressureGauge= pram_reg +! AnnularPressureGauge=Pannular_reg +! +! +! +! WRITE(60,60) data%State%RAM(1)%time,data%State%RAM(1)%Q,data%State%RAM(1)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(1)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + ! call sleepqq(100) + + + !CALL CPU_TIME(Annular_EndTime) + ! + ! + !data%State%Pump(1)%INT_CPU_TIME=IDINT((Annular_EndTime-Annular_StartTime)*1000.) + !data%State%Pump(1)%Dt_ref=IDINT(DeltaT_BOP*1000.) + ! + !call sleepqq(data%State%Pump(1)%Dt_ref-data%State%Pump(1)%INT_CPU_TIME) + + + + + +if (data%State%Annular%Annular_closed==1) then + ! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then + data%State%Annular%finished_Annular=1 + ! endif +endif + + ! if (IsStopped == .true.) return + + + ! end do loop5 !while finished_Annular==0 + + + + + + if ( data%State%Annular%finished_Annular==1 .and. data%State%RAM(1)%Bottles_Charged_MalfActive==.true.) then + call bop_codeAnnular(1) !ramtype=4 1=RNUMBER + ! call sleepqq(100) + endif + END SUBROUTINE ANNULAR_SUB2 \ No newline at end of file diff --git a/Equipments/BopStack/AnnularMain.f90 b/Equipments/BopStack/AnnularMain.f90 index c28e3e5..62e2646 100644 --- a/Equipments/BopStack/AnnularMain.f90 +++ b/Equipments/BopStack/AnnularMain.f90 @@ -1,36 +1,36 @@ -module AnnularMain - implicit none - public - contains - - ! subroutine Annular_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(Annular_Init) - ! call OnSimulationStop%Add(Annular_Init) - ! call OnAnnularStep%Add(Annular_Step) - ! call OnAnnularOutput%Add(Annular_Output) - ! call OnAnnularMain%Add(AnnularMainBody) - ! end subroutine - - ! subroutine Annular_Init - ! implicit none - ! end subroutine Annular_Init - - subroutine Annular_Step - use SimulationVariables - implicit none - if (data%State%Annular%finished_Annular/=0) then - call ANNULAR_SUB1 - if (data%State%Annular%AnnularIsOpening .or. data%State%Annular%AnnularIsClosing .or. data%State%RAM(1)%Bottles_Charged_MalfActive) then - if(data%State%Annular%finished_Annular==0) then - call ANNULAR_SUB2 !only body of loop2 - endif - endif - else - call ANNULAR_SUB2 - endif - end subroutine Annular_Step - - +module AnnularMain + implicit none + public + contains + + ! subroutine Annular_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(Annular_Init) + ! call OnSimulationStop%Add(Annular_Init) + ! call OnAnnularStep%Add(Annular_Step) + ! call OnAnnularOutput%Add(Annular_Output) + ! call OnAnnularMain%Add(AnnularMainBody) + ! end subroutine + + ! subroutine Annular_Init + ! implicit none + ! end subroutine Annular_Init + + subroutine Annular_Step + use SimulationVariables + implicit none + if (data%State%Annular%finished_Annular/=0) then + call ANNULAR_SUB1 + if (data%State%Annular%AnnularIsOpening .or. data%State%Annular%AnnularIsClosing .or. data%State%RAM(1)%Bottles_Charged_MalfActive) then + if(data%State%Annular%finished_Annular==0) then + call ANNULAR_SUB2 !only body of loop2 + endif + endif + else + call ANNULAR_SUB2 + endif + end subroutine Annular_Step + + end module AnnularMain \ No newline at end of file diff --git a/Equipments/BopStack/BOP.f90 b/Equipments/BopStack/BOP.f90 index 3a9b3ab..176b5c2 100644 --- a/Equipments/BopStack/BOP.f90 +++ b/Equipments/BopStack/BOP.f90 @@ -1,304 +1,304 @@ -module BOP - contains - - subroutine BopStack_Init - call BOP_StartUp - end subroutine BopStack_Init - - subroutine BopStack_Step - use SimulationVariables - use CBopControlPanel - use BopVariables - use SimulationVariables !@ - ! USE CEquipmentsConstants - use CSounds - implicit none - - - data%State%BopStackInput%BOP_timeCounter= data%State%BopStackInput%BOP_timeCounter + 1 - - write(*,*) 'BOP_timeCounter=' , data%State%BopStackInput%BOP_timeCounter - - data%EquipmentControl%BopControlPanel%AirSupplyPressureGauge= (1 - data%State%BopStackAcc%AirSupplyPressureGaugeMalf)* (1 - data%State%BopStackAcc%RigAirMalf) *120. !psi - - - if (data%State%BopStackAcc%pram_reg < 2300.) then - data%State%ShearRAM%ShearIsNotAllowed= 1 - else - data%State%ShearRAM%ShearIsNotAllowed= 0 - endif - - !write(*,*) 'ShearIsNotAllowed=' , ShearIsNotAllowed - - - !TD_AnnularFillingFinal ! (0.0 to 1.0) percentage filled by tool joint - - - !====================================================================== - ! MAIN BODY OF PROGRAM - ! PURPOSE: BOP Control - !====================================================================== - - - !=== Instantaneous Pipe Diameters in Each Ram (Input from TD Module):== - data%State%Annular%ODDrillpipe_inAnnular= data%State%TD_BOP%AnnularPreventerDiam * 12.0 ! ft to inch - data%State%PipeRam1%ODDrillpipe_in= data%State%TD_BOP%UpperRamDiam * 12.0 - data%State%ShearRAM%ODDrillpipe_inShearRam= data%State%TD_BOP%BlindRamDiam * 12.0 - data%State%PipeRam2%ODDrillpipe_in= data%State%TD_BOP%LowerRamDiam * 12.0 - - - - !IDshearBopFinal - !IDPipeRam1Final - !IDPipeRam2Final - !IDAnnularFinal - - data%State%ShearRAM%OpenArea_shearBop= PI*(data%State%ShearRAM%IDshearBopFinal**2-data%State%ShearRAM%ODDrillpipe_inShearRam**2)/4.0d0 !D(in), AREA(in^2) - data%State%ShearRAM%OpenArea_PipeRam1= PI*(data%State%ShearRAM%IDPipeRam1Final**2-data%State%PipeRam1%ODDrillpipe_in**2)/4.0d0 !D(in), AREA(in^2) - data%State%ShearRAM%OpenArea_PipeRam2= PI*(data%State%ShearRAM%IDPipeRam2Final**2-data%State%PipeRam2%ODDrillpipe_in**2)/4.0d0 !D(in), AREA(in^2) - data%State%ShearRAM%OpenArea_Annular= PI*(data%State%ShearRAM%IDAnnularFinal**2-data%State%Annular%ODDrillpipe_inAnnular**2)/4.0d0 !D(in), AREA(in^2) - - data%State%ShearRAM%MinimumOpenArea_InBOP= min(data%State%ShearRAM%OpenArea_shearBop,data%State%ShearRAM%OpenArea_PipeRam1,data%State%ShearRAM%OpenArea_PipeRam2,data%State%ShearRAM%OpenArea_Annular) - - !TD_BOPConnectionPossibility(j) = 0 or 1 - - !!!AnnularPreventerDiam = TD_BOPConnectionPossibility(1) >> used in Annular code - !!!UpperRamDiam = TD_BOPConnectionPossibility(2) >> used in PipeRam1 code - !!!BlindRamDiam = TD_BOPConnectionPossibility(3) >> used in ShearRam code - !!!LowerRamDiam = TD_BOPConnectionPossibility(4) >> used in PipeRam2 code - - !===================================================================== - !============SEALING PRESSURES TO BE SET IN ANNULAR REGULATOR========== - data%State%AnnularComputational%WellBorePressure=5000. - if (data%State%Annular%ODDrillpipe_inAnnular>0.) then - if (data%State%Annular%ODDrillpipe_inAnnular>0. .and. data%State%Annular%ODDrillpipe_inAnnular<=1.99) then - data%State%AnnularComputational%acoef=-0.2673 - data%State%AnnularComputational%Bcoef=994.3 - data%State%AnnularComputational%const=77 - elseif (data%State%Annular%ODDrillpipe_inAnnular>1.99 .and. data%State%Annular%ODDrillpipe_inAnnular<=2.375) then - data%State%AnnularComputational%acoef=-0.2539 - data%State%AnnularComputational%Bcoef=994.3 - data%State%AnnularComputational%const=73.15 - elseif (data%State%Annular%ODDrillpipe_inAnnular>2.375 .and. data%State%Annular%ODDrillpipe_inAnnular<=2.875) then - data%State%AnnularComputational%acoef=-0.2005 - data%State%AnnularComputational%Bcoef=745.9 - data%State%AnnularComputational%const=57.75 - elseif (data%State%Annular%ODDrillpipe_inAnnular>2.875 .and. data%State%Annular%ODDrillpipe_inAnnular<=3.5) then - data%State%AnnularComputational%acoef=-0.1871 - data%State%AnnularComputational%Bcoef=696.1 - data%State%AnnularComputational%const=53.9 - elseif (data%State%Annular%ODDrillpipe_inAnnular>3.5 .and. data%State%Annular%ODDrillpipe_inAnnular<=5) then - data%State%AnnularComputational%acoef=-0.1733 - data%State%AnnularComputational%Bcoef=647 - data%State%AnnularComputational%const=50 - elseif (data%State%Annular%ODDrillpipe_inAnnular>5 .and. data%State%Annular%ODDrillpipe_inAnnular<=10) then - data%State%AnnularComputational%acoef=-0.1604 - data%State%AnnularComputational%Bcoef=596.7 - data%State%AnnularComputational%const=46.2 - endif - data%State%AnnularComputational%AnnularSealingPressure= max((data%State%AnnularComputational%acoef*data%State%AnnularComputational%WellBorePressure+data%State%AnnularComputational%Bcoef), data%State%AnnularComputational%const) !(psi) - else !CSO(COMPLETE SHUT OFF) ODDrillpipe_inAnnular=0 - data%State%AnnularComputational%AnnularSealingPressure= 1150. !(psi) - endif - - !===================================================================== - ! BYPASS POSITION - !===================================================================== - if(data%EquipmentControl%BopControlPanel%ByePassValve == -1.0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - data%State%BopStackAcc%ByPassOld= -1.0 - !write(*,*) 'ByePassValve to -1' ,ByePassValve - elseif(data%EquipmentControl%BopControlPanel%ByePassValve == 1.0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - data%State%BopStackAcc%ByPassOld= 1.0 - !write(*,*) 'ByePassValve to 1=' ,ByePassValve - endif - !write(*,*) 'ByePassValve,ByPassOld=' ,ByePassValve,ByPassOld - !===================================================================== - !WRITE(*,*) 'AnnularRegulatorSetControl====' , AnnularRegulatorSetControl - data%State%Annular%Pannular_regset=min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) ! for changing its set conditions instantaneously - if (data%State%Annular%Annular_closed==1) then - if (data%State%Annular%FirstSet==1) then ! code start - data%State%Annular%Pannular_reg= data%State%Annular%Pannular_regset - endif - - if (data%State%Annular%FirstSet==0) then ! durig run, but annular is not closing or opening - data%State%Annular%Pannular_reg= min(data%State%RamLine%P_ACC,data%State%Annular%Pannular_regset) - endif - endif - - !=================================================================== - ! Annular Preventer Pressure Rise On Tooljoint - !=================================================================== - if ( data%State%Annular%Annular_Situation_forTD == 1 .and. data%State%TD_BOP%AnnularFillingFinal==0.0 ) then ! Annular_Situation_forTD= 1 ! closed - for TD code - data%State%AnnularComputational%AnnPressureRise= .true. - elseif ( data%State%Annular%Annular_Situation_forTD == 0 ) then - data%State%AnnularComputational%AnnPressureRise= .false. - endif - - if (data%State%AnnularComputational%AnnPressureRise == .true.) then - data%State%Annular%Pannular_reg= data%State%Annular%Pannular_reg + 200. * data%State%TD_BOP%AnnularFillingFinal ! 200 psi pressure rise when 100% of AnnPreventer is filled by tool joint - !TD_AnnularFillingFinal ! (0.0 to 1.0) percentage filled by tool joint - endif - !=================================================================== - if (data%State%Annular%FirstSet== 1) then - !new= (1 - AnnularPressureGaugeMalf) * min(AnnularRegulatorSetControl,1700.) - CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst( (1 - data%State%Annular%AnnularPressureGaugeMalf) * min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) ) - CALL data%State%AnnularComputational%Pannular_regDelay%Remove(data%State%AnnularComputational%Pannular_regDelay%Length()) - data%EquipmentControl%BopControlPanel%AnnularPressureGauge= data%State%AnnularComputational%Pannular_regDelay%Last() - !AnnularPressureGauge= (1 - AnnularPressureGaugeMalf) * min(AnnularRegulatorSetControl,1700.) - !write(*,*) 'set 1' , AnnularPressureGauge - else !FirstSet== 0 - !new= (1 - AnnularPressureGaugeMalf) * Pannular_reg - - CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst( (1 - data%State%Annular%AnnularPressureGaugeMalf) * data%State%Annular%Pannular_reg) - CALL data%State%AnnularComputational%Pannular_regDelay%Remove(data%State%AnnularComputational%Pannular_regDelay%Length()) - data%EquipmentControl%BopControlPanel%AnnularPressureGauge= data%State%AnnularComputational%Pannular_regDelay%Last() - !AnnularPressureGauge= (1 - AnnularPressureGaugeMalf) * Pannular_reg - !write(*,*) 'set 0' , AnnularPressureGauge - endif - - !=================================================== - ! AIR OPERATED PUMP CODE- START - !=================================================== - if (data%State%RamLine%P_ACCdata%State%Pumps%AIR_OFF .and. data%State%RamLine%AIRP_SWITCH==1) then - data%State%RamLine%AIRP_SWITCH=0 - call SetSoundKoomeyAirPump(data%State%RamLine%AIRP_SWITCH) - endif - - if (data%State%RamLine%P_ACCdata%State%Pumps%ELECTRIC_OFF .and. data%State%RamLine%ELECP_SWITCH==1) then - data%State%RamLine%ELECP_SWITCH=0 - endif - - !write(*,*) 'airp_switch,elecp_switch=' , airp_switch,elecp_switch - !================CHARGING BOTTLES======================= - if (data%State%RamLine%AIRP_SWITCH==1 .or. data%State%RamLine%ELECP_SWITCH==1) then - if (data%State%Annular%Annular_closed==1 .and. data%State%RamLine%ShearBop_closed==1 .and. data%State%PipeRam1%closed==1 .and. data%State%PipeRam2%closed==1 .and. data%State%ChokeLine%closed==1 .and. data%State%KillLine%closed==1) then - call pumps_charge_bottle() - ! increases volume and pressure in the bottles - if (data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_ChargedPressure) then - data%State%RamLine%P_ACC=data%State%BopStackAcc%acc_ChargedPressure - if (data%State%Annular%AnnularLeakMalf== 0) then - !finished_Annular=1 - data%State%RAM(1)%Bottles_Charged_MalfActive= .false. - else - data%State%Annular%finished_Annular=0 - data%State%RAM(1)%Bottles_Charged_MalfActive= .true. - !fvr=fvr-2.5 - endif - if (data%State%PipeRam1%UpperRamsLeakMalf== 0) then - !finished_pipe1=1 - data%State%RAM(2)%Bottles_Charged_MalfActive= .false. - else - data%State%PipeRam1%finished=0 - data%State%RAM(2)%Bottles_Charged_MalfActive= .true. - !fvr=fvr-2.5 - endif - - if (data%State%PipeRam2%LowerRamsLeakMalf== 0) then - !finished_pipe2=1 - data%State%RAM(3)%Bottles_Charged_MalfActive= .false. - else - data%State%PipeRam2%finished=0 - data%State%RAM(3)%Bottles_Charged_MalfActive= .true. - !fvr=fvr-2.5 - endif - if (data%State%ShearRAM%MiddleRamsLeakMalf== 0) then - !finished_shear=1 - data%State%RAM(4)%Bottles_Charged_MalfActive= .false. - else - data%State%RamLine%FINISHED_shear=0 - data%State%RAM(4)%Bottles_Charged_MalfActive= .true. - !fvr=fvr-2.5 - endif - - data%State%KillLine%finished=1 - data%State%ChokeLine%finished=1 - - - if (data%State%Annular%AnnularLeakMalf== 0 .and. data%State%PipeRam1%UpperRamsLeakMalf== 0 .and. data%State%PipeRam2%LowerRamsLeakMalf== 0 .and. data%State%ShearRAM%MiddleRamsLeakMalf== 0) then - data%State%RamLine%ELECP_SWITCH=0 - data%State%RamLine%AIRP_SWITCH=0 - endif - endif - endif - endif - - !======================================================= - if (data%State%RamLine%ELECP_SWITCH==1 .and. data%State%BopStackAcc%AccPupmsFailMalf==0) then !on position - data%State%Pumps%DELTAV_ELECP=data%State%Pumps%QELECTRIC*data%State%RamLine%DeltaT_BOP/60. !QELECTRIC_PUMP(gpm), deltav_elecp(gal), DeltaT_BOP(0.1 sec) - data%State%Pumps%SoundKoomeyElectric= .True. - else - data%State%Pumps%DELTAV_ELECP=0 - data%State%Pumps%SoundKoomeyElectric= .false. - endif - - !call SetSoundKoomeyElectricPump(SoundKoomeyElectricPump) - if (data%State%RamLine%AIRP_SWITCH==1 .and. data%State%BopStackAcc%AccPupmsFailMalf==0) then !on position - call airpump_code() !ramtype=2 - end if ! if (airp_switch==1) then !on position - - - !===============AIR OPERATED PUMP CODE- END================ - if (data%State%RamLine%ShearBop_closed==1 .and. data%State%PipeRam1%closed==1 .and. data%State%PipeRam2%closed==1 .and. data%State%ChokeLine%closed==1 .and. data%State%KillLine%closed==1) then - - !write(*,*) ' All Rams are closed' - - if(data%State%BopStackAcc%ByPassOld== -1.0) then ! (OPEN POSITION) - !old=pram_reg - !new=p_acc- MAXVAL(data%State%RAM%loss_before) - !difference= new-old - data%State%BopStackAcc%PressureDifference= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) - data%State%BopStackAcc%pram_reg - if (ABS(data%State%BopStackAcc%PressureDifference) > BaseDifferenceP) then !BaseDifferenceP= 300. psi - data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. - else - data%State%BopStackAcc%pram_reg= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) ! mishe khate paeen ye shart gozasht ke pacc=3000 shod, in adad dige kam nashe - endif - - elseif (data%State%BopStackAcc%ByPassOld== 1.0) then ! (CLOSE POSITION) - !pram_reg= prams_regset - !if (RamsFirstSet==1) then - !write(*,*) 'bypass CLOSE POSITION' - !old=pram_reg - !new=prams_regset - !difference= new-old - data%State%BopStackAcc%PressureDifference= data%State%BopStackAcc%PRAMS_REGSET - data%State%BopStackAcc%pram_reg - !write(*,*) 'PressureDifference, prams_regset , pram_reg=' , PressureDifference, prams_regset , pram_reg - - if (ABS(data%State%BopStackAcc%PressureDifference) > BaseDifferenceP) then !BaseDifferenceP= 200. ! psi in starup - data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. in startup - else - data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%PRAMS_REGSET - endif - !write(*,*) 'pram_reg=' , pram_reg - - !endif ! if (RamsFirstSet==1) then - endif - - - endif - - data%EquipmentControl%BopControlPanel%MiddleRamsStatus = data%State%ShearRAM%IDshearBop - data%EquipmentControl%BopControlPanel%UpperRamsStatus = data%State%PipeRam1%ID - data%EquipmentControl%BopControlPanel%LowerRamsStatus = data%State%PipeRam2%ID - data%EquipmentControl%BopControlPanel%AnnularStatus = data%State%Annular%IDAnnular - data%EquipmentControl%BopControlPanel%AccumulatorPressureGauge = (1 - data%State%BopStackAcc%AccumulatorPressureGaugeMalf) * data%State%RamLine%P_ACC - data%EquipmentControl%BopControlPanel%ManifoldPressureGauge= (1 - data%State%BopStackAcc%ManifoldPressureGaugeMalf) * data%State%BopStackAcc%pram_reg - !AnnularPressureGauge=Pannular_reg - ! - ! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & - ! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & - ! IDPipeRam1,IDPipeRam2,IDAnnular - !60 FORMAT(11(f18.5)) - !WRITE(*,*) 'IDAnnular=' , IDAnnular - !write(*,*) 'elecp_switch=' , elecp_switch - !call sleepqq(100) - end subroutine BopStack_Step - +module BOP + contains + + subroutine BopStack_Init + call BOP_StartUp + end subroutine BopStack_Init + + subroutine BopStack_Step + use SimulationVariables + use CBopControlPanel + use BopVariables + use SimulationVariables !@ + ! USE CEquipmentsConstants + use CSounds + implicit none + + + data%State%BopStackInput%BOP_timeCounter= data%State%BopStackInput%BOP_timeCounter + 1 + + write(*,*) 'BOP_timeCounter=' , data%State%BopStackInput%BOP_timeCounter + + data%EquipmentControl%BopControlPanel%AirSupplyPressureGauge= (1 - data%State%BopStackAcc%AirSupplyPressureGaugeMalf)* (1 - data%State%BopStackAcc%RigAirMalf) *120. !psi + + + if (data%State%BopStackAcc%pram_reg < 2300.) then + data%State%ShearRAM%ShearIsNotAllowed= 1 + else + data%State%ShearRAM%ShearIsNotAllowed= 0 + endif + + !write(*,*) 'ShearIsNotAllowed=' , ShearIsNotAllowed + + + !TD_AnnularFillingFinal ! (0.0 to 1.0) percentage filled by tool joint + + + !====================================================================== + ! MAIN BODY OF PROGRAM + ! PURPOSE: BOP Control + !====================================================================== + + + !=== Instantaneous Pipe Diameters in Each Ram (Input from TD Module):== + data%State%Annular%ODDrillpipe_inAnnular= data%State%TD_BOP%AnnularPreventerDiam * 12.0 ! ft to inch + data%State%PipeRam1%ODDrillpipe_in= data%State%TD_BOP%UpperRamDiam * 12.0 + data%State%ShearRAM%ODDrillpipe_inShearRam= data%State%TD_BOP%BlindRamDiam * 12.0 + data%State%PipeRam2%ODDrillpipe_in= data%State%TD_BOP%LowerRamDiam * 12.0 + + + + !IDshearBopFinal + !IDPipeRam1Final + !IDPipeRam2Final + !IDAnnularFinal + + data%State%ShearRAM%OpenArea_shearBop= PI*(data%State%ShearRAM%IDshearBopFinal**2-data%State%ShearRAM%ODDrillpipe_inShearRam**2)/4.0d0 !D(in), AREA(in^2) + data%State%ShearRAM%OpenArea_PipeRam1= PI*(data%State%ShearRAM%IDPipeRam1Final**2-data%State%PipeRam1%ODDrillpipe_in**2)/4.0d0 !D(in), AREA(in^2) + data%State%ShearRAM%OpenArea_PipeRam2= PI*(data%State%ShearRAM%IDPipeRam2Final**2-data%State%PipeRam2%ODDrillpipe_in**2)/4.0d0 !D(in), AREA(in^2) + data%State%ShearRAM%OpenArea_Annular= PI*(data%State%ShearRAM%IDAnnularFinal**2-data%State%Annular%ODDrillpipe_inAnnular**2)/4.0d0 !D(in), AREA(in^2) + + data%State%ShearRAM%MinimumOpenArea_InBOP= min(data%State%ShearRAM%OpenArea_shearBop,data%State%ShearRAM%OpenArea_PipeRam1,data%State%ShearRAM%OpenArea_PipeRam2,data%State%ShearRAM%OpenArea_Annular) + + !TD_BOPConnectionPossibility(j) = 0 or 1 + + !!!AnnularPreventerDiam = TD_BOPConnectionPossibility(1) >> used in Annular code + !!!UpperRamDiam = TD_BOPConnectionPossibility(2) >> used in PipeRam1 code + !!!BlindRamDiam = TD_BOPConnectionPossibility(3) >> used in ShearRam code + !!!LowerRamDiam = TD_BOPConnectionPossibility(4) >> used in PipeRam2 code + + !===================================================================== + !============SEALING PRESSURES TO BE SET IN ANNULAR REGULATOR========== + data%State%AnnularComputational%WellBorePressure=5000. + if (data%State%Annular%ODDrillpipe_inAnnular>0.) then + if (data%State%Annular%ODDrillpipe_inAnnular>0. .and. data%State%Annular%ODDrillpipe_inAnnular<=1.99) then + data%State%AnnularComputational%acoef=-0.2673 + data%State%AnnularComputational%Bcoef=994.3 + data%State%AnnularComputational%const=77 + elseif (data%State%Annular%ODDrillpipe_inAnnular>1.99 .and. data%State%Annular%ODDrillpipe_inAnnular<=2.375) then + data%State%AnnularComputational%acoef=-0.2539 + data%State%AnnularComputational%Bcoef=994.3 + data%State%AnnularComputational%const=73.15 + elseif (data%State%Annular%ODDrillpipe_inAnnular>2.375 .and. data%State%Annular%ODDrillpipe_inAnnular<=2.875) then + data%State%AnnularComputational%acoef=-0.2005 + data%State%AnnularComputational%Bcoef=745.9 + data%State%AnnularComputational%const=57.75 + elseif (data%State%Annular%ODDrillpipe_inAnnular>2.875 .and. data%State%Annular%ODDrillpipe_inAnnular<=3.5) then + data%State%AnnularComputational%acoef=-0.1871 + data%State%AnnularComputational%Bcoef=696.1 + data%State%AnnularComputational%const=53.9 + elseif (data%State%Annular%ODDrillpipe_inAnnular>3.5 .and. data%State%Annular%ODDrillpipe_inAnnular<=5) then + data%State%AnnularComputational%acoef=-0.1733 + data%State%AnnularComputational%Bcoef=647 + data%State%AnnularComputational%const=50 + elseif (data%State%Annular%ODDrillpipe_inAnnular>5 .and. data%State%Annular%ODDrillpipe_inAnnular<=10) then + data%State%AnnularComputational%acoef=-0.1604 + data%State%AnnularComputational%Bcoef=596.7 + data%State%AnnularComputational%const=46.2 + endif + data%State%AnnularComputational%AnnularSealingPressure= max((data%State%AnnularComputational%acoef*data%State%AnnularComputational%WellBorePressure+data%State%AnnularComputational%Bcoef), data%State%AnnularComputational%const) !(psi) + else !CSO(COMPLETE SHUT OFF) ODDrillpipe_inAnnular=0 + data%State%AnnularComputational%AnnularSealingPressure= 1150. !(psi) + endif + + !===================================================================== + ! BYPASS POSITION + !===================================================================== + if(data%EquipmentControl%BopControlPanel%ByePassValve == -1.0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + data%State%BopStackAcc%ByPassOld= -1.0 + !write(*,*) 'ByePassValve to -1' ,ByePassValve + elseif(data%EquipmentControl%BopControlPanel%ByePassValve == 1.0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + data%State%BopStackAcc%ByPassOld= 1.0 + !write(*,*) 'ByePassValve to 1=' ,ByePassValve + endif + !write(*,*) 'ByePassValve,ByPassOld=' ,ByePassValve,ByPassOld + !===================================================================== + !WRITE(*,*) 'AnnularRegulatorSetControl====' , AnnularRegulatorSetControl + data%State%Annular%Pannular_regset=min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) ! for changing its set conditions instantaneously + if (data%State%Annular%Annular_closed==1) then + if (data%State%Annular%FirstSet==1) then ! code start + data%State%Annular%Pannular_reg= data%State%Annular%Pannular_regset + endif + + if (data%State%Annular%FirstSet==0) then ! durig run, but annular is not closing or opening + data%State%Annular%Pannular_reg= min(data%State%RamLine%P_ACC,data%State%Annular%Pannular_regset) + endif + endif + + !=================================================================== + ! Annular Preventer Pressure Rise On Tooljoint + !=================================================================== + if ( data%State%Annular%Annular_Situation_forTD == 1 .and. data%State%TD_BOP%AnnularFillingFinal==0.0 ) then ! Annular_Situation_forTD= 1 ! closed - for TD code + data%State%AnnularComputational%AnnPressureRise= .true. + elseif ( data%State%Annular%Annular_Situation_forTD == 0 ) then + data%State%AnnularComputational%AnnPressureRise= .false. + endif + + if (data%State%AnnularComputational%AnnPressureRise == .true.) then + data%State%Annular%Pannular_reg= data%State%Annular%Pannular_reg + 200. * data%State%TD_BOP%AnnularFillingFinal ! 200 psi pressure rise when 100% of AnnPreventer is filled by tool joint + !TD_AnnularFillingFinal ! (0.0 to 1.0) percentage filled by tool joint + endif + !=================================================================== + if (data%State%Annular%FirstSet== 1) then + !new= (1 - AnnularPressureGaugeMalf) * min(AnnularRegulatorSetControl,1700.) + CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst( (1 - data%State%Annular%AnnularPressureGaugeMalf) * min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) ) + CALL data%State%AnnularComputational%Pannular_regDelay%Remove(data%State%AnnularComputational%Pannular_regDelay%Length()) + data%EquipmentControl%BopControlPanel%AnnularPressureGauge= data%State%AnnularComputational%Pannular_regDelay%Last() + !AnnularPressureGauge= (1 - AnnularPressureGaugeMalf) * min(AnnularRegulatorSetControl,1700.) + !write(*,*) 'set 1' , AnnularPressureGauge + else !FirstSet== 0 + !new= (1 - AnnularPressureGaugeMalf) * Pannular_reg + + CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst( (1 - data%State%Annular%AnnularPressureGaugeMalf) * data%State%Annular%Pannular_reg) + CALL data%State%AnnularComputational%Pannular_regDelay%Remove(data%State%AnnularComputational%Pannular_regDelay%Length()) + data%EquipmentControl%BopControlPanel%AnnularPressureGauge= data%State%AnnularComputational%Pannular_regDelay%Last() + !AnnularPressureGauge= (1 - AnnularPressureGaugeMalf) * Pannular_reg + !write(*,*) 'set 0' , AnnularPressureGauge + endif + + !=================================================== + ! AIR OPERATED PUMP CODE- START + !=================================================== + if (data%State%RamLine%P_ACCdata%State%Pumps%AIR_OFF .and. data%State%RamLine%AIRP_SWITCH==1) then + data%State%RamLine%AIRP_SWITCH=0 + call SetSoundKoomeyAirPump(data%State%RamLine%AIRP_SWITCH) + endif + + if (data%State%RamLine%P_ACCdata%State%Pumps%ELECTRIC_OFF .and. data%State%RamLine%ELECP_SWITCH==1) then + data%State%RamLine%ELECP_SWITCH=0 + endif + + !write(*,*) 'airp_switch,elecp_switch=' , airp_switch,elecp_switch + !================CHARGING BOTTLES======================= + if (data%State%RamLine%AIRP_SWITCH==1 .or. data%State%RamLine%ELECP_SWITCH==1) then + if (data%State%Annular%Annular_closed==1 .and. data%State%RamLine%ShearBop_closed==1 .and. data%State%PipeRam1%closed==1 .and. data%State%PipeRam2%closed==1 .and. data%State%ChokeLine%closed==1 .and. data%State%KillLine%closed==1) then + call pumps_charge_bottle() + ! increases volume and pressure in the bottles + if (data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_ChargedPressure) then + data%State%RamLine%P_ACC=data%State%BopStackAcc%acc_ChargedPressure + if (data%State%Annular%AnnularLeakMalf== 0) then + !finished_Annular=1 + data%State%RAM(1)%Bottles_Charged_MalfActive= .false. + else + data%State%Annular%finished_Annular=0 + data%State%RAM(1)%Bottles_Charged_MalfActive= .true. + !fvr=fvr-2.5 + endif + if (data%State%PipeRam1%UpperRamsLeakMalf== 0) then + !finished_pipe1=1 + data%State%RAM(2)%Bottles_Charged_MalfActive= .false. + else + data%State%PipeRam1%finished=0 + data%State%RAM(2)%Bottles_Charged_MalfActive= .true. + !fvr=fvr-2.5 + endif + + if (data%State%PipeRam2%LowerRamsLeakMalf== 0) then + !finished_pipe2=1 + data%State%RAM(3)%Bottles_Charged_MalfActive= .false. + else + data%State%PipeRam2%finished=0 + data%State%RAM(3)%Bottles_Charged_MalfActive= .true. + !fvr=fvr-2.5 + endif + if (data%State%ShearRAM%MiddleRamsLeakMalf== 0) then + !finished_shear=1 + data%State%RAM(4)%Bottles_Charged_MalfActive= .false. + else + data%State%RamLine%FINISHED_shear=0 + data%State%RAM(4)%Bottles_Charged_MalfActive= .true. + !fvr=fvr-2.5 + endif + + data%State%KillLine%finished=1 + data%State%ChokeLine%finished=1 + + + if (data%State%Annular%AnnularLeakMalf== 0 .and. data%State%PipeRam1%UpperRamsLeakMalf== 0 .and. data%State%PipeRam2%LowerRamsLeakMalf== 0 .and. data%State%ShearRAM%MiddleRamsLeakMalf== 0) then + data%State%RamLine%ELECP_SWITCH=0 + data%State%RamLine%AIRP_SWITCH=0 + endif + endif + endif + endif + + !======================================================= + if (data%State%RamLine%ELECP_SWITCH==1 .and. data%State%BopStackAcc%AccPupmsFailMalf==0) then !on position + data%State%Pumps%DELTAV_ELECP=data%State%Pumps%QELECTRIC*data%State%RamLine%DeltaT_BOP/60. !QELECTRIC_PUMP(gpm), deltav_elecp(gal), DeltaT_BOP(0.1 sec) + data%State%Pumps%SoundKoomeyElectric= .True. + else + data%State%Pumps%DELTAV_ELECP=0 + data%State%Pumps%SoundKoomeyElectric= .false. + endif + + !call SetSoundKoomeyElectricPump(SoundKoomeyElectricPump) + if (data%State%RamLine%AIRP_SWITCH==1 .and. data%State%BopStackAcc%AccPupmsFailMalf==0) then !on position + call airpump_code() !ramtype=2 + end if ! if (airp_switch==1) then !on position + + + !===============AIR OPERATED PUMP CODE- END================ + if (data%State%RamLine%ShearBop_closed==1 .and. data%State%PipeRam1%closed==1 .and. data%State%PipeRam2%closed==1 .and. data%State%ChokeLine%closed==1 .and. data%State%KillLine%closed==1) then + + !write(*,*) ' All Rams are closed' + + if(data%State%BopStackAcc%ByPassOld== -1.0) then ! (OPEN POSITION) + !old=pram_reg + !new=p_acc- MAXVAL(data%State%RAM%loss_before) + !difference= new-old + data%State%BopStackAcc%PressureDifference= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) - data%State%BopStackAcc%pram_reg + if (ABS(data%State%BopStackAcc%PressureDifference) > BaseDifferenceP) then !BaseDifferenceP= 300. psi + data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. + else + data%State%BopStackAcc%pram_reg= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) ! mishe khate paeen ye shart gozasht ke pacc=3000 shod, in adad dige kam nashe + endif + + elseif (data%State%BopStackAcc%ByPassOld== 1.0) then ! (CLOSE POSITION) + !pram_reg= prams_regset + !if (RamsFirstSet==1) then + !write(*,*) 'bypass CLOSE POSITION' + !old=pram_reg + !new=prams_regset + !difference= new-old + data%State%BopStackAcc%PressureDifference= data%State%BopStackAcc%PRAMS_REGSET - data%State%BopStackAcc%pram_reg + !write(*,*) 'PressureDifference, prams_regset , pram_reg=' , PressureDifference, prams_regset , pram_reg + + if (ABS(data%State%BopStackAcc%PressureDifference) > BaseDifferenceP) then !BaseDifferenceP= 200. ! psi in starup + data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. in startup + else + data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%PRAMS_REGSET + endif + !write(*,*) 'pram_reg=' , pram_reg + + !endif ! if (RamsFirstSet==1) then + endif + + + endif + + data%EquipmentControl%BopControlPanel%MiddleRamsStatus = data%State%ShearRAM%IDshearBop + data%EquipmentControl%BopControlPanel%UpperRamsStatus = data%State%PipeRam1%ID + data%EquipmentControl%BopControlPanel%LowerRamsStatus = data%State%PipeRam2%ID + data%EquipmentControl%BopControlPanel%AnnularStatus = data%State%Annular%IDAnnular + data%EquipmentControl%BopControlPanel%AccumulatorPressureGauge = (1 - data%State%BopStackAcc%AccumulatorPressureGaugeMalf) * data%State%RamLine%P_ACC + data%EquipmentControl%BopControlPanel%ManifoldPressureGauge= (1 - data%State%BopStackAcc%ManifoldPressureGaugeMalf) * data%State%BopStackAcc%pram_reg + !AnnularPressureGauge=Pannular_reg + ! + ! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & + ! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & + ! IDPipeRam1,IDPipeRam2,IDAnnular + !60 FORMAT(11(f18.5)) + !WRITE(*,*) 'IDAnnular=' , IDAnnular + !write(*,*) 'elecp_switch=' , elecp_switch + !call sleepqq(100) + end subroutine BopStack_Step + end module BOP \ No newline at end of file diff --git a/Equipments/BopStack/BOPstartup.f90 b/Equipments/BopStack/BOPstartup.f90 index e24c306..3388c11 100644 --- a/Equipments/BopStack/BOPstartup.f90 +++ b/Equipments/BopStack/BOPstartup.f90 @@ -1,325 +1,325 @@ - -SUBROUTINE BOP_StartUp() -use SimulationVariables -USE CAccumulatorVariables -USE CBopStackVariables -use CBopControlPanel - use SimulationVariables -USE CEquipmentsConstants -implicit none - -integer i - - -!UpperRamsFailureMalf=0 -!AnnularFailureMalf=0 -!LowerRamsFailureMalf=0 -!MiddleRamsFailureMalf=0 -!UpperRamsLeakMalf=0 -!LowerRamsLeakMalf=0 -!MiddleRamsLeakMalf=0 -!AnnularLeakMalf=0 -!AccPupmsFailMalf=0 -!AirSupplyPressureGauge=0 -!======================= SETTING VARIABLES - -data%State%BopStackInput%BOP_timeCounter= 0 - -!============== FOR MANIFOLD VALVES CODE===================== -CALL OpenAnnular -CALL OpenUpperRams -CALL OpenMiddleRams -CALL CloseKillLine -CALL CloseChokeLine -CALL OpenLowerRams - -data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code -data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code -data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code -data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code -!====================================================================== - -CALL LOSS_INPUTS() -! -!OPEN(50,FILE='AIRPUMP_OUTPUTS.DAT') -!OPEN(60,FILE='RAMS_OUTPUTS.DAT') -!====================================================================== -! GET INPUTS -!====================================================================== - -data%State%RAM%SuccessionCounter = 0 -data%State%RAM%SuccessionCounterOld = 0 - -data%State%RAM%First_CloseTimecheck= 0 -data%State%RAM%First_OpenTimecheck= 0 - - - -data%State%BopStackAcc%Cumulative_AirVolume= 0.0 - - -data%State%BopStackAcc%BOTTLE_CAPACITY=10 !(GALON) -data%State%BopStackAcc%NOBOTTLES=data%Configuration%Accumulator%NumberOfBottels - - - - - - - -!fvr_tot=40 !(GALON) IN CHARGED POSITION -data%State%BopStackAcc%PRAMS_REGSET=1500 !RamsReglatorSet !=1500 DEFAULT regulator set pressure (PSI) -data%State%BopStackAcc%acc_ChargedPressure=3000 !charged(PSI) -data%State%BopStackAcc%acc_MinPressure=data%Configuration%Accumulator%AccumulatorMinimumOperatingPressure !1200 !discharged(PSI) -!acc_precharge=1000 - - -data%State%BopStackAcc%FVR_TOT=(-2451*(data%State%BopStackAcc%acc_ChargedPressure**(-0.8202))+8.435)*data%State%BopStackAcc%NOBOTTLES ! IT IS WRRITEN FOR PRECHARGE 1000 PSI FROM ITS CURVE - -!write(*,*) 'fvr_tot=',fvr_tot - -!ELECTRIC_PUMPON=2800 -data%State%Pumps%ELECTRIC_ON=data%Configuration%Accumulator%StartPressure -!ELECTRIC_PUMPOFF=acc_ChargedPressure !=3000 psi -data%State%Pumps%ELECTRIC_OFF=data%Configuration%Accumulator%StopPressure -!QELECTRIC_PUMP=12 !(gpm) -data%State%Pumps%QELECTRIC=data%Configuration%Accumulator%ElectricPumpOutput - - - -!AIR_PUMPON=2600 -data%State%Pumps%AIR_ON=data%Configuration%Accumulator%StartPressure2 -!AIR_PUMPOFF=2900 -data%State%Pumps%AIR_OFF=data%Configuration%Accumulator%StopPressure2 - - - -data%State%RAM%tol=0.0037 !%=(2700-2600)/2700 -data%State%RAM%tolzero=data%State%RAM%tol - -data%State%Annular%tolAnnular=0.0018 !=(2900-2895)/2900 -data%State%Annular%tolzeroAnnular=data%State%Annular%tolAnnular -!======================OTHER INPUTS(CONSTANTS)=========================== -data%State%ShearRAM%PA=300 !(PSI) -data%State%ShearRAM%P_SHEAR=1200 !(PSI) -!p_shear=2423.1 !(PSI) -data%State%ShearRAM%PB=data%State%ShearRAM%P_SHEAR-data%State%ShearRAM%PA -data%State%AnnularComputational%pa_annular=100 !(psi) - - - - -data%State%Annular%IDAnnularBase=13.625 !(inch) -data%State%Annular%IDAnnular=data%State%Annular%IDAnnularBase -data%State%Annular%ODDrillpipe_inAnnularBase=5. ! so 18 gal is for complete closing of annular -data%State%Annular%ODDrillpipe_inAnnular=5. ! initial -data%State%AnnularComputational%AnnularMovingPressure=360. !(psi) -data%State%ShearRAM%IDAnnularFinal= data%State%Annular%IDAnnular - - -data%State%ShearRAM%IDshearBopBase=13.625 !(inch) -data%State%ShearRAM%IDshearBop=data%State%ShearRAM%IDshearBopBase -data%State%ShearRAM%ODDrillpipe_inShearRamBase=5 !initial -data%State%ShearRAM%ODDrillpipe_inShearRam=5 !initial -data%State%ShearRAM%IDshearBopFinal= data%State%ShearRAM%IDshearBop - -data%State%PipeRam1%IDBase=13.625 !(inch) -data%State%PipeRam1%ID=data%State%PipeRam1%IDBase -data%State%PipeRam1%ODDrillpipe_inBase=5 !initial -data%State%PipeRam1%ODDrillpipe_in=5 !initial -data%State%ShearRAM%IDPipeRam1Final= data%State%PipeRam1%ID - - -data%State%PipeRam2%ID=data%State%PipeRam1%IDBase !(inch) -data%State%PipeRam2%ODDrillpipe_inBase=5 !initial -data%State%PipeRam2%ODDrillpipe_in=5 !initial -data%State%ShearRAM%IDPipeRam2Final= data%State%PipeRam2%ID - -data%State%ChokeLine%IDBase=8.6 !(inch) -data%State%ChokeLine%ID=data%State%ChokeLine%IDBase -data%State%ChokeLine%ODDrillpipe_inBase=5 -data%State%ChokeLine%ODDrillpipe_in=5 - -data%State%KillLine%IDBase=8.6 !(inch) -data%State%KillLine%ID=data%State%KillLine%IDBase -data%State%KillLine%ODDrillpipe_inBase=5 -data%State%KillLine%ODDrillpipe_in=5 - - -!va=4 !(liter) -!vb=8 !(liter) - -!cv=2; !flow coefficinet of regulator - -data%State%ShearRAM%RAM_COURSE=320.2 !milimeter -data%State%ShearRAM%H_REGRAM=0 !(m)<<<<<<<<<<<<<<<<<<<<<<<< -data%State%ShearRAM%H_ShearRamBop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%BlindRamHeight)*0.3048 ! foot to meter -data%State%PipeRam1%H=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%UpperRamHeight)*0.3048 ! foot to meter -data%State%PipeRam2%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%LowerRamHeight)*0.3048 ! foot to meter -data%State%Annular%H_AnnularBop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%AnnularPreventerHeight)*0.3048 ! foot to meter -data%State%ChokeLine%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%KillHeight)*0.3048 ! foot to meter -data%State%KillLine%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%KillHeight)*0.3048 ! foot to meter - - -data%State%RamLine%P_ACC=data%State%BopStackAcc%acc_ChargedPressure -data%State%RAM%vdis_bottles=0 !initial discharged volume -data%State%RamLine%FVR=data%State%BopStackAcc%FVR_TOT -data%State%RAMS%minloss=0. - -!======================AIRPUMP INPUTS(CONSTANTS)=========================== - -data%State%RAM%FVR_AIR=0 -data%State%Pumps%P_AIRP=0 - -data%State%RamLine%BA1=1003; data%State%RamLine%BA2=.03375; data%State%RamLine%BA3=4.014; data%State%RamLine%BA4=.2458 -data%State%RamLine%BBA1 =31.8; data%State%RamLine%BBA2 =-725.7 ; data%State%RamLine%BBA3 =4154 - -data%State%Pumps%Qiter=7 !(gpm) - -! Q=0.0003585; true - - -data%State%RamLine%DeltaT_BOP=0.1 !second -data%State%Pumps%TOL_AIR=.08 - -data%State%Pumps%alpha_Qair=0 -data%State%Pumps%alpha_timeair=0 -data%State%Pumps%alpha_paccair=data%State%RamLine%P_ACC -data%State%Pumps%alpha_pairp=data%State%RamLine%P_ACC -data%State%Pumps%alpha_diffpair=0 -data%State%Pumps%alpha_lossesair=0 -data%State%Pumps%alpha_fvrair=0 - -data%State%RamLine%counter_airp=1 - -!======================BOP INPUTS(CONSTANTS)=========================== - - if (data%Configuration%Accumulator%PrechargePressure == 1400.) then - data%State%RamLine%B1=1396; data%State%RamLine%B2=0.17; data%State%RamLine%B3=3.873; data%State%RamLine%B4=1.101 - elseif (data%Configuration%Accumulator%PrechargePressure == 2000.) then - data%State%RamLine%B1=1980; data%State%RamLine%B2=0.1237; data%State%RamLine%B3=15.69; data%State%RamLine%B4=1.029 - elseif (data%Configuration%Accumulator%PrechargePressure == 600.) then - data%State%RamLine%B1=591.9; data%State%RamLine%B2=0.1968; data%State%RamLine%B3=2.887; data%State%RamLine%B4=0.9757 - else !(PrechargePressure == 1000.) then ! this is for precharge=1000 psi - data%State%RamLine%B1=993.7; data%State%RamLine%B2=0.164; data%State%RamLine%B3=5.492; data%State%RamLine%B4=0.9796 - endif - -data%State%BopStackAcc%ByPassOld= 1.0 - -data%State%RAM%p_bop=data%State%ShearRAM%PA -data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular -!Q=0.0055; !initial flow rate (m^3/s) -data%State%RAM%flow=60 !(gpm) initial value -data%State%RAM%Qzero=70 !for DP code, increasing Q after shear -data%State%RAM%vdis_tot=0 -data%State%RamLine%AIRP_SWITCH=0 !off position -data%State%RamLine%ELECP_SWITCH=0 !off position -data%State%RamLine%ShearBop_closed=1 -data%State%PipeRam1%closed=1 -data%State%PipeRam2%closed=1 -data%State%ChokeLine%closed=1 -data%State%KillLine%closed=1 -data%State%Annular%Annular_closed=1 -data%State%RamLine%FINISHED_shear=0 -data%State%PipeRam1%finished=0 -data%State%PipeRam2%finished=0 -data%State%ChokeLine%finished=0 -data%State%KillLine%finished=0 -data%State%Annular%finished_Annular=0 -data%State%Pumps%DELTAV_ELECP=0 -data%State%RAM%vdis_elecp=0 -!================================================================== -data%State%RAM%timecounter_ram=0 -data%State%RAM%Q=0 -data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%PRAMS_REGSET !psi !RamsReglatorSet -data%State%Annular%Pannular_reg=min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) - - - - -data%EquipmentControl%BopControlPanel%MiddleRamsStatus= data%State%ShearRAM%IDshearBop -data%EquipmentControl%BopControlPanel%UpperRamsStatus= data%State%PipeRam1%ID -data%EquipmentControl%BopControlPanel%LowerRamsStatus= data%State%PipeRam2%ID -data%EquipmentControl%BopControlPanel%AnnularStatus = data%State%Annular%IDAnnular - - -data%EquipmentControl%BopControlPanel%AccumulatorPressureGauge = data%State%RamLine%P_ACC - - -data%State%RAM%time=0 - -! WRITE(60,10) ' Overal Time','Q Ram Line','Vdis Ram Line','P Accumulator','Preg Ram Line','Preg Annular',' P BOP','ID Shear Ram', & -! 'ID Pipe Ram1','ID Pipe Ram2','ID Annular' -!10 FORMAT(11(A18)) -! -! -! -! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn - data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff - data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff - data%State%RamLine%ShearRamIsOpening = .false. - data%State%RamLine%ShearRamIsClosing = .false. - - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn - data%State%BopStackInput%UpperRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff - data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff - data%State%PipeRam1%IsOpening = .false. - data%State%PipeRam1%IsClosing = .false. - - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn - data%State%BopStackInput%LowerRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff - data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff - data%State%PipeRam2%IsOpening = .false. - data%State%PipeRam2%IsClosing = .false. - - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff - data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOn - data%State%ChokeLine%IsOpening = .false. - data%State%ChokeLine%IsClosing = .false. - - - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff - data%State%BopStackInput%KillLineOpenLedMine = LedOff - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn - data%State%BopStackInput%KillLineCloseLedMine = LedOn - data%State%KillLine%IsOpening = .false. - data%State%KillLine%IsClosing = .false. - - - data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn - data%State%BopStackInput%AnnularOpenLedMine = LedOn - - data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff - data%State%BopStackInput%AnnularCloseLedMine = LedOff - - data%State%Annular%AnnularIsOpening = .false. - data%State%Annular%AnnularIsClosing = .false. - - - data%State%Annular%FirstSet=1 - data%State%AnnularComputational%RamsFirstSet=1 - data%EquipmentControl%BopControlPanel%ManifoldPressureGauge=data%State%BopStackAcc%PRAMS_REGSET !RamsReglatorSet - data%EquipmentControl%BopControlPanel%AnnularPressureGauge= (1 - data%State%Annular%AnnularPressureGaugeMalf) * min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) - - -data%State%AnnularComputational%PannularTimeStepDelay = int(1./data%State%RamLine%DeltaT_BOP) ! 1/0.1 : for 1 sec delay in AnnRegulator shot time - - DO i = 1 , data%State%AnnularComputational%PannularTimeStepDelay - CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst(data%EquipmentControl%BopControlPanel%AnnularPressureGauge) - END DO - - - - end + +SUBROUTINE BOP_StartUp() +use SimulationVariables +USE CAccumulatorVariables +USE CBopStackVariables +use CBopControlPanel + use SimulationVariables +USE CEquipmentsConstants +implicit none + +integer i + + +!UpperRamsFailureMalf=0 +!AnnularFailureMalf=0 +!LowerRamsFailureMalf=0 +!MiddleRamsFailureMalf=0 +!UpperRamsLeakMalf=0 +!LowerRamsLeakMalf=0 +!MiddleRamsLeakMalf=0 +!AnnularLeakMalf=0 +!AccPupmsFailMalf=0 +!AirSupplyPressureGauge=0 +!======================= SETTING VARIABLES + +data%State%BopStackInput%BOP_timeCounter= 0 + +!============== FOR MANIFOLD VALVES CODE===================== +CALL OpenAnnular +CALL OpenUpperRams +CALL OpenMiddleRams +CALL CloseKillLine +CALL CloseChokeLine +CALL OpenLowerRams + +data%State%Annular%Annular_Situation_forTD= 0 ! open - for TD code +data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code +data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code +data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code +!====================================================================== + +CALL LOSS_INPUTS() +! +!OPEN(50,FILE='AIRPUMP_OUTPUTS.DAT') +!OPEN(60,FILE='RAMS_OUTPUTS.DAT') +!====================================================================== +! GET INPUTS +!====================================================================== + +data%State%RAM%SuccessionCounter = 0 +data%State%RAM%SuccessionCounterOld = 0 + +data%State%RAM%First_CloseTimecheck= 0 +data%State%RAM%First_OpenTimecheck= 0 + + + +data%State%BopStackAcc%Cumulative_AirVolume= 0.0 + + +data%State%BopStackAcc%BOTTLE_CAPACITY=10 !(GALON) +data%State%BopStackAcc%NOBOTTLES=data%Configuration%Accumulator%NumberOfBottels + + + + + + + +!fvr_tot=40 !(GALON) IN CHARGED POSITION +data%State%BopStackAcc%PRAMS_REGSET=1500 !RamsReglatorSet !=1500 DEFAULT regulator set pressure (PSI) +data%State%BopStackAcc%acc_ChargedPressure=3000 !charged(PSI) +data%State%BopStackAcc%acc_MinPressure=data%Configuration%Accumulator%AccumulatorMinimumOperatingPressure !1200 !discharged(PSI) +!acc_precharge=1000 + + +data%State%BopStackAcc%FVR_TOT=(-2451*(data%State%BopStackAcc%acc_ChargedPressure**(-0.8202))+8.435)*data%State%BopStackAcc%NOBOTTLES ! IT IS WRRITEN FOR PRECHARGE 1000 PSI FROM ITS CURVE + +!write(*,*) 'fvr_tot=',fvr_tot + +!ELECTRIC_PUMPON=2800 +data%State%Pumps%ELECTRIC_ON=data%Configuration%Accumulator%StartPressure +!ELECTRIC_PUMPOFF=acc_ChargedPressure !=3000 psi +data%State%Pumps%ELECTRIC_OFF=data%Configuration%Accumulator%StopPressure +!QELECTRIC_PUMP=12 !(gpm) +data%State%Pumps%QELECTRIC=data%Configuration%Accumulator%ElectricPumpOutput + + + +!AIR_PUMPON=2600 +data%State%Pumps%AIR_ON=data%Configuration%Accumulator%StartPressure2 +!AIR_PUMPOFF=2900 +data%State%Pumps%AIR_OFF=data%Configuration%Accumulator%StopPressure2 + + + +data%State%RAM%tol=0.0037 !%=(2700-2600)/2700 +data%State%RAM%tolzero=data%State%RAM%tol + +data%State%Annular%tolAnnular=0.0018 !=(2900-2895)/2900 +data%State%Annular%tolzeroAnnular=data%State%Annular%tolAnnular +!======================OTHER INPUTS(CONSTANTS)=========================== +data%State%ShearRAM%PA=300 !(PSI) +data%State%ShearRAM%P_SHEAR=1200 !(PSI) +!p_shear=2423.1 !(PSI) +data%State%ShearRAM%PB=data%State%ShearRAM%P_SHEAR-data%State%ShearRAM%PA +data%State%AnnularComputational%pa_annular=100 !(psi) + + + + +data%State%Annular%IDAnnularBase=13.625 !(inch) +data%State%Annular%IDAnnular=data%State%Annular%IDAnnularBase +data%State%Annular%ODDrillpipe_inAnnularBase=5. ! so 18 gal is for complete closing of annular +data%State%Annular%ODDrillpipe_inAnnular=5. ! initial +data%State%AnnularComputational%AnnularMovingPressure=360. !(psi) +data%State%ShearRAM%IDAnnularFinal= data%State%Annular%IDAnnular + + +data%State%ShearRAM%IDshearBopBase=13.625 !(inch) +data%State%ShearRAM%IDshearBop=data%State%ShearRAM%IDshearBopBase +data%State%ShearRAM%ODDrillpipe_inShearRamBase=5 !initial +data%State%ShearRAM%ODDrillpipe_inShearRam=5 !initial +data%State%ShearRAM%IDshearBopFinal= data%State%ShearRAM%IDshearBop + +data%State%PipeRam1%IDBase=13.625 !(inch) +data%State%PipeRam1%ID=data%State%PipeRam1%IDBase +data%State%PipeRam1%ODDrillpipe_inBase=5 !initial +data%State%PipeRam1%ODDrillpipe_in=5 !initial +data%State%ShearRAM%IDPipeRam1Final= data%State%PipeRam1%ID + + +data%State%PipeRam2%ID=data%State%PipeRam1%IDBase !(inch) +data%State%PipeRam2%ODDrillpipe_inBase=5 !initial +data%State%PipeRam2%ODDrillpipe_in=5 !initial +data%State%ShearRAM%IDPipeRam2Final= data%State%PipeRam2%ID + +data%State%ChokeLine%IDBase=8.6 !(inch) +data%State%ChokeLine%ID=data%State%ChokeLine%IDBase +data%State%ChokeLine%ODDrillpipe_inBase=5 +data%State%ChokeLine%ODDrillpipe_in=5 + +data%State%KillLine%IDBase=8.6 !(inch) +data%State%KillLine%ID=data%State%KillLine%IDBase +data%State%KillLine%ODDrillpipe_inBase=5 +data%State%KillLine%ODDrillpipe_in=5 + + +!va=4 !(liter) +!vb=8 !(liter) + +!cv=2; !flow coefficinet of regulator + +data%State%ShearRAM%RAM_COURSE=320.2 !milimeter +data%State%ShearRAM%H_REGRAM=0 !(m)<<<<<<<<<<<<<<<<<<<<<<<< +data%State%ShearRAM%H_ShearRamBop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%BlindRamHeight)*0.3048 ! foot to meter +data%State%PipeRam1%H=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%UpperRamHeight)*0.3048 ! foot to meter +data%State%PipeRam2%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%LowerRamHeight)*0.3048 ! foot to meter +data%State%Annular%H_AnnularBop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%AnnularPreventerHeight)*0.3048 ! foot to meter +data%State%ChokeLine%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%KillHeight)*0.3048 ! foot to meter +data%State%KillLine%H_Bop=(data%Configuration%BopStack%GroundLevel-data%Configuration%BopStack%KillHeight)*0.3048 ! foot to meter + + +data%State%RamLine%P_ACC=data%State%BopStackAcc%acc_ChargedPressure +data%State%RAM%vdis_bottles=0 !initial discharged volume +data%State%RamLine%FVR=data%State%BopStackAcc%FVR_TOT +data%State%RAMS%minloss=0. + +!======================AIRPUMP INPUTS(CONSTANTS)=========================== + +data%State%RAM%FVR_AIR=0 +data%State%Pumps%P_AIRP=0 + +data%State%RamLine%BA1=1003; data%State%RamLine%BA2=.03375; data%State%RamLine%BA3=4.014; data%State%RamLine%BA4=.2458 +data%State%RamLine%BBA1 =31.8; data%State%RamLine%BBA2 =-725.7 ; data%State%RamLine%BBA3 =4154 + +data%State%Pumps%Qiter=7 !(gpm) + +! Q=0.0003585; true + + +data%State%RamLine%DeltaT_BOP=0.1 !second +data%State%Pumps%TOL_AIR=.08 + +data%State%Pumps%alpha_Qair=0 +data%State%Pumps%alpha_timeair=0 +data%State%Pumps%alpha_paccair=data%State%RamLine%P_ACC +data%State%Pumps%alpha_pairp=data%State%RamLine%P_ACC +data%State%Pumps%alpha_diffpair=0 +data%State%Pumps%alpha_lossesair=0 +data%State%Pumps%alpha_fvrair=0 + +data%State%RamLine%counter_airp=1 + +!======================BOP INPUTS(CONSTANTS)=========================== + + if (data%Configuration%Accumulator%PrechargePressure == 1400.) then + data%State%RamLine%B1=1396; data%State%RamLine%B2=0.17; data%State%RamLine%B3=3.873; data%State%RamLine%B4=1.101 + elseif (data%Configuration%Accumulator%PrechargePressure == 2000.) then + data%State%RamLine%B1=1980; data%State%RamLine%B2=0.1237; data%State%RamLine%B3=15.69; data%State%RamLine%B4=1.029 + elseif (data%Configuration%Accumulator%PrechargePressure == 600.) then + data%State%RamLine%B1=591.9; data%State%RamLine%B2=0.1968; data%State%RamLine%B3=2.887; data%State%RamLine%B4=0.9757 + else !(PrechargePressure == 1000.) then ! this is for precharge=1000 psi + data%State%RamLine%B1=993.7; data%State%RamLine%B2=0.164; data%State%RamLine%B3=5.492; data%State%RamLine%B4=0.9796 + endif + +data%State%BopStackAcc%ByPassOld= 1.0 + +data%State%RAM%p_bop=data%State%ShearRAM%PA +data%State%AnnularComputational%p_annular=data%State%AnnularComputational%pa_annular +!Q=0.0055; !initial flow rate (m^3/s) +data%State%RAM%flow=60 !(gpm) initial value +data%State%RAM%Qzero=70 !for DP code, increasing Q after shear +data%State%RAM%vdis_tot=0 +data%State%RamLine%AIRP_SWITCH=0 !off position +data%State%RamLine%ELECP_SWITCH=0 !off position +data%State%RamLine%ShearBop_closed=1 +data%State%PipeRam1%closed=1 +data%State%PipeRam2%closed=1 +data%State%ChokeLine%closed=1 +data%State%KillLine%closed=1 +data%State%Annular%Annular_closed=1 +data%State%RamLine%FINISHED_shear=0 +data%State%PipeRam1%finished=0 +data%State%PipeRam2%finished=0 +data%State%ChokeLine%finished=0 +data%State%KillLine%finished=0 +data%State%Annular%finished_Annular=0 +data%State%Pumps%DELTAV_ELECP=0 +data%State%RAM%vdis_elecp=0 +!================================================================== +data%State%RAM%timecounter_ram=0 +data%State%RAM%Q=0 +data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%PRAMS_REGSET !psi !RamsReglatorSet +data%State%Annular%Pannular_reg=min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) + + + + +data%EquipmentControl%BopControlPanel%MiddleRamsStatus= data%State%ShearRAM%IDshearBop +data%EquipmentControl%BopControlPanel%UpperRamsStatus= data%State%PipeRam1%ID +data%EquipmentControl%BopControlPanel%LowerRamsStatus= data%State%PipeRam2%ID +data%EquipmentControl%BopControlPanel%AnnularStatus = data%State%Annular%IDAnnular + + +data%EquipmentControl%BopControlPanel%AccumulatorPressureGauge = data%State%RamLine%P_ACC + + +data%State%RAM%time=0 + +! WRITE(60,10) ' Overal Time','Q Ram Line','Vdis Ram Line','P Accumulator','Preg Ram Line','Preg Annular',' P BOP','ID Shear Ram', & +! 'ID Pipe Ram1','ID Pipe Ram2','ID Annular' +!10 FORMAT(11(A18)) +! +! +! +! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn + data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff + data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff + data%State%RamLine%ShearRamIsOpening = .false. + data%State%RamLine%ShearRamIsClosing = .false. + + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn + data%State%BopStackInput%UpperRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff + data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff + data%State%PipeRam1%IsOpening = .false. + data%State%PipeRam1%IsClosing = .false. + + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn + data%State%BopStackInput%LowerRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff + data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff + data%State%PipeRam2%IsOpening = .false. + data%State%PipeRam2%IsClosing = .false. + + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff + data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOn + data%State%ChokeLine%IsOpening = .false. + data%State%ChokeLine%IsClosing = .false. + + + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff + data%State%BopStackInput%KillLineOpenLedMine = LedOff + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn + data%State%BopStackInput%KillLineCloseLedMine = LedOn + data%State%KillLine%IsOpening = .false. + data%State%KillLine%IsClosing = .false. + + + data%EquipmentControl%BopControlPanel%AnnularOpenLED = LedOn + data%State%BopStackInput%AnnularOpenLedMine = LedOn + + data%EquipmentControl%BopControlPanel%AnnularCloseLED = LedOff + data%State%BopStackInput%AnnularCloseLedMine = LedOff + + data%State%Annular%AnnularIsOpening = .false. + data%State%Annular%AnnularIsClosing = .false. + + + data%State%Annular%FirstSet=1 + data%State%AnnularComputational%RamsFirstSet=1 + data%EquipmentControl%BopControlPanel%ManifoldPressureGauge=data%State%BopStackAcc%PRAMS_REGSET !RamsReglatorSet + data%EquipmentControl%BopControlPanel%AnnularPressureGauge= (1 - data%State%Annular%AnnularPressureGaugeMalf) * min(data%EquipmentControl%BopControlPanel%AnnularRegulatorSetControl,1700.) + + +data%State%AnnularComputational%PannularTimeStepDelay = int(1./data%State%RamLine%DeltaT_BOP) ! 1/0.1 : for 1 sec delay in AnnRegulator shot time + + DO i = 1 , data%State%AnnularComputational%PannularTimeStepDelay + CALL data%State%AnnularComputational%Pannular_regDelay%AddToFirst(data%EquipmentControl%BopControlPanel%AnnularPressureGauge) + END DO + + + + end \ No newline at end of file diff --git a/Equipments/BopStack/BlindRamsMain.f90 b/Equipments/BopStack/BlindRamsMain.f90 index fc90d49..6043b5d 100644 --- a/Equipments/BopStack/BlindRamsMain.f90 +++ b/Equipments/BopStack/BlindRamsMain.f90 @@ -1,88 +1,88 @@ -module BlindRamsMain - implicit none - public - contains - - ! subroutine BlindRams_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(BlindRams_Init) - ! call OnSimulationStop%Add(BlindRams_Init) - ! call OnBlindRamsStep%Add(BlindRams_Step) - ! call OnBlindRamsOutput%Add(BlindRams_Output) - ! call OnBlindRamsMain%Add(BlindRamsMainBody) - ! end subroutine - - ! subroutine BlindRams_Init - ! implicit none - ! end subroutine BlindRams_Init - - subroutine BlindRams_Step - use SimulationVariables - implicit none - if (data%State%RamLine%FINISHED_shear/=0) then - call SHEAR_RAMS - if (data%State%RamLine%ShearRamIsOpening .or. data%State%RamLine%ShearRamIsClosing .or. data%State%RAM(4)%Bottles_Charged_MalfActive) then - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - if(data%State%RamLine%FINISHED_shear==0) then - call SHEAR_RAMS_SUB !only body of loop2 - if (data%State%RamLine%FINISHED_shear/=0 .and. data%State%RamLine%FINISHED_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then - call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) - endif - endif - endif - else - call SHEAR_RAMS_SUB - if (data%State%RamLine%FINISHED_shear/=0 .and. data%State%RamLine%FINISHED_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then - call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) - endif - endif - - end subroutine BlindRams_Step - - ! subroutine BlindRams_Output - ! implicit none - ! end subroutine BlindRams_Output - - ! subroutine BlindRamsMainBody - ! USE ifport - ! USE ifmt - ! ! use CSimulationVariables - ! ! USE BOP - - ! implicit none - - ! INTEGER :: ShearRamDuration - ! integer,dimension(8) :: ShearRamStartTime , ShearRamEndTime - - - ! ! CALL BOP_StartUp() - ! loop1: DO - - ! CALL DATE_AND_TIME(values=ShearRamStartTime) - - - ! CALL SHEAR_RAMS - - ! CALL DATE_AND_TIME(values=ShearRamEndTime) - - ! ShearRamDuration = 3600000 * (ShearRamEndTime(5) - ShearRamStartTime(5)) + 60000 * (ShearRamEndTime(6) - ShearRamStartTime(6)) + 1000 * (ShearRamEndTime(7) - ShearRamStartTime(7)) + (ShearRamEndTime(8) - ShearRamStartTime(8)) - - ! if (ShearRamDuration < 100) then - ! call sleepqq(100 - ShearRamDuration) - ! ELSE - ! WRITE (*,*) 'ShearRam BOP run duration exceeded 100 ms and =', ShearRamDuration - ! end if - - - ! IF (IsStopped==.true.) THEN - ! EXIT loop1 - ! ENDIF - - - ! ENDDO loop1 - - ! end subroutine BlindRamsMainBody - +module BlindRamsMain + implicit none + public + contains + + ! subroutine BlindRams_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(BlindRams_Init) + ! call OnSimulationStop%Add(BlindRams_Init) + ! call OnBlindRamsStep%Add(BlindRams_Step) + ! call OnBlindRamsOutput%Add(BlindRams_Output) + ! call OnBlindRamsMain%Add(BlindRamsMainBody) + ! end subroutine + + ! subroutine BlindRams_Init + ! implicit none + ! end subroutine BlindRams_Init + + subroutine BlindRams_Step + use SimulationVariables + implicit none + if (data%State%RamLine%FINISHED_shear/=0) then + call SHEAR_RAMS + if (data%State%RamLine%ShearRamIsOpening .or. data%State%RamLine%ShearRamIsClosing .or. data%State%RAM(4)%Bottles_Charged_MalfActive) then + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + if(data%State%RamLine%FINISHED_shear==0) then + call SHEAR_RAMS_SUB !only body of loop2 + if (data%State%RamLine%FINISHED_shear/=0 .and. data%State%RamLine%FINISHED_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then + call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) + endif + endif + endif + else + call SHEAR_RAMS_SUB + if (data%State%RamLine%FINISHED_shear/=0 .and. data%State%RamLine%FINISHED_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then + call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) + endif + endif + + end subroutine BlindRams_Step + + ! subroutine BlindRams_Output + ! implicit none + ! end subroutine BlindRams_Output + + ! subroutine BlindRamsMainBody + ! USE ifport + ! USE ifmt + ! ! use CSimulationVariables + ! ! USE BOP + + ! implicit none + + ! INTEGER :: ShearRamDuration + ! integer,dimension(8) :: ShearRamStartTime , ShearRamEndTime + + + ! ! CALL BOP_StartUp() + ! loop1: DO + + ! CALL DATE_AND_TIME(values=ShearRamStartTime) + + + ! CALL SHEAR_RAMS + + ! CALL DATE_AND_TIME(values=ShearRamEndTime) + + ! ShearRamDuration = 3600000 * (ShearRamEndTime(5) - ShearRamStartTime(5)) + 60000 * (ShearRamEndTime(6) - ShearRamStartTime(6)) + 1000 * (ShearRamEndTime(7) - ShearRamStartTime(7)) + (ShearRamEndTime(8) - ShearRamStartTime(8)) + + ! if (ShearRamDuration < 100) then + ! call sleepqq(100 - ShearRamDuration) + ! ELSE + ! WRITE (*,*) 'ShearRam BOP run duration exceeded 100 ms and =', ShearRamDuration + ! end if + + + ! IF (IsStopped==.true.) THEN + ! EXIT loop1 + ! ENDIF + + + ! ENDDO loop1 + + ! end subroutine BlindRamsMainBody + end module BlindRamsMain \ No newline at end of file diff --git a/Equipments/BopStack/BopStackMain.f90 b/Equipments/BopStack/BopStackMain.f90 index 9932b5d..72ba332 100644 --- a/Equipments/BopStack/BopStackMain.f90 +++ b/Equipments/BopStack/BopStackMain.f90 @@ -1,9 +1,9 @@ -module BopStackMain - use BOP - implicit none - public -contains - subroutine BopStack_Step - CALL BOP_MainBody - end subroutine BopStack_Step +module BopStackMain + use BOP + implicit none + public +contains + subroutine BopStack_Step + CALL BOP_MainBody + end subroutine BopStack_Step END MODULE BopStackMain \ No newline at end of file diff --git a/Equipments/BopStack/CHOKE_LINE.f90 b/Equipments/BopStack/CHOKE_LINE.f90 index 1077ead..a70122c 100644 --- a/Equipments/BopStack/CHOKE_LINE.f90 +++ b/Equipments/BopStack/CHOKE_LINE.f90 @@ -1,310 +1,310 @@ - - -SUBROUTINE CHOKE_LINE - use SimulationVariables - USE CAccumulatorVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - - implicit none - - -!===================================================================== -! CHOKE LINE 1- BOP CAMERON Type U 5000 -! START CONDITIONS FOR CHOKE LINE 1 -!===================================================================== - - data%State%RAM(5)%SuccessionCounter = data%State%RAM(5)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%ChokeLineValve == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then - data%State%RAM(5)%SuccessionCounter = 0 ! also in starup - data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter - endif - - - if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - data%State%RAM(5)%First_CloseTimecheck= 1 - - - - - if (data%State%BopStackInput%ChokeLineOpenLEDMine == LedOn) then - RETURN - end if - data%State%ChokeLine%closed=0 - data%State%RAM(5)%vdis_tot=0 - data%State%RAM(5)%vdis_bottles=0. - data%State%RAM(5)%fvr_air=0. - data%State%RAM(5)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(5)%Qzero=70 - data%State%RAM(5)%Q=data%State%RAM(5)%Qzero - data%State%RAM(5)%flow=70 - data%State%RAM(5)%tol=0.0037 - if (data%State%ChokeLine%finished==1) then - data%State%ChokeLine%LeverOld= 1.0 - else - data%State%ChokeLine%LeverOld=data%EquipmentControl%BopControlPanel%ChokeLineValve - endif - data%State%ChokeLine%finished=0 - data%State%ChokeLine%IsOpening = .true. - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn !LedBlinking - data%State%RAM(5)%bop_type = 3 - !AbopChokeLine=196.67 - data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeClose*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) - data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP - endif - - if (data%EquipmentControl%BopControlPanel%ChokeLineValve == 1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - - if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then - data%State%RAM(5)%SuccessionCounter = 0 ! also in starup - data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter - endif - - - if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - data%State%RAM(5)%First_OpenTimecheck= 1 - - - - if (data%State%BopStackInput%ChokeLineCloseLEDMine == LedOn) then - RETURN - end if - data%State%ChokeLine%closed=0 - data%State%RAM(5)%vdis_tot=0 - data%State%RAM(5)%vdis_bottles=0. - data%State%RAM(5)%fvr_air=0. - data%State%RAM(5)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(5)%Qzero=70 - data%State%RAM(5)%Q=data%State%RAM(5)%Qzero - data%State%RAM(5)%flow=70 - data%State%RAM(5)%tol=0.0037 - - - - if (data%State%ChokeLine%finished==1) then - data%State%ChokeLine%LeverOld= -1.0 - else - data%State%ChokeLine%LeverOld=data%EquipmentControl%BopControlPanel%ChokeLineValve - endif - data%State%ChokeLine%finished=0 - data%State%ChokeLine%IsClosing = .true. - - - !if (ChokeLineCloseLED == LedOn) then - ! RETURN - !end if - - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff !new - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff !new - - - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn !LedBlinking - data%State%RAM(5)%bop_type = 3 - !AbopChokeLine=196.67 - data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeOpen*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) - data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP - endif - - -!===================================================================== - -! if (ChokeLineIsOpening .or. ChokeLineIsClosing) then -! CALL CHOKE_LINE_SUB -! end if - - - END SUBROUTINE CHOKE_LINE - - - - - - - - - - - - -SUBROUTINE CHOKE_LINE_SUB - - use SimulationVariables - USE CAccumulatorVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - implicit none - - - ! FirstSet= 0 - ! RamsFirstSet= 0 - - ! loop5: do while (finished_ChokeLine==0) - - - data%State%RAM(5)%SuccessionCounter = data%State%RAM(5)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%ChokeLineValve == 1.0 .and. data%State%ChokeLine%LeverOld == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - if ( data%State%RAM(5)%First_CloseTimecheck == 0 ) then - - - if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then - data%State%RAM(5)%SuccessionCounter = 0 ! also in starup - data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter - endif - - - - if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - endif - - - - data%State%ChokeLine%closed=0 - data%State%RAM(5)%p_bop=data%State%ShearRAM%PA - data%State%ChokeLine%LeverOld = data%EquipmentControl%BopControlPanel%ChokeLineValve - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff - data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn !LedBlinking - CALL OpenChokeLine - data%State%RAM(5)%bop_type = 3 - !AbopChokeLine=196.67 - data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeClose*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) - data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%ID-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) - - data%State%RAM(5)%vdis_bottles=0. - data%State%RAM(5)%fvr_air=0. - data%State%RAM(5)%vdis_elecp=0. - data%State%ChokeLine%IsClosing = .true. - data%State%ChokeLine%IsOpening = .false. - endif - - if (data%EquipmentControl%BopControlPanel%ChokeLineValve == -1.0 .and. data%State%ChokeLine%LeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - if ( data%State%RAM(5)%First_OpenTimecheck == 0 ) then - - if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then - data%State%RAM(5)%SuccessionCounter = 0 ! also in starup - data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter - endif - - if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - endif - - - - data%State%ChokeLine%closed=0 - data%State%RAM(5)%p_bop=data%State%ShearRAM%PA - data%State%ChokeLine%LeverOld = data%EquipmentControl%BopControlPanel%ChokeLineValve - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn !LedBlinking - CALL OpenChokeLine - data%State%RAM(5)%bop_type = 3 - !AbopChokeLine=196.67 - data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeOpen*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) - data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-data%State%ChokeLine%ID)/(2.*231) - data%State%RAM(5)%vdis_bottles=0. - data%State%RAM(5)%fvr_air=0. - data%State%RAM(5)%vdis_elecp=0. - - data%State%ChokeLine%IsOpening = .true. - data%State%ChokeLine%IsClosing = .false. - endif - - - data%State%RAM(5)%First_CloseTimecheck = 0 - data%State%RAM(5)%First_OpenTimecheck = 0 - - - data%State%RAM(5)%time=data%State%RAM(5)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - - -!=================================================== -! BOP -!=================================================== -if (data%State%ChokeLine%closed==0) then !bop closing - call bop_code(4,data%State%ChokeLine%H_Bop,5) !ramtype=4 5=RNUMBER -endif !bop is closing -!================================================================ -if (data%State%ChokeLine%closed==1) then - data%State%RAM(5)%Q=0 - !p_bop=pram_reg - data%State%RAM(5)%p_bop=data%State%ShearRAM%PA - data%State%RAMS%minloss(5,17)=0. !RNUMBER=5 -endif - -data%State%RAM(5)%timecounter_ram=data%State%RAM(5)%timecounter_ram+1 - - - - - -! MiddleRamsStatus = IDshearBop -! UpperRamsStatus = IDPipeRam1 -! LowerRamsStatus = IDPipeRam2 -! AnnularStatus = IDAnnular -! AccumulatorPressureGauge = p_acc -! ManifoldPressureGauge= pram_reg -! AnnularPressureGauge=Pannular_reg -! -! -! -! WRITE(60,60) data%State%RAM(5)%time,data%State%RAM(5)%Q,data%State%RAM(5)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(5)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - ! call sleepqq(100) - if (data%State%ChokeLine%closed==1) then - ! if ((UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. KillLineValve==1. .or. KillLineValve==-1.0) then - data%State%ChokeLine%finished=1 - ! endif -endif - - ! if (IsStopped == .true.) return - - ! end do loop5 !while finished_ChokeLine==0 - + + +SUBROUTINE CHOKE_LINE + use SimulationVariables + USE CAccumulatorVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + + implicit none + + +!===================================================================== +! CHOKE LINE 1- BOP CAMERON Type U 5000 +! START CONDITIONS FOR CHOKE LINE 1 +!===================================================================== + + data%State%RAM(5)%SuccessionCounter = data%State%RAM(5)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%ChokeLineValve == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then + data%State%RAM(5)%SuccessionCounter = 0 ! also in starup + data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter + endif + + + if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + data%State%RAM(5)%First_CloseTimecheck= 1 + + + + + if (data%State%BopStackInput%ChokeLineOpenLEDMine == LedOn) then + RETURN + end if + data%State%ChokeLine%closed=0 + data%State%RAM(5)%vdis_tot=0 + data%State%RAM(5)%vdis_bottles=0. + data%State%RAM(5)%fvr_air=0. + data%State%RAM(5)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(5)%Qzero=70 + data%State%RAM(5)%Q=data%State%RAM(5)%Qzero + data%State%RAM(5)%flow=70 + data%State%RAM(5)%tol=0.0037 + if (data%State%ChokeLine%finished==1) then + data%State%ChokeLine%LeverOld= 1.0 + else + data%State%ChokeLine%LeverOld=data%EquipmentControl%BopControlPanel%ChokeLineValve + endif + data%State%ChokeLine%finished=0 + data%State%ChokeLine%IsOpening = .true. + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn !LedBlinking + data%State%RAM(5)%bop_type = 3 + !AbopChokeLine=196.67 + data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeClose*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) + data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP + endif + + if (data%EquipmentControl%BopControlPanel%ChokeLineValve == 1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + + if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then + data%State%RAM(5)%SuccessionCounter = 0 ! also in starup + data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter + endif + + + if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + data%State%RAM(5)%First_OpenTimecheck= 1 + + + + if (data%State%BopStackInput%ChokeLineCloseLEDMine == LedOn) then + RETURN + end if + data%State%ChokeLine%closed=0 + data%State%RAM(5)%vdis_tot=0 + data%State%RAM(5)%vdis_bottles=0. + data%State%RAM(5)%fvr_air=0. + data%State%RAM(5)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(5)%Qzero=70 + data%State%RAM(5)%Q=data%State%RAM(5)%Qzero + data%State%RAM(5)%flow=70 + data%State%RAM(5)%tol=0.0037 + + + + if (data%State%ChokeLine%finished==1) then + data%State%ChokeLine%LeverOld= -1.0 + else + data%State%ChokeLine%LeverOld=data%EquipmentControl%BopControlPanel%ChokeLineValve + endif + data%State%ChokeLine%finished=0 + data%State%ChokeLine%IsClosing = .true. + + + !if (ChokeLineCloseLED == LedOn) then + ! RETURN + !end if + + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff !new + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff !new + + + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn !LedBlinking + data%State%RAM(5)%bop_type = 3 + !AbopChokeLine=196.67 + data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeOpen*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) + data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP + endif + + +!===================================================================== + +! if (ChokeLineIsOpening .or. ChokeLineIsClosing) then +! CALL CHOKE_LINE_SUB +! end if + + + END SUBROUTINE CHOKE_LINE + + + + + + + + + + + + +SUBROUTINE CHOKE_LINE_SUB + + use SimulationVariables + USE CAccumulatorVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + implicit none + + + ! FirstSet= 0 + ! RamsFirstSet= 0 + + ! loop5: do while (finished_ChokeLine==0) + + + data%State%RAM(5)%SuccessionCounter = data%State%RAM(5)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%ChokeLineValve == 1.0 .and. data%State%ChokeLine%LeverOld == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + if ( data%State%RAM(5)%First_CloseTimecheck == 0 ) then + + + if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then + data%State%RAM(5)%SuccessionCounter = 0 ! also in starup + data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter + endif + + + + if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + endif + + + + data%State%ChokeLine%closed=0 + data%State%RAM(5)%p_bop=data%State%ShearRAM%PA + data%State%ChokeLine%LeverOld = data%EquipmentControl%BopControlPanel%ChokeLineValve + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff + data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn !LedBlinking + CALL OpenChokeLine + data%State%RAM(5)%bop_type = 3 + !AbopChokeLine=196.67 + data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeClose*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) + data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%ID-max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase))/(2.*231) + + data%State%RAM(5)%vdis_bottles=0. + data%State%RAM(5)%fvr_air=0. + data%State%RAM(5)%vdis_elecp=0. + data%State%ChokeLine%IsClosing = .true. + data%State%ChokeLine%IsOpening = .false. + endif + + if (data%EquipmentControl%BopControlPanel%ChokeLineValve == -1.0 .and. data%State%ChokeLine%LeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + if ( data%State%RAM(5)%First_OpenTimecheck == 0 ) then + + if ( data%State%RAM(5)%SuccessionCounter /= data%State%RAM(5)%SuccessionCounterOld+1 ) then + data%State%RAM(5)%SuccessionCounter = 0 ! also in starup + data%State%RAM(5)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(5)%SuccessionCounterOld= data%State%RAM(5)%SuccessionCounter + endif + + if ( data%State%RAM(5)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + endif + + + + data%State%ChokeLine%closed=0 + data%State%RAM(5)%p_bop=data%State%ShearRAM%PA + data%State%ChokeLine%LeverOld = data%EquipmentControl%BopControlPanel%ChokeLineValve + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn !LedBlinking + CALL OpenChokeLine + data%State%RAM(5)%bop_type = 3 + !AbopChokeLine=196.67 + data%State%ChokeLine%Abop=(data%Configuration%BopStack%ChokeOpen*231)/((data%State%ChokeLine%IDBase-data%State%ChokeLine%ODDrillpipe_inBase)/2.) + data%State%ChokeLine%NeededVolume=data%State%ChokeLine%Abop*(data%State%ChokeLine%IDBase-data%State%ChokeLine%ID)/(2.*231) + data%State%RAM(5)%vdis_bottles=0. + data%State%RAM(5)%fvr_air=0. + data%State%RAM(5)%vdis_elecp=0. + + data%State%ChokeLine%IsOpening = .true. + data%State%ChokeLine%IsClosing = .false. + endif + + + data%State%RAM(5)%First_CloseTimecheck = 0 + data%State%RAM(5)%First_OpenTimecheck = 0 + + + data%State%RAM(5)%time=data%State%RAM(5)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + + +!=================================================== +! BOP +!=================================================== +if (data%State%ChokeLine%closed==0) then !bop closing + call bop_code(4,data%State%ChokeLine%H_Bop,5) !ramtype=4 5=RNUMBER +endif !bop is closing +!================================================================ +if (data%State%ChokeLine%closed==1) then + data%State%RAM(5)%Q=0 + !p_bop=pram_reg + data%State%RAM(5)%p_bop=data%State%ShearRAM%PA + data%State%RAMS%minloss(5,17)=0. !RNUMBER=5 +endif + +data%State%RAM(5)%timecounter_ram=data%State%RAM(5)%timecounter_ram+1 + + + + + +! MiddleRamsStatus = IDshearBop +! UpperRamsStatus = IDPipeRam1 +! LowerRamsStatus = IDPipeRam2 +! AnnularStatus = IDAnnular +! AccumulatorPressureGauge = p_acc +! ManifoldPressureGauge= pram_reg +! AnnularPressureGauge=Pannular_reg +! +! +! +! WRITE(60,60) data%State%RAM(5)%time,data%State%RAM(5)%Q,data%State%RAM(5)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(5)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + ! call sleepqq(100) + if (data%State%ChokeLine%closed==1) then + ! if ((UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. KillLineValve==1. .or. KillLineValve==-1.0) then + data%State%ChokeLine%finished=1 + ! endif +endif + + ! if (IsStopped == .true.) return + + ! end do loop5 !while finished_ChokeLine==0 + END SUBROUTINE CHOKE_LINE_SUB \ No newline at end of file diff --git a/Equipments/BopStack/ChokeLineMain.f90 b/Equipments/BopStack/ChokeLineMain.f90 index 230e5bc..4dd8695 100644 --- a/Equipments/BopStack/ChokeLineMain.f90 +++ b/Equipments/BopStack/ChokeLineMain.f90 @@ -1,82 +1,82 @@ -module ChokeLineMain - implicit none - public - contains - - ! subroutine ChokeLine_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(ChokeLine_Init) - ! call OnSimulationStop%Add(ChokeLine_Init) - ! call OnChokeLineStep%Add(ChokeLine_Step) - ! call OnChokeLineOutput%Add(ChokeLine_Output) - ! call OnChokeLineMain%Add(ChokeLineMainBody) - ! end subroutine - - ! subroutine ChokeLine_Init - ! implicit none - ! end subroutine ChokeLine_Init - - subroutine ChokeLine_Step - use SimulationVariables - implicit none - if (data%State%ChokeLine%finished/=0) then - call CHOKE_LINE - if (data%State%ChokeLine%IsOpening .or. data%State%ChokeLine%IsClosing) then - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - if(data%State%ChokeLine%finished==0) then - call CHOKE_LINE_SUB !only body of loop2 - endif - endif - else - call SHEAR_RAMS_SUB - endif - end subroutine ChokeLine_Step - - ! subroutine ChokeLine_Output - ! implicit none - ! end subroutine ChokeLine_Output - - ! subroutine ChokeLineMainBody - ! USE ifport - ! USE ifmt - ! ! use CSimulationVariables - ! ! USE BOP - - ! implicit none - - ! INTEGER :: ChokeLineDuration - ! integer,dimension(8) :: ChokeLineStartTime , ChokeLineEndTime - - ! ! CALL BOP_StartUp() - ! loop1: DO - - ! CALL DATE_AND_TIME(values=ChokeLineStartTime) - - - ! CALL CHOKE_LINE - - ! CALL DATE_AND_TIME(values=chokeLineEndTime) - - ! chokeLineDuration = 3600000 * (chokeLineEndTime(5) - chokeLineStartTime(5)) + 60000 * (chokeLineEndTime(6) - chokeLineStartTime(6)) + 1000 * (chokeLineEndTime(7) - chokeLineStartTime(7)) + (chokeLineEndTime(8) - chokeLineStartTime(8)) - - ! if (chokeLineDuration < 100) then - ! call sleepqq(100 - chokeLineDuration) - ! ELSE - ! WRITE (*,*) 'chokeLine BOP run duration exceeded 100 ms and =', chokeLineDuration - ! end if - - ! IF (IsStopped==.true.) THEN - ! EXIT loop1 - ! ENDIF - - - ! ENDDO loop1 - - - ! ! CALL DEALLOCATE_ARRAYS() - - ! end subroutine ChokeLineMainBody - +module ChokeLineMain + implicit none + public + contains + + ! subroutine ChokeLine_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(ChokeLine_Init) + ! call OnSimulationStop%Add(ChokeLine_Init) + ! call OnChokeLineStep%Add(ChokeLine_Step) + ! call OnChokeLineOutput%Add(ChokeLine_Output) + ! call OnChokeLineMain%Add(ChokeLineMainBody) + ! end subroutine + + ! subroutine ChokeLine_Init + ! implicit none + ! end subroutine ChokeLine_Init + + subroutine ChokeLine_Step + use SimulationVariables + implicit none + if (data%State%ChokeLine%finished/=0) then + call CHOKE_LINE + if (data%State%ChokeLine%IsOpening .or. data%State%ChokeLine%IsClosing) then + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + if(data%State%ChokeLine%finished==0) then + call CHOKE_LINE_SUB !only body of loop2 + endif + endif + else + call SHEAR_RAMS_SUB + endif + end subroutine ChokeLine_Step + + ! subroutine ChokeLine_Output + ! implicit none + ! end subroutine ChokeLine_Output + + ! subroutine ChokeLineMainBody + ! USE ifport + ! USE ifmt + ! ! use CSimulationVariables + ! ! USE BOP + + ! implicit none + + ! INTEGER :: ChokeLineDuration + ! integer,dimension(8) :: ChokeLineStartTime , ChokeLineEndTime + + ! ! CALL BOP_StartUp() + ! loop1: DO + + ! CALL DATE_AND_TIME(values=ChokeLineStartTime) + + + ! CALL CHOKE_LINE + + ! CALL DATE_AND_TIME(values=chokeLineEndTime) + + ! chokeLineDuration = 3600000 * (chokeLineEndTime(5) - chokeLineStartTime(5)) + 60000 * (chokeLineEndTime(6) - chokeLineStartTime(6)) + 1000 * (chokeLineEndTime(7) - chokeLineStartTime(7)) + (chokeLineEndTime(8) - chokeLineStartTime(8)) + + ! if (chokeLineDuration < 100) then + ! call sleepqq(100 - chokeLineDuration) + ! ELSE + ! WRITE (*,*) 'chokeLine BOP run duration exceeded 100 ms and =', chokeLineDuration + ! end if + + ! IF (IsStopped==.true.) THEN + ! EXIT loop1 + ! ENDIF + + + ! ENDDO loop1 + + + ! ! CALL DEALLOCATE_ARRAYS() + + ! end subroutine ChokeLineMainBody + end module ChokeLineMain \ No newline at end of file diff --git a/Equipments/BopStack/KILL_LINE.f90 b/Equipments/BopStack/KILL_LINE.f90 index 3f0fc93..b18259e 100644 --- a/Equipments/BopStack/KILL_LINE.f90 +++ b/Equipments/BopStack/KILL_LINE.f90 @@ -1,310 +1,310 @@ - - -SUBROUTINE KILL_LINE - use SimulationVariables - USE CAccumulatorVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - - implicit none - - -!===================================================================== -! KILL LINE 1- BOP CAMERON Type U 5000 -! START CONDITIONS FOR KILL LINE 1 -!===================================================================== - - data%State%RAM(6)%SuccessionCounter = data%State%RAM(6)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%KillLineValve == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then - data%State%RAM(6)%SuccessionCounter = 0 ! also in starup - data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter - endif - - - if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - data%State%RAM(6)%First_CloseTimecheck= 1 - - - - if (data%State%BopStackInput%KillLineOpenLedMine == LedOn) then - RETURN - end if - data%State%KillLine%closed=0 - data%State%RAM(6)%vdis_tot=0 - data%State%RAM(6)%vdis_bottles=0. - data%State%RAM(6)%fvr_air=0. - data%State%RAM(6)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(6)%Qzero=70 - data%State%RAM(6)%Q=data%State%RAM(6)%Qzero - data%State%RAM(6)%flow=70 - data%State%RAM(6)%tol=0.0037 - if (data%State%KillLine%finished==1) then - data%State%KillLine%LeverOld= 1.0 - else - data%State%KillLine%LeverOld=data%EquipmentControl%BopControlPanel%KillLineValve - endif - data%State%KillLine%finished=0 - data%State%KillLine%IsOpening = .true. - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff - data%State%BopStackInput%KillLineCloseLedMine = LedOff - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn !LedBlinking - data%State%RAM(6)%bop_type = 3 - !AbopKillLine=196.67 - data%State%KillLine%Abop=(data%Configuration%BopStack%KillClose*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) - data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP - endif - - if (data%EquipmentControl%BopControlPanel%KillLineValve == 1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - - if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then - data%State%RAM(6)%SuccessionCounter = 0 ! also in starup - data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter - endif - - - if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - data%State%RAM(6)%First_OpenTimecheck= 1 - - - - if (data%State%BopStackInput%KillLineCloseLedMine == LedOn) then - RETURN - end if - data%State%KillLine%closed=0 - data%State%RAM(6)%vdis_tot=0 - data%State%RAM(6)%vdis_bottles=0. - data%State%RAM(6)%fvr_air=0. - data%State%RAM(6)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(6)%Qzero=70 - data%State%RAM(6)%Q=data%State%RAM(6)%Qzero - data%State%RAM(6)%flow=70 - data%State%RAM(6)%tol=0.0037 - - - - if (data%State%KillLine%finished==1) then - data%State%KillLine%LeverOld= -1.0 - else - data%State%KillLine%LeverOld=data%EquipmentControl%BopControlPanel%KillLineValve - endif - data%State%KillLine%finished=0 - data%State%KillLine%IsClosing = .true. - - - !if (KillLineCloseLed == LedOn) then - ! RETURN - !end if - - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff !new - data%State%BopStackInput%KillLineCloseLedMine = LedOff !new - - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn !LedBlinking - data%State%RAM(6)%bop_type = 3 - !AbopKillLine=196.67 - data%State%KillLine%Abop=(data%Configuration%BopStack%KillOpen*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) - data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP - endif - -!========================================================================== - -if (data%State%KillLine%IsOpening .or. data%State%KillLine%IsClosing) then - CALL KILL_LINE_SUB -end if - - - END SUBROUTINE KILL_LINE - - - - - - - - - - - -SUBROUTINE KILL_LINE_SUB - - use SimulationVariables - USE CAccumulatorVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - - implicit none - - - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - - ! loop6: do while (finished_KillLine==0) - - - data%State%RAM(6)%SuccessionCounter = data%State%RAM(6)%SuccessionCounter + 1 - - - - if (data%EquipmentControl%BopControlPanel%KillLineValve == 1.0 .and. data%State%KillLine%LeverOld == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - - if ( data%State%RAM(6)%First_CloseTimecheck == 0 ) then - - - if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then - data%State%RAM(6)%SuccessionCounter = 0 ! also in starup - data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter - endif - - - - if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - endif - - - - data%State%KillLine%closed=0 - data%State%RAM(6)%p_bop=data%State%ShearRAM%PA - data%State%KillLine%LeverOld = data%EquipmentControl%BopControlPanel%KillLineValve - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff - data%State%BopStackInput%KillLineOpenLedMine = LedOff - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn !LedBlinking - CALL OpenKillLine - data%State%RAM(6)%bop_type = 3 - !AbopKillLine=196.67 - data%State%KillLine%Abop=(data%Configuration%BopStack%KillClose*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) - data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%ID-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) - - data%State%RAM(6)%vdis_bottles=0. - data%State%RAM(6)%fvr_air=0. - data%State%RAM(6)%vdis_elecp=0. - data%State%KillLine%IsClosing = .true. - data%State%KillLine%IsOpening = .false. - endif - - if (data%EquipmentControl%BopControlPanel%KillLineValve == -1.0 .and. data%State%KillLine%LeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - - if ( data%State%RAM(6)%First_OpenTimecheck == 0 ) then - - if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then - data%State%RAM(6)%SuccessionCounter = 0 ! also in starup - data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup - return - else - data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter - endif - - if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then - return - endif - - endif - - - data%State%KillLine%closed=0 - data%State%RAM(6)%p_bop=data%State%ShearRAM%PA - data%State%KillLine%LeverOld = data%EquipmentControl%BopControlPanel%KillLineValve - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff - data%State%BopStackInput%KillLineCloseLedMine = LedOff - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn !LedBlinking - CALL OpenKillLine - data%State%RAM(6)%bop_type = 3 - !AbopKillLine=196.67 - data%State%KillLine%Abop=(data%Configuration%BopStack%KillOpen*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) - data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-data%State%KillLine%ID)/(2.*231) - data%State%RAM(6)%vdis_bottles=0. - data%State%RAM(6)%fvr_air=0. - data%State%RAM(6)%vdis_elecp=0. - - data%State%KillLine%IsOpening = .true. - data%State%KillLine%IsClosing = .false. - endif - - - data%State%RAM(6)%First_CloseTimecheck = 0 - data%State%RAM(6)%First_OpenTimecheck = 0 - - - data%State%RAM(6)%time=data%State%RAM(6)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - - -!=================================================== -! BOP -!=================================================== -if (data%State%KillLine%closed==0) then !bop closing - call bop_code(5,data%State%KillLine%H_Bop,6) !ramtype=5 6=RNUMBER -endif !bop is closing -!================================================================ -if (data%State%KillLine%closed==1) then - data%State%RAM(6)%Q=0 - !p_bop=pram_reg - data%State%RAM(6)%p_bop=data%State%ShearRAM%PA - data%State%RAMS%minloss(6,17)=0. !RNUMBER=6 -endif - -data%State%RAM(6)%timecounter_ram=data%State%RAM(6)%timecounter_ram+1 - - - - - -! MiddleRamsStatus = IDshearBop -! UpperRamsStatus = IDPipeRam1 -! LowerRamsStatus = IDPipeRam2 -! AnnularStatus = IDAnnular -! AccumulatorPressureGauge = p_acc -! ManifoldPressureGauge= pram_reg -! AnnularPressureGauge=Pannular_reg -! -! -! -! WRITE(60,60) data%State%RAM(6)%time,data%State%RAM(6)%Q,data%State%RAM(6)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(6)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - ! call sleepqq(100) - -if (data%State%KillLine%closed==1) then - ! if ((UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0) then - data%State%KillLine%finished=1 - ! endif -endif - - ! if (IsStopped == .true.) return - - ! end do loop6 !while finished_KillLine==0 - + + +SUBROUTINE KILL_LINE + use SimulationVariables + USE CAccumulatorVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + + implicit none + + +!===================================================================== +! KILL LINE 1- BOP CAMERON Type U 5000 +! START CONDITIONS FOR KILL LINE 1 +!===================================================================== + + data%State%RAM(6)%SuccessionCounter = data%State%RAM(6)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%KillLineValve == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then + data%State%RAM(6)%SuccessionCounter = 0 ! also in starup + data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter + endif + + + if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + data%State%RAM(6)%First_CloseTimecheck= 1 + + + + if (data%State%BopStackInput%KillLineOpenLedMine == LedOn) then + RETURN + end if + data%State%KillLine%closed=0 + data%State%RAM(6)%vdis_tot=0 + data%State%RAM(6)%vdis_bottles=0. + data%State%RAM(6)%fvr_air=0. + data%State%RAM(6)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(6)%Qzero=70 + data%State%RAM(6)%Q=data%State%RAM(6)%Qzero + data%State%RAM(6)%flow=70 + data%State%RAM(6)%tol=0.0037 + if (data%State%KillLine%finished==1) then + data%State%KillLine%LeverOld= 1.0 + else + data%State%KillLine%LeverOld=data%EquipmentControl%BopControlPanel%KillLineValve + endif + data%State%KillLine%finished=0 + data%State%KillLine%IsOpening = .true. + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff + data%State%BopStackInput%KillLineCloseLedMine = LedOff + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn !LedBlinking + data%State%RAM(6)%bop_type = 3 + !AbopKillLine=196.67 + data%State%KillLine%Abop=(data%Configuration%BopStack%KillClose*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) + data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP + endif + + if (data%EquipmentControl%BopControlPanel%KillLineValve == 1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + + if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then + data%State%RAM(6)%SuccessionCounter = 0 ! also in starup + data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter + endif + + + if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + data%State%RAM(6)%First_OpenTimecheck= 1 + + + + if (data%State%BopStackInput%KillLineCloseLedMine == LedOn) then + RETURN + end if + data%State%KillLine%closed=0 + data%State%RAM(6)%vdis_tot=0 + data%State%RAM(6)%vdis_bottles=0. + data%State%RAM(6)%fvr_air=0. + data%State%RAM(6)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(6)%Qzero=70 + data%State%RAM(6)%Q=data%State%RAM(6)%Qzero + data%State%RAM(6)%flow=70 + data%State%RAM(6)%tol=0.0037 + + + + if (data%State%KillLine%finished==1) then + data%State%KillLine%LeverOld= -1.0 + else + data%State%KillLine%LeverOld=data%EquipmentControl%BopControlPanel%KillLineValve + endif + data%State%KillLine%finished=0 + data%State%KillLine%IsClosing = .true. + + + !if (KillLineCloseLed == LedOn) then + ! RETURN + !end if + + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff !new + data%State%BopStackInput%KillLineCloseLedMine = LedOff !new + + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn !LedBlinking + data%State%RAM(6)%bop_type = 3 + !AbopKillLine=196.67 + data%State%KillLine%Abop=(data%Configuration%BopStack%KillOpen*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) + data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) !1.5 galon for each BOP + endif + +!========================================================================== + +if (data%State%KillLine%IsOpening .or. data%State%KillLine%IsClosing) then + CALL KILL_LINE_SUB +end if + + + END SUBROUTINE KILL_LINE + + + + + + + + + + + +SUBROUTINE KILL_LINE_SUB + + use SimulationVariables + USE CAccumulatorVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + + implicit none + + + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + + ! loop6: do while (finished_KillLine==0) + + + data%State%RAM(6)%SuccessionCounter = data%State%RAM(6)%SuccessionCounter + 1 + + + + if (data%EquipmentControl%BopControlPanel%KillLineValve == 1.0 .and. data%State%KillLine%LeverOld == -1.0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + + if ( data%State%RAM(6)%First_CloseTimecheck == 0 ) then + + + if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then + data%State%RAM(6)%SuccessionCounter = 0 ! also in starup + data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter + endif + + + + if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + endif + + + + data%State%KillLine%closed=0 + data%State%RAM(6)%p_bop=data%State%ShearRAM%PA + data%State%KillLine%LeverOld = data%EquipmentControl%BopControlPanel%KillLineValve + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff + data%State%BopStackInput%KillLineOpenLedMine = LedOff + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn !LedBlinking + CALL OpenKillLine + data%State%RAM(6)%bop_type = 3 + !AbopKillLine=196.67 + data%State%KillLine%Abop=(data%Configuration%BopStack%KillClose*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) + data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%ID-max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase))/(2.*231) + + data%State%RAM(6)%vdis_bottles=0. + data%State%RAM(6)%fvr_air=0. + data%State%RAM(6)%vdis_elecp=0. + data%State%KillLine%IsClosing = .true. + data%State%KillLine%IsOpening = .false. + endif + + if (data%EquipmentControl%BopControlPanel%KillLineValve == -1.0 .and. data%State%KillLine%LeverOld == 1.0 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + + if ( data%State%RAM(6)%First_OpenTimecheck == 0 ) then + + if ( data%State%RAM(6)%SuccessionCounter /= data%State%RAM(6)%SuccessionCounterOld+1 ) then + data%State%RAM(6)%SuccessionCounter = 0 ! also in starup + data%State%RAM(6)%SuccessionCounterOld = 0 ! also in starup + return + else + data%State%RAM(6)%SuccessionCounterOld= data%State%RAM(6)%SuccessionCounter + endif + + if ( data%State%RAM(6)%SuccessionCounter < int(2.5/data%State%RamLine%DeltaT_BOP) ) then + return + endif + + endif + + + data%State%KillLine%closed=0 + data%State%RAM(6)%p_bop=data%State%ShearRAM%PA + data%State%KillLine%LeverOld = data%EquipmentControl%BopControlPanel%KillLineValve + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff + data%State%BopStackInput%KillLineCloseLedMine = LedOff + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn !LedBlinking + CALL OpenKillLine + data%State%RAM(6)%bop_type = 3 + !AbopKillLine=196.67 + data%State%KillLine%Abop=(data%Configuration%BopStack%KillOpen*231)/((data%State%KillLine%IDBase-data%State%KillLine%ODDrillpipe_inBase)/2.) + data%State%KillLine%NeededVolume=data%State%KillLine%Abop*(data%State%KillLine%IDBase-data%State%KillLine%ID)/(2.*231) + data%State%RAM(6)%vdis_bottles=0. + data%State%RAM(6)%fvr_air=0. + data%State%RAM(6)%vdis_elecp=0. + + data%State%KillLine%IsOpening = .true. + data%State%KillLine%IsClosing = .false. + endif + + + data%State%RAM(6)%First_CloseTimecheck = 0 + data%State%RAM(6)%First_OpenTimecheck = 0 + + + data%State%RAM(6)%time=data%State%RAM(6)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + + +!=================================================== +! BOP +!=================================================== +if (data%State%KillLine%closed==0) then !bop closing + call bop_code(5,data%State%KillLine%H_Bop,6) !ramtype=5 6=RNUMBER +endif !bop is closing +!================================================================ +if (data%State%KillLine%closed==1) then + data%State%RAM(6)%Q=0 + !p_bop=pram_reg + data%State%RAM(6)%p_bop=data%State%ShearRAM%PA + data%State%RAMS%minloss(6,17)=0. !RNUMBER=6 +endif + +data%State%RAM(6)%timecounter_ram=data%State%RAM(6)%timecounter_ram+1 + + + + + +! MiddleRamsStatus = IDshearBop +! UpperRamsStatus = IDPipeRam1 +! LowerRamsStatus = IDPipeRam2 +! AnnularStatus = IDAnnular +! AccumulatorPressureGauge = p_acc +! ManifoldPressureGauge= pram_reg +! AnnularPressureGauge=Pannular_reg +! +! +! +! WRITE(60,60) data%State%RAM(6)%time,data%State%RAM(6)%Q,data%State%RAM(6)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(6)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + ! call sleepqq(100) + +if (data%State%KillLine%closed==1) then + ! if ((UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0) then + data%State%KillLine%finished=1 + ! endif +endif + + ! if (IsStopped == .true.) return + + ! end do loop6 !while finished_KillLine==0 + END SUBROUTINE KILL_LINE_SUB \ No newline at end of file diff --git a/Equipments/BopStack/KillLineMain.f90 b/Equipments/BopStack/KillLineMain.f90 index 3e0d4d0..2e1c923 100644 --- a/Equipments/BopStack/KillLineMain.f90 +++ b/Equipments/BopStack/KillLineMain.f90 @@ -1,36 +1,36 @@ -module KillLineMain - implicit none - public - contains - - ! subroutine KillLine_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(KillLine_Init) - ! call OnSimulationStop%Add(KillLine_Init) - ! call OnKillLineStep%Add(KillLine_Step) - ! call OnKillLineOutput%Add(KillLine_Output) - ! call OnKillLineMain%Add(KillLineMainBody) - ! end subroutine - - ! subroutine KillLine_Init - ! implicit none - ! end subroutine KillLine_Init - - subroutine KillLine_Step - use SimulationVariables - implicit none - if (data%State%KillLine%finished/=0) then - call KILL_LINE - if (data%State%KillLine%IsOpening .or. data%State%KillLine%IsClosing) then - if(data%State%KillLine%finished==0) then - call KILL_LINE_SUB !only body of loop2 - endif - endif - else - call KILL_LINE_SUB - endif - end subroutine KillLine_Step - - +module KillLineMain + implicit none + public + contains + + ! subroutine KillLine_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(KillLine_Init) + ! call OnSimulationStop%Add(KillLine_Init) + ! call OnKillLineStep%Add(KillLine_Step) + ! call OnKillLineOutput%Add(KillLine_Output) + ! call OnKillLineMain%Add(KillLineMainBody) + ! end subroutine + + ! subroutine KillLine_Init + ! implicit none + ! end subroutine KillLine_Init + + subroutine KillLine_Step + use SimulationVariables + implicit none + if (data%State%KillLine%finished/=0) then + call KILL_LINE + if (data%State%KillLine%IsOpening .or. data%State%KillLine%IsClosing) then + if(data%State%KillLine%finished==0) then + call KILL_LINE_SUB !only body of loop2 + endif + endif + else + call KILL_LINE_SUB + endif + end subroutine KillLine_Step + + end module KillLineMain \ No newline at end of file diff --git a/Equipments/BopStack/LOSS_INPUTS.f90 b/Equipments/BopStack/LOSS_INPUTS.f90 index 4963fca..5c17078 100644 --- a/Equipments/BopStack/LOSS_INPUTS.f90 +++ b/Equipments/BopStack/LOSS_INPUTS.f90 @@ -1,1267 +1,1267 @@ - SUBROUTINE DEALLOCATE_ARRAYS() -use SimulationVariables -implicit none -!=========================================================================== -! RAMLINE MINOR LOSSES INPUT -!=========================================================================== - DEALLOCATE (data%State%BopStackInput%MINORS1,data%State%RamLine%MINORDIAMETER_RAMLINE,data%State%RamLine%AREAMINOR_RAMLINE & - ,data%State%RamLine%LF_RAMLINE,data%State%RamLine%CV_RAMLINE,data%State%RamLine%NOTE_RAMLINE,data%State%RAMS%minlosspa,data%State%RAMS%minloss) -!=========================================================================== -! RAMLINE PIPNING LOSSES INPUT -!=========================================================================== - DEALLOCATE (data%State%BopStackInput%PIPINGS_RAMLINE,data%State%RamLine%DIAM_RAMLINE_INCH, & - data%State%RamLine%AREA_RAMLINE,data%State%RamLine%LENGT_RAMLINE,data%State%RamLine%ROUGHNESS_RAMLINE,data%State%RamLine%RELROUGH_RAMLINE & - ,data%State%RAMS%Re_ramline,data%State%RAMS%fric,data%State%RAMS%fricloss) -!=========================================================================== -! ANNULAR MINOR LOSSES INPUT -!=========================================================================== - DEALLOCATE (data%State%BopStackInput%MINORS_ANNULAR,data%State%AnnularComputational%MINORDIAMETER_ANNULARLINE,data%State%AnnularComputational%AREAMINOR_ANNULARLINE & - ,data%State%AnnularComputational%LF_ANNULARLINE,data%State%AnnularComputational%CV_ANNULARLINE,data%State%AnnularComputational%NOTE_ANNULARLINE,data%State%AnnularComputational%minlosspa_ANNULAR,data%State%AnnularComputational%minloss_ANNULAR) -!=========================================================================== -! ANNULAR PIPNING LOSSES INPUT -!=========================================================================== - DEALLOCATE (data%State%BopStackInput%PIPINGS_ANNULAR,data%State%AnnularComputational%DIAM_ANNULARLINE_INCH,data%State%AnnularComputational%AREA_ANNULARLINE, & - data%State%AnnularComputational%LENGT_ANNULARLINE,data%State%AnnularComputational%ROUGHNESS_ANNULARLINE,data%State%AnnularComputational%RELROUGH_ANNULARLINE & - ,data%State%AnnularComputational%Re_ANNULARline,data%State%AnnularComputational%fricANNULAR,data%State%AnnularComputational%friclossANNULAR) -!=========================================================================== -! AIR PUMP LOSSES INPUT -!=========================================================================== -DEALLOCATE (data%State%BopStackInput%PIPINGS_AIRPUMP,data%State%RamLine%DIAM_AIR_INCH, & - data%State%RamLine%Re_air,data%State%RamLine%AREA_AIR,data%State%RamLine%LENGT_AIR,data%State%RamLine%ROUGHNESS_AIRPLINE,data%State%RamLine%REL_ROUGHAIR, & - data%State%RamLine%fric_air,data%State%RamLine%fricloss_air) - !================================================================ -DEALLOCATE (data%State%BopStackInput%MINORS_AIRPUMP,data%State%RamLine%MINORDIAM_AIR_INCH, & - data%State%RamLine%MINORAREA_AIR,data%State%RamLine%LF_AIR,data%State%RamLine%CV_AIR,data%State%RamLine%NOTE_AIR & - ,data%State%RamLine%minlosspa_air,data%State%RamLine%minloss_air) - -!=========================================================================== -! DELAY ARRAYS -!=========================================================================== -call data%State%AnnularComputational%Pannular_regDelay%Empty() - - - - END - - - - - - - - - - - -SUBROUTINE LOSS_INPUTS() -use SimulationVariables -implicit none -INTEGER I - -!=========================================================================== -! RAMLINE MINOR LOSSES INPUT -!=========================================================================== -data%State%RamLine%NO_MINORSRAMLINE=34 - -ALLOCATE (data%State%BopStackInput%MINORS1(data%State%RamLine%NO_MINORSRAMLINE,4)) - - ! ID(INCH) LF CV NOTE(BAR) DESCRIPTION -data%State%BopStackInput%MINORS1(1,1:4)= (/2., 2., 0., 0./) !Acc.tee -data%State%BopStackInput%MINORS1(2,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS1(3,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS1(4,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS1(5,1:4)= (/2., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS1(6,1:4)= (/2., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS1(7,1:4)= (/2., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS1(8,1:4)= (/2., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS1(9,1:4)= (/2., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS1(10,1:4)= (/2., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(11,1:4)= (/2., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(12,1:4)= (/2., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS1(13,1:4)= (/2., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS1(14,1:4)= (/2., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(15,1:4)= (/2., 0., 425., 0./) !valve -data%State%BopStackInput%MINORS1(16,1:4)= (/2., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS1(17,1:4)= (/0.75, 0., 1.5, 0./) !REGULATOR -data%State%BopStackInput%MINORS1(18,1:4)= (/1., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS1(19,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(20,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(21,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(22,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(23,1:4)= (/1., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS1(24,1:4)= (/1., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS1(25,1:4)= (/1., 0., 0., 0.5/) !FT -data%State%BopStackInput%MINORS1(26,1:4)= (/1., 0., 0., 3.4/) !filter -data%State%BopStackInput%MINORS1(27,1:4)= (/1., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS1(28,1:4)= (/1., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS1(29,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(30,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS1(31,1:4)= (/1., 0., 9.2, 0./) !valve -data%State%BopStackInput%MINORS1(32,1:4)= (/1., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS1(33,1:4)= (/1., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS1(34,1:4)= (/0.75, 0.35, 0., 0./) !contraction - - -ALLOCATE (data%State%RamLine%MINORDIAMETER_RAMLINE(data%State%RamLine%NO_MINORSRAMLINE),data%State%RamLine%AREAMINOR_RAMLINE(data%State%RamLine%NO_MINORSRAMLINE),data%State%RamLine%LF_RAMLINE(data%State%RamLine%NO_MINORSRAMLINE),data%State%RamLine%CV_RAMLINE(data%State%RamLine%NO_MINORSRAMLINE) & - ,data%State%RamLine%NOTE_RAMLINE(data%State%RamLine%NO_MINORSRAMLINE),data%State%RAMS%minlosspa(6,data%State%RamLine%NO_MINORSRAMLINE),data%State%RAMS%minloss(6,data%State%RamLine%NO_MINORSRAMLINE)) - - - -DO I=1,data%State%RamLine%NO_MINORSRAMLINE - data%State%RamLine%MINORDIAMETER_RAMLINE(I)=data%State%BopStackInput%MINORS1(I,1) - data%State%RamLine%LF_RAMLINE(I)=data%State%BopStackInput%MINORS1(I,2) - data%State%RamLine%CV_RAMLINE(I)=data%State%BopStackInput%MINORS1(I,3) - data%State%RamLine%NOTE_RAMLINE(I)=data%State%BopStackInput%MINORS1(I,4) - - - data%State%RamLine%AREAMINOR_RAMLINE(I)=PI*(data%State%RamLine%MINORDIAMETER_RAMLINE(I)*0.0254)**2/4. !D(in), AREA(m) -ENDDO - - -!=========================================================================== -! RAMLINE PIPNING LOSSES INPUT -!=========================================================================== -data%State%RamLine%NO_PIPINGSRAMLINE=15 - -ALLOCATE (data%State%BopStackInput%PIPINGS_RAMLINE(data%State%RamLine%NO_PIPINGSRAMLINE,3)) - - ! ID(INCH) L(MM) ROUGHNESS(MM)=e DESCRIPTION -data%State%BopStackInput%PIPINGS_RAMLINE(1,1:3)= (/2., 1035., 0.03/) !Avg.acc.distance -data%State%BopStackInput%PIPINGS_RAMLINE(2,1:3)= (/2., 730., 0.03/) !Acc.end.horizontal -data%State%BopStackInput%PIPINGS_RAMLINE(3,1:3)= (/2., 2000., 0.03/) !Acc.end.vertical -data%State%BopStackInput%PIPINGS_RAMLINE(4,1:3)= (/2., 6000., 0.05/) !Hyd.hose -data%State%BopStackInput%PIPINGS_RAMLINE(5,1:3)= (/2., 2370., 0.03/) !Corner.vertical1 -data%State%BopStackInput%PIPINGS_RAMLINE(6,1:3)= (/2., 210., 0.03/) !Add.from.bend -data%State%BopStackInput%PIPINGS_RAMLINE(7,1:3)= (/1., 780., 0.03/) !Corner.horizontal1 -data%State%BopStackInput%PIPINGS_RAMLINE(8,1:3)= (/1., 780., 0.03/) !Corner.horizontal2 -data%State%BopStackInput%PIPINGS_RAMLINE(9,1:3)= (/1., 750., 0.03/) !Extra.length.back -data%State%BopStackInput%PIPINGS_RAMLINE(10,1:3)= (/1., 800., 0.03/) !Corner.horizontal3 -data%State%BopStackInput%PIPINGS_RAMLINE(11,1:3)= (/1., 1650., 0.03/) !Corner.vertical2 -data%State%BopStackInput%PIPINGS_RAMLINE(12,1:3)= (/1., 340., 0.03/) !12.Valves.horizontal -data%State%BopStackInput%PIPINGS_RAMLINE(13,1:3)= (/1., 1650., 0.03/) !Valves.vertical -data%State%BopStackInput%PIPINGS_RAMLINE(14,1:3)= (/1., 31000., 10./) !Hyd.hose -data%State%BopStackInput%PIPINGS_RAMLINE(15,1:3)= (/1., 526., 0.03/) !Add.from.bend - - - - ALLOCATE (data%State%RamLine%DIAM_RAMLINE_INCH(data%State%RamLine%NO_PIPINGSRAMLINE), & - data%State%RamLine%AREA_RAMLINE(data%State%RamLine%NO_PIPINGSRAMLINE),data%State%RamLine%LENGT_RAMLINE(data%State%RamLine%NO_PIPINGSRAMLINE),data%State%RamLine%ROUGHNESS_RAMLINE(data%State%RamLine%NO_PIPINGSRAMLINE),data%State%RamLine%RELROUGH_RAMLINE(data%State%RamLine%NO_PIPINGSRAMLINE) & - ,data%State%RAMS%Re_ramline(6,data%State%RamLine%NO_PIPINGSRAMLINE),data%State%RAMS%fric(6,data%State%RamLine%NO_PIPINGSRAMLINE),data%State%RAMS%fricloss(6,data%State%RamLine%NO_PIPINGSRAMLINE)) - -DO I=1,data%State%RamLine%NO_PIPINGSRAMLINE - data%State%RamLine%DIAM_RAMLINE_INCH(I)=data%State%BopStackInput%PIPINGS_RAMLINE(I,1) - data%State%RamLine%LENGT_RAMLINE(I)=data%State%BopStackInput%PIPINGS_RAMLINE(I,2) - data%State%RamLine%ROUGHNESS_RAMLINE(I)=data%State%BopStackInput%PIPINGS_RAMLINE(I,3) - - - - data%State%RamLine%AREA_RAMLINE(I)=PI*(data%State%RamLine%DIAM_RAMLINE_INCH(I)*0.0254)**2/4 !D(in), AREA(m) - data%State%RamLine%RELROUGH_RAMLINE(I)=data%State%RamLine%ROUGHNESS_RAMLINE(I)/(data%State%RamLine%DIAM_RAMLINE_INCH(I)*25.4) !e/D - !DIAM_RAMLINE_MM(I)=DIAM_RAMLINE_MM(I)*.001 ! (m) - data%State%RamLine%LENGT_RAMLINE(I)=data%State%RamLine%LENGT_RAMLINE(I)*.001 ! (m) -ENDDO - - - -!=========================================================================== -! ANNULAR PREVENTER MINOR LOSSES INPUT -!=========================================================================== -data%State%AnnularComputational%NO_MinorsAnnularLine=29 - -ALLOCATE (data%State%BopStackInput%MINORS_ANNULAR(data%State%AnnularComputational%NO_MinorsAnnularLine,4)) - - ! ID(INCH) LF CV NOTE(BAR) DESCRIPTION -data%State%BopStackInput%MINORS_ANNULAR(1,1:4)= (/2., 2., 0., 0./) !Acc.tee -data%State%BopStackInput%MINORS_ANNULAR(2,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS_ANNULAR(3,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS_ANNULAR(4,1:4)= (/2., 0.9, 0., 0./) !Avg.acc.tee -data%State%BopStackInput%MINORS_ANNULAR(5,1:4)= (/2., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(6,1:4)= (/2., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(7,1:4)= (/2., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS_ANNULAR(8,1:4)= (/2., 0.9, 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(9,1:4)= (/2., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS_ANNULAR(10,1:4)= (/2., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(11,1:4)= (/2., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(12,1:4)= (/2., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS_ANNULAR(13,1:4)= (/2., 0.8, 0., 0./) !unionA -data%State%BopStackInput%MINORS_ANNULAR(14,1:4)= (/2., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(15,1:4)= (/2., 0., 425., 0./) !valve -data%State%BopStackInput%MINORS_ANNULAR(16,1:4)= (/2., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(17,1:4)= (/0.75, 0., 1.5, 0./) !REGULATOR -data%State%BopStackInput%MINORS_ANNULAR(18,1:4)= (/1., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(19,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(20,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(21,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(22,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(23,1:4)= (/1., 0., 3.2, 0./) !valve -data%State%BopStackInput%MINORS_ANNULAR(24,1:4)= (/1., 2., 0., 0./) !tee -data%State%BopStackInput%MINORS_ANNULAR(25,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(26,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(27,1:4)= (/1., 0.42, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(28,1:4)= (/1., 1.5, 0., 0./) !elbow -data%State%BopStackInput%MINORS_ANNULAR(29,1:4)= (/1., 0., 3.2, 0./) !valve - - - - ALLOCATE (data%State%AnnularComputational%MINORDIAMETER_ANNULARLINE(data%State%AnnularComputational%NO_MinorsAnnularLine),data%State%AnnularComputational%AREAMINOR_ANNULARLINE(data%State%AnnularComputational%NO_MinorsAnnularLine),data%State%AnnularComputational%LF_ANNULARLINE(data%State%AnnularComputational%NO_MinorsAnnularLine) & - ,data%State%AnnularComputational%CV_ANNULARLINE(data%State%AnnularComputational%NO_MinorsAnnularLine),data%State%AnnularComputational%NOTE_ANNULARLINE(data%State%AnnularComputational%NO_MinorsAnnularLine),data%State%AnnularComputational%minlosspa_ANNULAR(data%State%AnnularComputational%NO_MinorsAnnularLine),data%State%AnnularComputational%minloss_ANNULAR(data%State%AnnularComputational%NO_MinorsAnnularLine)) - - - -DO I=1,data%State%AnnularComputational%NO_MinorsAnnularLine - data%State%AnnularComputational%MINORDIAMETER_ANNULARLINE(I)=data%State%BopStackInput%MINORS_ANNULAR(I,1) - data%State%AnnularComputational%LF_ANNULARLINE(I)=data%State%BopStackInput%MINORS_ANNULAR(I,2) - data%State%AnnularComputational%CV_ANNULARLINE(I)=data%State%BopStackInput%MINORS_ANNULAR(I,3) - data%State%AnnularComputational%NOTE_ANNULARLINE(I)=data%State%BopStackInput%MINORS_ANNULAR(I,4) - - data%State%AnnularComputational%AREAMINOR_ANNULARLINE(I)=PI*(data%State%AnnularComputational%MINORDIAMETER_ANNULARLINE(I)*0.0254)**2/4. !D(in), AREA(m) -ENDDO - - -!=========================================================================== -! ANNULAR PREVENTER PIPNING LOSSES INPUT -!=========================================================================== -data%State%AnnularComputational%NO_PipingsAnnularLine=10 - -ALLOCATE (data%State%BopStackInput%PIPINGS_ANNULAR(data%State%AnnularComputational%NO_PipingsAnnularLine,3)) - - ! ID(INCH) L(MM) ROUGHNESS(MM)=e DESCRIPTION -data%State%BopStackInput%PIPINGS_ANNULAR(1,1:3)= (/2., 1035., 0.03/) !Avg.acc.distance -data%State%BopStackInput%PIPINGS_ANNULAR(2,1:3)= (/2., 730., 0.03/) !Acc.endhorizontal -data%State%BopStackInput%PIPINGS_ANNULAR(3,1:3)= (/2., 2000., 0.03/) !Acc.endvertical -data%State%BopStackInput%PIPINGS_ANNULAR(4,1:3)= (/2., 6000., 0.03/) !Hyd.hose -data%State%BopStackInput%PIPINGS_ANNULAR(5,1:3)= (/2., 2370., 0.03/) !Corner.vertical1 -data%State%BopStackInput%PIPINGS_ANNULAR(6,1:3)= (/2., 210., 0.03/) !Add.frombend -data%State%BopStackInput%PIPINGS_ANNULAR(7,1:3)= (/2., 1000., 0.03/) !manifold -data%State%BopStackInput%PIPINGS_ANNULAR(8,1:3)= (/1., 46000., 0.03/) !pipe -data%State%BopStackInput%PIPINGS_ANNULAR(9,1:3)= (/2., 1000., 0.03/) !manifold -data%State%BopStackInput%PIPINGS_ANNULAR(10,1:3)= (/1., 46000., 0.03/) !pipe - - - - - ALLOCATE (data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(data%State%AnnularComputational%NO_PipingsAnnularLine),data%State%AnnularComputational%AREA_ANNULARLINE(data%State%AnnularComputational%NO_PipingsAnnularLine),data%State%AnnularComputational%LENGT_ANNULARLINE(data%State%AnnularComputational%NO_PipingsAnnularLine) & - ,data%State%AnnularComputational%ROUGHNESS_ANNULARLINE(data%State%AnnularComputational%NO_PipingsAnnularLine),data%State%AnnularComputational%RELROUGH_ANNULARLINE(data%State%AnnularComputational%NO_PipingsAnnularLine) & - ,data%State%AnnularComputational%Re_ANNULARline(data%State%AnnularComputational%NO_PipingsAnnularLine),data%State%AnnularComputational%fricANNULAR(data%State%AnnularComputational%NO_PipingsAnnularLine),data%State%AnnularComputational%friclossANNULAR(data%State%AnnularComputational%NO_PipingsAnnularLine)) - - -DO I=1,data%State%AnnularComputational%NO_PipingsAnnularLine - data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(I)=data%State%BopStackInput%PIPINGS_ANNULAR(I,1) - data%State%AnnularComputational%LENGT_ANNULARLINE(I)=data%State%BopStackInput%PIPINGS_ANNULAR(I,2) - data%State%AnnularComputational%ROUGHNESS_ANNULARLINE(I)=data%State%BopStackInput%PIPINGS_ANNULAR(I,3) - - - data%State%AnnularComputational%AREA_ANNULARLINE(I)=PI*(data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(I)*0.0254)**2/4. !D(in), AREA(m) - data%State%AnnularComputational%RELROUGH_ANNULARLINE(I)=data%State%AnnularComputational%ROUGHNESS_ANNULARLINE(I)/(data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(I)*25.4) - !DIAM_ANNULARLINE_MM(I)=DIAM_ANNULARLINE_MM(I)*.001 ! (m) - data%State%AnnularComputational%LENGT_ANNULARLINE(I)=data%State%AnnularComputational%LENGT_ANNULARLINE(I)*.001 ! (m) - ENDDO - - -!=========================================================================== -! AIR PUMP LOSSES INPUT -!=========================================================================== -data%State%RamLine%NO_PIPINGS_AIRPLINE=1 - -ALLOCATE (data%State%BopStackInput%PIPINGS_AIRPUMP(data%State%RamLine%NO_PIPINGS_AIRPLINE,3)) - - ! ID(INCH) L(MM) ROUGHNESS(MM)=e DESCRIPTION -data%State%BopStackInput%PIPINGS_AIRPUMP(1,1:3)= (/2., 10000., 0.03/) !Avg.acc.distance - - - - - ALLOCATE (data%State%RamLine%DIAM_AIR_INCH(data%State%RamLine%NO_PIPINGS_AIRPLINE),data%State%RamLine%Re_air(data%State%RamLine%NO_PIPINGS_AIRPLINE),data%State%RamLine%AREA_AIR(data%State%RamLine%NO_PIPINGS_AIRPLINE), & - data%State%RamLine%LENGT_AIR(data%State%RamLine%NO_PIPINGS_AIRPLINE),data%State%RamLine%ROUGHNESS_AIRPLINE(data%State%RamLine%NO_PIPINGS_AIRPLINE),data%State%RamLine%REL_ROUGHAIR(data%State%RamLine%NO_PIPINGS_AIRPLINE), & - data%State%RamLine%fric_air(data%State%RamLine%NO_PIPINGS_AIRPLINE),data%State%RamLine%fricloss_air(data%State%RamLine%NO_PIPINGS_AIRPLINE)) - - - -DO I=1,data%State%RamLine%NO_PIPINGS_AIRPLINE - data%State%RamLine%DIAM_AIR_INCH(I)=data%State%BopStackInput%PIPINGS_AIRPUMP(I,1) - data%State%RamLine%LENGT_AIR(I)=data%State%BopStackInput%PIPINGS_AIRPUMP(I,2) - data%State%RamLine%ROUGHNESS_AIRPLINE(I)=data%State%BopStackInput%PIPINGS_AIRPUMP(I,3) - - - data%State%RamLine%AREA_AIR(I)=PI*(data%State%RamLine%DIAM_AIR_INCH(I)*0.0254)**2/4 !D(in), AREA(m) - data%State%RamLine%REL_ROUGHAIR(I)=data%State%RamLine%ROUGHNESS_AIRPLINE(I)/(data%State%RamLine%DIAM_AIR_INCH(I)*25.4) - !DIAM_RAMLINE_MM(I)=DIAM_RAMLINE_MM(I)*.001 ! (m) - data%State%RamLine%LENGT_AIR(I)=data%State%RamLine%LENGT_AIR(I)*.001 ! (m) - ENDDO - - - - !================================================================ -data%State%RamLine%NO_MINORS_AIRPLINE=6 - -ALLOCATE (data%State%BopStackInput%MINORS_AIRPUMP(data%State%RamLine%NO_MINORS_AIRPLINE,4)) - - ! ID(INCH) LF CV NOTE(BAR) DESCRIPTION -data%State%BopStackInput%MINORS_AIRPUMP(1,1:4)= (/2., 10., 0., 0./) !Acc.tee -data%State%BopStackInput%MINORS_AIRPUMP(2,1:4)= (/2., 11., 0., 0./) !elbow -data%State%BopStackInput%MINORS_AIRPUMP(3,1:4)= (/1., 0., 0., 3.4/) !filter -data%State%BopStackInput%MINORS_AIRPUMP(4,1:4)= (/2., 0., 105., 0./) !valve -data%State%BopStackInput%MINORS_AIRPUMP(5,1:4)= (/1., 0., 9.2, 0./) !valve -data%State%BopStackInput%MINORS_AIRPUMP(6,1:4)= (/2., 6.4, 0., 0./) !unionA - - - - ALLOCATE (data%State%RamLine%MINORDIAM_AIR_INCH(data%State%RamLine%NO_MINORS_AIRPLINE),data%State%RamLine%MINORAREA_AIR(data%State%RamLine%NO_MINORS_AIRPLINE), & - data%State%RamLine%LF_AIR(data%State%RamLine%NO_MINORS_AIRPLINE),data%State%RamLine%CV_AIR(data%State%RamLine%NO_MINORS_AIRPLINE),data%State%RamLine%NOTE_AIR(data%State%RamLine%NO_MINORS_AIRPLINE) & - ,data%State%RamLine%minlosspa_air(data%State%RamLine%NO_MINORS_AIRPLINE),data%State%RamLine%minloss_air(data%State%RamLine%NO_MINORS_AIRPLINE)) - - - -DO I=1,data%State%RamLine%NO_MINORS_AIRPLINE - data%State%RamLine%MINORDIAM_AIR_INCH(I)=data%State%BopStackInput%MINORS_AIRPUMP(I,1) - data%State%RamLine%LF_AIR(I)=data%State%BopStackInput%MINORS_AIRPUMP(I,2) - data%State%RamLine%CV_AIR(I)=data%State%BopStackInput%MINORS_AIRPUMP(I,3) - data%State%RamLine%NOTE_AIR(I)=data%State%BopStackInput%MINORS_AIRPUMP(I,4) - - - data%State%RamLine%MINORAREA_AIR(I)=PI*(data%State%RamLine%MINORDIAM_AIR_INCH(I)*0.0254)**2/4. !D(in), AREA(m) -ENDDO - - - - END - -SUBROUTINE pumps_charge_bottle() -use SimulationVariables -USE CAccumulatorVariables -USE CBopStackVariables -use CBopControlPanel - use SimulationVariables -USE CEquipmentsConstants -! use CSimulationVariables -implicit none - - !Pannular_regset=min(AnnularRegulatorSetControl,1700.) ! for changing its set conditions instantaneously -!write(*,*) 'pumps_charge_bottle' - - if(data%EquipmentControl%BopControlPanel%ByePassValve == -1.0) then - data%State%BopStackAcc%ByPassOld= -1.0 - elseif(data%EquipmentControl%BopControlPanel%ByePassValve == 1.0) then - data%State%BopStackAcc%ByPassOld= 1.0 - endif - - -!===================================================================== -! ACCUMULATOR -!=====for a 10 gal bottle,precharge=1000psig curve BOSCH-isotherm===== -!for charging bottles by the pump -!((((((((IN OUTER LOOP)))))) -! ba1=1003; ba2=.03375; ba3=4.014; ba4=.2458; -if (data%State%RamLine%AIRP_SWITCH==0) data%State%Pumps%DELTAV_AIR=0 -data%State%RamLine%FVR=data%State%RamLine%FVR+data%State%Pumps%DELTAV_AIR+data%State%Pumps%DELTAV_ELECP - -data%State%RamLine%pacc_before=data%State%RamLine%P_ACC -data%State%RamLine%P_ACC=data%State%RamLine%B1*exp(data%State%RamLine%B2*data%State%RamLine%FVR/data%State%BopStackAcc%NOBOTTLES)+data%State%RamLine%B3*exp(data%State%RamLine%B4*data%State%RamLine%FVR/data%State%BopStackAcc%NOBOTTLES) ! adiabatic(psig)<<<< 8=no. of bottles - -!===================================================================== - - - if(data%State%BopStackAcc%ByPassOld == 1.0) then - - if (data%State%BopStackAcc%pram_reg BaseDifferenceP) then - data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. - else - - if (data%State%BopStackAcc%pram_reg BaseDifferenceP) then - data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. - else - data%State%BopStackAcc%pram_reg= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) - endif - - endif - - - !Pannular_reg= min(p_acc,Pannular_regset) - - - end - - -SUBROUTINE airpump_code() -use SimulationVariables -use CSounds -implicit none -INTEGER I - - - -data%State%Pumps%QAIR=data%State%Pumps%Qiter+.1 !(gpm) maximum flow for the start -data%State%RamLine%diffp_air=-10 -data%State%RamLine%losses_air=10 - -!=================================================================== -! AIR OPERATED PUMP -!=================for air consumption at 8 bar====================== -do while (data%State%RamLine%diffp_air<0) - data%State%Pumps%QAIR=data%State%Pumps%QAIR-.1 -! Qup=QAIR_PUMP; -! bba1 =31.8; bba2 =-725.7 ; bba3 =4154; - data%State%Pumps%P_AIRP=data%State%RamLine%BBA1*data%State%Pumps%QAIR**2+data%State%RamLine%BBA2*data%State%Pumps%QAIR+data%State%RamLine%BBA3 !(psig) - data%State%RamLine%kinetic_air=sg*wdens*(data%State%Pumps%QAIR*6.30902e-5/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) - - - data%State%RamLine%diffp_air=data%State%Pumps%P_AIRP+data%State%RamLine%kinetic_air-data%State%RamLine%P_ACC - -end do !returns Qup - - - do while (abs((data%State%RamLine%diffp_air-data%State%RamLine%losses_air)/data%State%RamLine%diffp_air)>data%State%Pumps%TOL_AIR) !finding correct QAIR_pump for 1 timecounter_ram - -if (data%State%RamLine%diffp_air-data%State%RamLine%losses_air>0) then - data%State%Pumps%QAIR=data%State%Pumps%QAIR+.01 -else - data%State%Pumps%QAIR=data%State%Pumps%QAIR-.01 -endif - -!=================================================================== -! AIR OPERATED PUMP -! Maximator - Model: GX (35) -!=================for air consumption at 8 bar====================== - - data%State%Pumps%P_AIRP=data%State%RamLine%BBA1*data%State%Pumps%QAIR**2+data%State%RamLine%BBA2*data%State%Pumps%QAIR+data%State%RamLine%BBA3 !(psig) - data%State%RamLine%kinetic_air=sg*wdens*(data%State%Pumps%QAIR*6.30902e-005/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) - - data%State%RamLine%diffp_air=data%State%Pumps%P_AIRP+data%State%RamLine%kinetic_air-data%State%RamLine%P_ACC - - -!===========================LOSSES==================================== - do i=1,data%State%RamLine%NO_PIPINGS_AIRPLINE -data%State%RamLine%Re_air(i)=data%State%Pumps%QAIR*6.30902e-005*data%State%RamLine%DIAM_AIR_INCH(I)*0.0254/(data%State%RamLine%AREA_AIR(i)*nu) -enddo - -do i=1,data%State%RamLine%NO_PIPINGS_AIRPLINE - if (data%State%RamLine%Re_air(i)data%State%ShearRAM%NeededVolumeShearRams) then - - data%State%RamLine%ShearBop_closed=1 - !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) - - data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) - data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck - - if (data%State%RamLine%ShearRamIsClosing) then - data%State%ShearRAM%IDshearBop=0. + data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn - data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOn - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff - data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff - if (data%State%TD_BOP%BOPConnectionPossibility(3) == 1 .and. data%State%ShearRAM%ShearIsNotAllowed==0) then - CALL CloseMiddleRams - data%State%RamLine%ShearBop_Situation_forTD= 1 ! closed - for TD code - endif - endif - - if (data%State%RamLine%ShearRamIsOpening) then - data%State%ShearRAM%IDshearBop=data%State%ShearRAM%IDshearBopBase - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn - data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff - data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff - CALL OpenMiddleRams - data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code - endif - - endif - - data%State%ShearRAM%IDshearBopFinal= data%State%ShearRAM%IDshearBop ! for output data - -endif - -if (ramtype==2) then !for pipe ram1 - if (data%State%PipeRam1%IsClosing) then - data%State%PipeRam1%ID=(2.*(data%State%PipeRam1%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A)+max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) - endif - - if (data%State%PipeRam1%IsOpening) then - data%State%PipeRam1%ID=data%State%PipeRam1%IDBase-2.*(data%State%PipeRam1%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A - endif - - if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%PipeRam1%NeededVolume) then - - data%State%PipeRam1%closed=1 - !PipeRam1_Situation_forTD= PipeRam1_closed * TD_BOPConnectionPossibility(2) - data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) - data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck - - if (data%State%PipeRam1%IsClosing) then - data%State%PipeRam1%ID=max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOn - data%State%BopStackInput%UpperRamsCloseLEDMine = LedOn - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOff - data%State%BopStackInput%UpperRamsOpenLEDMine = LedOff - if (data%State%TD_BOP%BOPConnectionPossibility(2) == 1) then - CALL CloseUpperRams ! for C code - call Set_BlowoutFromAnnular(.true.) - - - data%State%PipeRam1%Situation_forTD= 1 ! closed - for TD code - endif - endif - - if (data%State%PipeRam1%IsOpening) then - data%State%PipeRam1%ID=data%State%PipeRam1%IDBase - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn - data%State%BopStackInput%UpperRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff - data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff - Call OpenUpperRams ! for C code - data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code - endif - - endif - - data%State%ShearRAM%IDPipeRam1Final= data%State%PipeRam1%ID ! for output data - -endif - - -if (ramtype==3) then !for pipe ram2 - if (data%State%PipeRam2%IsClosing) then - data%State%PipeRam2%ID=(2.*(data%State%PipeRam2%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A)+max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) - endif - - if (data%State%PipeRam2%IsOpening) then - data%State%PipeRam2%ID=data%State%PipeRam1%IDBase-2.*(data%State%PipeRam2%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A - endif - - if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%PipeRam2%NeededVolume) then - - data%State%PipeRam2%closed=1 - !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) - data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) - data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck - - if (data%State%PipeRam2%IsClosing) then - data%State%PipeRam2%ID=max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn - data%State%BopStackInput%LowerRamsCloseLEDMine = LedOn - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff - data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff - if (data%State%TD_BOP%BOPConnectionPossibility(4) == 1) then - CALL CloseLowerRams - data%State%PipeRam2%Situation_forTD= 1 ! closed - for TD code - endif - endif - - if (data%State%PipeRam2%IsOpening) then - data%State%PipeRam2%ID=data%State%PipeRam1%IDBase - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn - data%State%BopStackInput%LowerRamsOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff - data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff - CALL OpenLowerRams - data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code - endif - - endif - - data%State%ShearRAM%IDPipeRam2Final= data%State%PipeRam2%ID ! for output data - -endif - - -if (ramtype==4) then !for Choke Line - if (data%State%ChokeLine%IsClosing) then - data%State%ChokeLine%ID=(2.*(data%State%ChokeLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%ChokeLine%Abop)+max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase) - endif - - if (data%State%ChokeLine%IsOpening) then - data%State%ChokeLine%ID=data%State%ChokeLine%IDBase-2.*(data%State%ChokeLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%ChokeLine%Abop - endif - - if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%ChokeLine%NeededVolume) then - - data%State%ChokeLine%closed=1 - data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) - data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck - - if (data%State%ChokeLine%IsClosing) then - data%State%ChokeLine%ID=max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase) - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOn - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff - data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff - CALL CloseChokeLine - endif - - if (data%State%ChokeLine%IsOpening) then - data%State%ChokeLine%ID=data%State%ChokeLine%IDBase - data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn - data%State%BopStackInput%ChokeLineOpenLEDMine = LedOn - data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff - data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff - CALL OpenChokeLine - endif - - endif - -endif - - - -if (ramtype==5) then !for Kill Line - if (data%State%KillLine%IsClosing) then - data%State%KillLine%ID=(2.*(data%State%KillLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%KillLine%Abop)+max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase) - endif - - if (data%State%KillLine%IsOpening) then - data%State%KillLine%ID=data%State%KillLine%IDBase-2.*(data%State%KillLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%KillLine%Abop - endif - - if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%KillLine%NeededVolume) then - - data%State%KillLine%closed=1 - data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) - data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck - - if (data%State%KillLine%IsClosing) then - data%State%KillLine%ID=max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase) - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn - data%State%BopStackInput%KillLineCloseLedMine = LedOn - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff - data%State%BopStackInput%KillLineOpenLedMine = LedOff - CALL CloseKillLine - endif - - if (data%State%KillLine%IsOpening) then - data%State%KillLine%ID=data%State%KillLine%IDBase - data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn - data%State%BopStackInput%KillLineOpenLedMine = LedOn - data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff - data%State%BopStackInput%KillLineCloseLedMine = LedOff - CALL OpenKillLine - endif - - endif - -endif - - - - -!if (ramtype==4) then !for annular -! if (AnnularIsClosing) then -! IDAnnular=((NeededVolumeAnnular-vdis_tot)*231./AbopAnnular)+ODDrillpipe_inAnnular -! endif -! -! if (AnnularIsOpening) then -! IDAnnular=IDAnnularBase-(NeededVolumeAnnular-vdis_tot)*231./AbopAnnular -! endif -! -! if (vdis_tot>NeededVolumeAnnular) then -! -! Annular_closed=1 -! p_acc= data%State%RAM(RNUMBER)%p_acccheck -! -! if (AnnularIsClosing) then -! IDAnnular=ODDrillpipe_inAnnular -! AnnularCloseLed = LedOn -! AnnularOpenLed = LedOff -! endif -! -! if (AnnularIsOpening) then -! IDAnnular=IDAnnularBase -! AnnularOpenLed = LedOn -! AnnularCloseLed = LedOff -! endif -! -! endif -! -!endif - - - end - - - - SUBROUTINE bop_codeAnnular(RNUMBER) - - use SimulationVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - use SimulationVariables !@ -implicit none -INTEGER RNUMBER, I - - - !Pannular_regset=min(AnnularRegulatorSetControl,1700.) ! for changing its set conditions instantaneously - -!==================================================== -! BOP back pressure without DP -!==================================================== -!if (bop_type==3) then - !p_annular=510.725-(30.145*IDAnnular) - data%State%AnnularComputational%p_annular=448-(19.7*data%State%Annular%IDAnnular) -! Q=flow -! endif - - - - data%State%RAM(RNUMBER)%clock=0 -!======================Losses============================ - data%State%RAM(RNUMBER)%loss_after=0 !initial value - data%State%RAM(RNUMBER)%diffp_ram=1000 !initial value - data%State%RAM(RNUMBER)%loss_before=0 - -!Q=0.0055; %initial flow rate (m^3/s) - - data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%flow - -!write(*,*) 'Q1=' , Q -!write(*,*) 'tol=' , tol -do while (abs( data%State%RAM(RNUMBER)%diffp_ram- data%State%RAM(RNUMBER)%loss_after)/ data%State%RAM(RNUMBER)%diffp_ram>data%State%Annular%tolAnnular) - if (data%State%RAM(RNUMBER)%Bottles_Charged_MalfActive==.true.) exit -! while abs( data%State%RAM(RNUMBER)%diffp_ram- data%State%RAM(RNUMBER)%loss_after)>10 - data%State%RAM(RNUMBER)%clock= data%State%RAM(RNUMBER)%clock+1 - -if ( data%State%RAM(RNUMBER)%clock>20) then -! tclock=clock - data%State%Annular%tolAnnular=data%State%Annular%tolzeroAnnular+(floor( data%State%RAM(RNUMBER)%clock/10)-1)*.001 -endif - ! if (clock==1) continue - - if ( data%State%RAM(RNUMBER)%clock/=1 .and. data%State%RAM(RNUMBER)%loss_after> data%State%RAM(RNUMBER)%diffp_ram) then - data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%Q-.1 - elseif ( data%State%RAM(RNUMBER)%clock/=1 .and. data%State%RAM(RNUMBER)%loss_after<= data%State%RAM(RNUMBER)%diffp_ram) then - data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%Q+.01 - - endif - -!====================Before Regulator========================= -do i=1,data%State%AnnularComputational%NO_PipingsAnnularLine -data%State%AnnularComputational%Re_ANNULARline(i)=data%State%RAM(RNUMBER)%Q*6.30902e-5*data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(i)*0.0254/(data%State%AnnularComputational%AREA_ANNULARLINE(i)*nu) - -enddo - - - -do i=1,data%State%AnnularComputational%NO_PipingsAnnularLine - if (data%State%AnnularComputational%Re_ANNULARline(i) BaseDifferenceP) then + data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. + else + + if (data%State%BopStackAcc%pram_reg BaseDifferenceP) then + data%State%BopStackAcc%pram_reg= data%State%BopStackAcc%pram_reg + (data%State%BopStackAcc%PressureDifference/PressureDifferenceSteps) ! PressureDifferenceSteps = 20. + else + data%State%BopStackAcc%pram_reg= data%State%RamLine%P_ACC- MAXVAL(data%State%RAM%loss_before) + endif + + endif + + + !Pannular_reg= min(p_acc,Pannular_regset) + + + end + + +SUBROUTINE airpump_code() +use SimulationVariables +use CSounds +implicit none +INTEGER I + + + +data%State%Pumps%QAIR=data%State%Pumps%Qiter+.1 !(gpm) maximum flow for the start +data%State%RamLine%diffp_air=-10 +data%State%RamLine%losses_air=10 + +!=================================================================== +! AIR OPERATED PUMP +!=================for air consumption at 8 bar====================== +do while (data%State%RamLine%diffp_air<0) + data%State%Pumps%QAIR=data%State%Pumps%QAIR-.1 +! Qup=QAIR_PUMP; +! bba1 =31.8; bba2 =-725.7 ; bba3 =4154; + data%State%Pumps%P_AIRP=data%State%RamLine%BBA1*data%State%Pumps%QAIR**2+data%State%RamLine%BBA2*data%State%Pumps%QAIR+data%State%RamLine%BBA3 !(psig) + data%State%RamLine%kinetic_air=sg*wdens*(data%State%Pumps%QAIR*6.30902e-5/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) + + + data%State%RamLine%diffp_air=data%State%Pumps%P_AIRP+data%State%RamLine%kinetic_air-data%State%RamLine%P_ACC + +end do !returns Qup + + + do while (abs((data%State%RamLine%diffp_air-data%State%RamLine%losses_air)/data%State%RamLine%diffp_air)>data%State%Pumps%TOL_AIR) !finding correct QAIR_pump for 1 timecounter_ram + +if (data%State%RamLine%diffp_air-data%State%RamLine%losses_air>0) then + data%State%Pumps%QAIR=data%State%Pumps%QAIR+.01 +else + data%State%Pumps%QAIR=data%State%Pumps%QAIR-.01 +endif + +!=================================================================== +! AIR OPERATED PUMP +! Maximator - Model: GX (35) +!=================for air consumption at 8 bar====================== + + data%State%Pumps%P_AIRP=data%State%RamLine%BBA1*data%State%Pumps%QAIR**2+data%State%RamLine%BBA2*data%State%Pumps%QAIR+data%State%RamLine%BBA3 !(psig) + data%State%RamLine%kinetic_air=sg*wdens*(data%State%Pumps%QAIR*6.30902e-005/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) + + data%State%RamLine%diffp_air=data%State%Pumps%P_AIRP+data%State%RamLine%kinetic_air-data%State%RamLine%P_ACC + + +!===========================LOSSES==================================== + do i=1,data%State%RamLine%NO_PIPINGS_AIRPLINE +data%State%RamLine%Re_air(i)=data%State%Pumps%QAIR*6.30902e-005*data%State%RamLine%DIAM_AIR_INCH(I)*0.0254/(data%State%RamLine%AREA_AIR(i)*nu) +enddo + +do i=1,data%State%RamLine%NO_PIPINGS_AIRPLINE + if (data%State%RamLine%Re_air(i)data%State%ShearRAM%NeededVolumeShearRams) then + + data%State%RamLine%ShearBop_closed=1 + !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) + + data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) + data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck + + if (data%State%RamLine%ShearRamIsClosing) then + data%State%ShearRAM%IDshearBop=0. + data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn + data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOn + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff + data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff + if (data%State%TD_BOP%BOPConnectionPossibility(3) == 1 .and. data%State%ShearRAM%ShearIsNotAllowed==0) then + CALL CloseMiddleRams + data%State%RamLine%ShearBop_Situation_forTD= 1 ! closed - for TD code + endif + endif + + if (data%State%RamLine%ShearRamIsOpening) then + data%State%ShearRAM%IDshearBop=data%State%ShearRAM%IDshearBopBase + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn + data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff + data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff + CALL OpenMiddleRams + data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code + endif + + endif + + data%State%ShearRAM%IDshearBopFinal= data%State%ShearRAM%IDshearBop ! for output data + +endif + +if (ramtype==2) then !for pipe ram1 + if (data%State%PipeRam1%IsClosing) then + data%State%PipeRam1%ID=(2.*(data%State%PipeRam1%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A)+max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) + endif + + if (data%State%PipeRam1%IsOpening) then + data%State%PipeRam1%ID=data%State%PipeRam1%IDBase-2.*(data%State%PipeRam1%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A + endif + + if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%PipeRam1%NeededVolume) then + + data%State%PipeRam1%closed=1 + !PipeRam1_Situation_forTD= PipeRam1_closed * TD_BOPConnectionPossibility(2) + data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) + data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck + + if (data%State%PipeRam1%IsClosing) then + data%State%PipeRam1%ID=max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOn + data%State%BopStackInput%UpperRamsCloseLEDMine = LedOn + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOff + data%State%BopStackInput%UpperRamsOpenLEDMine = LedOff + if (data%State%TD_BOP%BOPConnectionPossibility(2) == 1) then + CALL CloseUpperRams ! for C code + call Set_BlowoutFromAnnular(.true.) + + + data%State%PipeRam1%Situation_forTD= 1 ! closed - for TD code + endif + endif + + if (data%State%PipeRam1%IsOpening) then + data%State%PipeRam1%ID=data%State%PipeRam1%IDBase + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn + data%State%BopStackInput%UpperRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff + data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff + Call OpenUpperRams ! for C code + data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code + endif + + endif + + data%State%ShearRAM%IDPipeRam1Final= data%State%PipeRam1%ID ! for output data + +endif + + +if (ramtype==3) then !for pipe ram2 + if (data%State%PipeRam2%IsClosing) then + data%State%PipeRam2%ID=(2.*(data%State%PipeRam2%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A)+max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) + endif + + if (data%State%PipeRam2%IsOpening) then + data%State%PipeRam2%ID=data%State%PipeRam1%IDBase-2.*(data%State%PipeRam2%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%PipeRam1%A + endif + + if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%PipeRam2%NeededVolume) then + + data%State%PipeRam2%closed=1 + !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) + data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) + data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck + + if (data%State%PipeRam2%IsClosing) then + data%State%PipeRam2%ID=max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase) + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn + data%State%BopStackInput%LowerRamsCloseLEDMine = LedOn + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff + data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff + if (data%State%TD_BOP%BOPConnectionPossibility(4) == 1) then + CALL CloseLowerRams + data%State%PipeRam2%Situation_forTD= 1 ! closed - for TD code + endif + endif + + if (data%State%PipeRam2%IsOpening) then + data%State%PipeRam2%ID=data%State%PipeRam1%IDBase + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn + data%State%BopStackInput%LowerRamsOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff + data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff + CALL OpenLowerRams + data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code + endif + + endif + + data%State%ShearRAM%IDPipeRam2Final= data%State%PipeRam2%ID ! for output data + +endif + + +if (ramtype==4) then !for Choke Line + if (data%State%ChokeLine%IsClosing) then + data%State%ChokeLine%ID=(2.*(data%State%ChokeLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%ChokeLine%Abop)+max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase) + endif + + if (data%State%ChokeLine%IsOpening) then + data%State%ChokeLine%ID=data%State%ChokeLine%IDBase-2.*(data%State%ChokeLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%ChokeLine%Abop + endif + + if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%ChokeLine%NeededVolume) then + + data%State%ChokeLine%closed=1 + data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) + data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck + + if (data%State%ChokeLine%IsClosing) then + data%State%ChokeLine%ID=max(data%State%ChokeLine%ODDrillpipe_in,data%State%ChokeLine%ODDrillpipe_inBase) + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOn + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOn + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOff + data%State%BopStackInput%ChokeLineOpenLEDMine = LedOff + CALL CloseChokeLine + endif + + if (data%State%ChokeLine%IsOpening) then + data%State%ChokeLine%ID=data%State%ChokeLine%IDBase + data%EquipmentControl%BopControlPanel%ChokeLineOpenLED = LedOn + data%State%BopStackInput%ChokeLineOpenLEDMine = LedOn + data%EquipmentControl%BopControlPanel%ChokeLineCloseLED = LedOff + data%State%BopStackInput%ChokeLineCloseLEDMine = LedOff + CALL OpenChokeLine + endif + + endif + +endif + + + +if (ramtype==5) then !for Kill Line + if (data%State%KillLine%IsClosing) then + data%State%KillLine%ID=(2.*(data%State%KillLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%KillLine%Abop)+max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase) + endif + + if (data%State%KillLine%IsOpening) then + data%State%KillLine%ID=data%State%KillLine%IDBase-2.*(data%State%KillLine%NeededVolume- data%State%RAM(RNUMBER)%vdis_tot)*231./data%State%KillLine%Abop + endif + + if ( data%State%RAM(RNUMBER)%vdis_tot>data%State%KillLine%NeededVolume) then + + data%State%KillLine%closed=1 + data%State%BopStackAcc%pram_reg=data%State%BopStackAcc%pram_reg+data%State%RAMS%minloss(RNUMBER,17) + data%State%RamLine%P_ACC= data%State%RAM(RNUMBER)%p_acccheck + + if (data%State%KillLine%IsClosing) then + data%State%KillLine%ID=max(data%State%KillLine%ODDrillpipe_in,data%State%KillLine%ODDrillpipe_inBase) + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOn + data%State%BopStackInput%KillLineCloseLedMine = LedOn + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOff + data%State%BopStackInput%KillLineOpenLedMine = LedOff + CALL CloseKillLine + endif + + if (data%State%KillLine%IsOpening) then + data%State%KillLine%ID=data%State%KillLine%IDBase + data%EquipmentControl%BopControlPanel%KillLineOpenLED = LedOn + data%State%BopStackInput%KillLineOpenLedMine = LedOn + data%EquipmentControl%BopControlPanel%KillLineCloseLED = LedOff + data%State%BopStackInput%KillLineCloseLedMine = LedOff + CALL OpenKillLine + endif + + endif + +endif + + + + +!if (ramtype==4) then !for annular +! if (AnnularIsClosing) then +! IDAnnular=((NeededVolumeAnnular-vdis_tot)*231./AbopAnnular)+ODDrillpipe_inAnnular +! endif +! +! if (AnnularIsOpening) then +! IDAnnular=IDAnnularBase-(NeededVolumeAnnular-vdis_tot)*231./AbopAnnular +! endif +! +! if (vdis_tot>NeededVolumeAnnular) then +! +! Annular_closed=1 +! p_acc= data%State%RAM(RNUMBER)%p_acccheck +! +! if (AnnularIsClosing) then +! IDAnnular=ODDrillpipe_inAnnular +! AnnularCloseLed = LedOn +! AnnularOpenLed = LedOff +! endif +! +! if (AnnularIsOpening) then +! IDAnnular=IDAnnularBase +! AnnularOpenLed = LedOn +! AnnularCloseLed = LedOff +! endif +! +! endif +! +!endif + + + end + + + + SUBROUTINE bop_codeAnnular(RNUMBER) + + use SimulationVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + use SimulationVariables !@ +implicit none +INTEGER RNUMBER, I + + + !Pannular_regset=min(AnnularRegulatorSetControl,1700.) ! for changing its set conditions instantaneously + +!==================================================== +! BOP back pressure without DP +!==================================================== +!if (bop_type==3) then + !p_annular=510.725-(30.145*IDAnnular) + data%State%AnnularComputational%p_annular=448-(19.7*data%State%Annular%IDAnnular) +! Q=flow +! endif + + + + data%State%RAM(RNUMBER)%clock=0 +!======================Losses============================ + data%State%RAM(RNUMBER)%loss_after=0 !initial value + data%State%RAM(RNUMBER)%diffp_ram=1000 !initial value + data%State%RAM(RNUMBER)%loss_before=0 + +!Q=0.0055; %initial flow rate (m^3/s) + + data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%flow + +!write(*,*) 'Q1=' , Q +!write(*,*) 'tol=' , tol +do while (abs( data%State%RAM(RNUMBER)%diffp_ram- data%State%RAM(RNUMBER)%loss_after)/ data%State%RAM(RNUMBER)%diffp_ram>data%State%Annular%tolAnnular) + if (data%State%RAM(RNUMBER)%Bottles_Charged_MalfActive==.true.) exit +! while abs( data%State%RAM(RNUMBER)%diffp_ram- data%State%RAM(RNUMBER)%loss_after)>10 + data%State%RAM(RNUMBER)%clock= data%State%RAM(RNUMBER)%clock+1 + +if ( data%State%RAM(RNUMBER)%clock>20) then +! tclock=clock + data%State%Annular%tolAnnular=data%State%Annular%tolzeroAnnular+(floor( data%State%RAM(RNUMBER)%clock/10)-1)*.001 +endif + ! if (clock==1) continue + + if ( data%State%RAM(RNUMBER)%clock/=1 .and. data%State%RAM(RNUMBER)%loss_after> data%State%RAM(RNUMBER)%diffp_ram) then + data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%Q-.1 + elseif ( data%State%RAM(RNUMBER)%clock/=1 .and. data%State%RAM(RNUMBER)%loss_after<= data%State%RAM(RNUMBER)%diffp_ram) then + data%State%RAM(RNUMBER)%Q=data%State%RAM(RNUMBER)%Q+.01 + + endif + +!====================Before Regulator========================= +do i=1,data%State%AnnularComputational%NO_PipingsAnnularLine +data%State%AnnularComputational%Re_ANNULARline(i)=data%State%RAM(RNUMBER)%Q*6.30902e-5*data%State%AnnularComputational%DIAM_ANNULARLINE_INCH(i)*0.0254/(data%State%AnnularComputational%AREA_ANNULARLINE(i)*nu) + +enddo + + + +do i=1,data%State%AnnularComputational%NO_PipingsAnnularLine + if (data%State%AnnularComputational%Re_ANNULARline(i)= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(2)%First_OpenTimecheck= 1 - - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff !new - data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff !new - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn !LedBlinking - - data%State%RAM(2)%FourwayValve = 1 - - endif - - endif - - if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close - !write(*,*) 'open 2' - - data%State%RAM(2)%FourwayValve = 0 - - - data%State%PipeRam1%closed=0 - !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) - data%State%RAM(2)%vdis_tot=0 - data%State%RAM(2)%vdis_bottles=0. - data%State%RAM(2)%fvr_air=0. - data%State%RAM(2)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(2)%Qzero=70 - data%State%RAM(2)%Q=data%State%RAM(2)%Qzero - data%State%RAM(2)%flow=70 - data%State%RAM(2)%tol=0.0037 - - - - if (data%State%PipeRam1%finished==1) then - data%State%PipeRam1%PipeRams1DotLeverOld=1.0 - else - data%State%PipeRam1%PipeRams1DotLeverOld=data%EquipmentControl%BopControlPanel%UpperRamsValve - endif - data%State%PipeRam1%finished=0 - data%State%PipeRam1%IsOpening = .true. - data%State%PipeRam1%IsClosing = .false. - - - !if (UpperRamsOpenLED == LedOn) then - ! RETURN - !end if - - - - data%State%RAM(2)%bop_type = 3 - !AbopPipeRam=186.5 - data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !3.48 galon for each BOP - endif - -!===================================================================== - - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 -if (data%State%PipeRam1%IsOpening .or. data%State%PipeRam1%IsClosing .or. data%State%RAM(2)%Bottles_Charged_MalfActive) then - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - CALL PIPE_RAMS1_SUB -end if - - - END SUBROUTINE PIPE_RAMS1 - - - - - - - - - - - -SUBROUTINE PIPE_RAMS1_SUB - - use SimulationVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - implicit none - - - ! FirstSet= 0 - ! RamsFirstSet= 0 - - ! loop3: do while (finished_pipe1==0) - - - data%State%RAM(2)%SuccessionCounter = data%State%RAM(2)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%UpperRamsValve == 1.0 .and. data%State%PipeRam1%PipeRams1DotLeverOld == -1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - - - if ( data%State%RAM(2)%First_CloseTimecheck == 0 ) then - - - if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then - data%State%RAM(2)%SuccessionCounter = 0 ! also in starup - data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter - endif - - - - if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOff - data%State%BopStackInput%UpperRamsOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOn !LedBlinking - - data%State%RAM(2)%FourwayValve = 1 - - endif - - endif - - endif - - if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - !write(*,*) 'close 4' - - data%State%RAM(2)%FourwayValve = 0 - - - data%State%PipeRam1%closed=0 - !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) ! for TD code - CALL OpenUpperRams ! for C code - data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code - data%State%RAM(2)%p_bop=data%State%ShearRAM%PA - data%State%PipeRam1%PipeRams1DotLeverOld = data%EquipmentControl%BopControlPanel%UpperRamsValve - - - data%State%RAM(2)%bop_type = 3 - !AbopPipeRam=196.67 - data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - !write(*,*) 'NeededVolumeShearRams1=',NeededVolumeShearRams - data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%ID-max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) - ! write(*,*) 'NeededVolumeShearRams2=',NeededVolumeShearRams - - data%State%RAM(2)%vdis_bottles=0. - data%State%RAM(2)%fvr_air=0. - data%State%RAM(2)%vdis_elecp=0. - data%State%PipeRam1%IsClosing = .true. - data%State%PipeRam1%IsOpening = .false. - endif - - if (data%EquipmentControl%BopControlPanel%UpperRamsValve == -1.0 .and. data%State%PipeRam1%PipeRams1DotLeverOld == 1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - - if ( data%State%RAM(2)%First_OpenTimecheck == 0 ) then - - if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then - data%State%RAM(2)%SuccessionCounter = 0 ! also in starup - data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter - endif - - if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff - data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff - data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn !LedBlinking - - data%State%RAM(2)%FourwayValve = 1 - - - endif - - endif - - endif - - if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - !write(*,*) 'open 4' - - data%State%RAM(2)%FourwayValve = 0 - - - - data%State%PipeRam1%closed=0 - !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) - CALL OpenUpperRams - data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code - data%State%RAM(2)%p_bop=data%State%ShearRAM%PA - data%State%PipeRam1%PipeRams1DotLeverOld = data%EquipmentControl%BopControlPanel%UpperRamsValve - - data%State%RAM(2)%bop_type = 3 - !AbopPipeRam=186.5 - data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-data%State%PipeRam1%ID)/(2.*231) - data%State%RAM(2)%vdis_bottles=0. - data%State%RAM(2)%fvr_air=0. - data%State%RAM(2)%vdis_elecp=0. - - data%State%PipeRam1%IsOpening = .true. - data%State%PipeRam1%IsClosing = .false. - endif - - - data%State%RAM(2)%First_CloseTimecheck = 0 - data%State%RAM(2)%First_OpenTimecheck = 0 - - - data%State%RAM(2)%time=data%State%RAM(2)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - - -!=================================================== -! BOP -!=================================================== -if (data%State%PipeRam1%closed==0) then !bop closing - call bop_code(2,data%State%PipeRam1%H,2) !ramtype=2 2=RNUMBER -endif !bop is closing -!================================================================ -if (data%State%PipeRam1%closed==1) then - data%State%RAM(2)%Q=0 - !p_bop=pram_reg - data%State%RAM(2)%p_bop=data%State%ShearRAM%PA - data%State%RAMS%minloss(2,17)=0. !RNUMBER=2 -endif - -data%State%RAM(2)%timecounter_ram=data%State%RAM(2)%timecounter_ram+1 - - - - - -! MiddleRamsStatus = IDshearBop -! UpperRamsStatus = IDPipeRam1 -! LowerRamsStatus = IDPipeRam2 -! AnnularStatus = IDAnnular -! AccumulatorPressureGauge = p_acc -! ManifoldPressureGauge= pram_reg -! AnnularPressureGauge=Pannular_reg -! -! -! -! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - ! call sleepqq(100) - -if (data%State%PipeRam1%closed==1) then - ! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then - data%State%PipeRam1%finished=1 - ! endif -endif - - ! if (IsStopped == .true.) return - - ! end do loop3 !while finished_pipe1==0 - - - - - - - if ( data%State%PipeRam1%finished==1 .and. data%State%RAM(2)%Bottles_Charged_MalfActive==.true.) then - call bop_code(2,data%State%PipeRam1%H,2) !ramtype=2 2=RNUMBER - ! call sleepqq(100) - endif - - - - - - +SUBROUTINE PIPE_RAMS1 + use SimulationVariables + ! USE CAccumulatorVariables + ! USE CBopStackVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! ! use CSimulationVariables + implicit none + +!===================================================================== +! PIPE RAMS 1- BOP CAMERON Type U 5000 +! START CONDITIONS FOR PIPE RAMS 1 +!===================================================================== + data%State%RAM(2)%SuccessionCounter = data%State%RAM(2)%SuccessionCounter + 1 + if (data%EquipmentControl%BopControlPanel%UpperRamsValve == 1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + if (data%State%BopStackInput%UpperRamsCloseLEDMine == LedOn) then + RETURN + end if + if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then + data%State%RAM(2)%SuccessionCounter = 0 ! also in starup + data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter + endif + + + + + if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(2)%First_CloseTimecheck= 1 + + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOff + data%State%BopStackInput%UpperRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOn !LedBlinking + + data%State%RAM(2)%FourwayValve = 1 + endif + + endif + + + if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'close 2' + + data%State%RAM(2)%FourwayValve = 0 + + + + data%State%PipeRam1%closed=0 + !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) + data%State%RAM(2)%vdis_tot=0 + data%State%RAM(2)%vdis_bottles=0. + data%State%RAM(2)%fvr_air=0. + data%State%RAM(2)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(2)%Qzero=70 + data%State%RAM(2)%Q=data%State%RAM(2)%Qzero + data%State%RAM(2)%flow=70 + data%State%RAM(2)%tol=0.0037 + if (data%State%PipeRam1%finished==1) then + data%State%PipeRam1%PipeRams1DotLeverOld=-1.0 + else + data%State%PipeRam1%PipeRams1DotLeverOld=data%EquipmentControl%BopControlPanel%UpperRamsValve + endif + data%State%PipeRam1%finished=0 + data%State%PipeRam1%IsClosing = .true. + data%State%PipeRam1%IsOpening = .false. + + data%State%RAM(2)%bop_type = 3 + !AbopPipeRam=196.67 + data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !3.67 galon for each BOP + endif + + if (data%EquipmentControl%BopControlPanel%UpperRamsValve == -1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + if (data%State%BopStackInput%UpperRamsOpenLEDMine == LedOn) then + RETURN + end if + + if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then + data%State%RAM(2)%SuccessionCounter = 0 ! also in starup + data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter + endif + + + if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(2)%First_OpenTimecheck= 1 + + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff !new + data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff !new + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn !LedBlinking + + data%State%RAM(2)%FourwayValve = 1 + + endif + + endif + + if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'open 2' + + data%State%RAM(2)%FourwayValve = 0 + + + data%State%PipeRam1%closed=0 + !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) + data%State%RAM(2)%vdis_tot=0 + data%State%RAM(2)%vdis_bottles=0. + data%State%RAM(2)%fvr_air=0. + data%State%RAM(2)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(2)%Qzero=70 + data%State%RAM(2)%Q=data%State%RAM(2)%Qzero + data%State%RAM(2)%flow=70 + data%State%RAM(2)%tol=0.0037 + + + + if (data%State%PipeRam1%finished==1) then + data%State%PipeRam1%PipeRams1DotLeverOld=1.0 + else + data%State%PipeRam1%PipeRams1DotLeverOld=data%EquipmentControl%BopControlPanel%UpperRamsValve + endif + data%State%PipeRam1%finished=0 + data%State%PipeRam1%IsOpening = .true. + data%State%PipeRam1%IsClosing = .false. + + + !if (UpperRamsOpenLED == LedOn) then + ! RETURN + !end if + + + + data%State%RAM(2)%bop_type = 3 + !AbopPipeRam=186.5 + data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !3.48 galon for each BOP + endif + +!===================================================================== + + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 +if (data%State%PipeRam1%IsOpening .or. data%State%PipeRam1%IsClosing .or. data%State%RAM(2)%Bottles_Charged_MalfActive) then + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + CALL PIPE_RAMS1_SUB +end if + + + END SUBROUTINE PIPE_RAMS1 + + + + + + + + + + + +SUBROUTINE PIPE_RAMS1_SUB + + use SimulationVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + implicit none + + + ! FirstSet= 0 + ! RamsFirstSet= 0 + + ! loop3: do while (finished_pipe1==0) + + + data%State%RAM(2)%SuccessionCounter = data%State%RAM(2)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%UpperRamsValve == 1.0 .and. data%State%PipeRam1%PipeRams1DotLeverOld == -1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + + + if ( data%State%RAM(2)%First_CloseTimecheck == 0 ) then + + + if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then + data%State%RAM(2)%SuccessionCounter = 0 ! also in starup + data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter + endif + + + + if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOff + data%State%BopStackInput%UpperRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOn !LedBlinking + + data%State%RAM(2)%FourwayValve = 1 + + endif + + endif + + endif + + if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + !write(*,*) 'close 4' + + data%State%RAM(2)%FourwayValve = 0 + + + data%State%PipeRam1%closed=0 + !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) ! for TD code + CALL OpenUpperRams ! for C code + data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code + data%State%RAM(2)%p_bop=data%State%ShearRAM%PA + data%State%PipeRam1%PipeRams1DotLeverOld = data%EquipmentControl%BopControlPanel%UpperRamsValve + + + data%State%RAM(2)%bop_type = 3 + !AbopPipeRam=196.67 + data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + !write(*,*) 'NeededVolumeShearRams1=',NeededVolumeShearRams + data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%ID-max(data%State%PipeRam1%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) + ! write(*,*) 'NeededVolumeShearRams2=',NeededVolumeShearRams + + data%State%RAM(2)%vdis_bottles=0. + data%State%RAM(2)%fvr_air=0. + data%State%RAM(2)%vdis_elecp=0. + data%State%PipeRam1%IsClosing = .true. + data%State%PipeRam1%IsOpening = .false. + endif + + if (data%EquipmentControl%BopControlPanel%UpperRamsValve == -1.0 .and. data%State%PipeRam1%PipeRams1DotLeverOld == 1.0 .and. data%State%PipeRam1%UpperRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + + if ( data%State%RAM(2)%First_OpenTimecheck == 0 ) then + + if ( data%State%RAM(2)%SuccessionCounter /= data%State%RAM(2)%SuccessionCounterOld+1 ) then + data%State%RAM(2)%SuccessionCounter = 0 ! also in starup + data%State%RAM(2)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(2)%SuccessionCounterOld= data%State%RAM(2)%SuccessionCounter + endif + + if ( data%State%RAM(2)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%UpperRamsCloseLED = LedOff + data%State%BopStackInput%UpperRamsCloseLEDMine = LedOff + data%EquipmentControl%BopControlPanel%UpperRamsOpenLED = LedOn !LedBlinking + + data%State%RAM(2)%FourwayValve = 1 + + + endif + + endif + + endif + + if (data%State%RAM(2)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + !write(*,*) 'open 4' + + data%State%RAM(2)%FourwayValve = 0 + + + + data%State%PipeRam1%closed=0 + !PipeRam1_closed_withPossibility= PipeRam1_closed * TD_BOPConnectionPossibility(2) + CALL OpenUpperRams + data%State%PipeRam1%Situation_forTD= 0 ! open - for TD code + data%State%RAM(2)%p_bop=data%State%ShearRAM%PA + data%State%PipeRam1%PipeRams1DotLeverOld = data%EquipmentControl%BopControlPanel%UpperRamsValve + + data%State%RAM(2)%bop_type = 3 + !AbopPipeRam=186.5 + data%State%PipeRam1%A=(data%Configuration%BopStack%UpperRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam1%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-data%State%PipeRam1%ID)/(2.*231) + data%State%RAM(2)%vdis_bottles=0. + data%State%RAM(2)%fvr_air=0. + data%State%RAM(2)%vdis_elecp=0. + + data%State%PipeRam1%IsOpening = .true. + data%State%PipeRam1%IsClosing = .false. + endif + + + data%State%RAM(2)%First_CloseTimecheck = 0 + data%State%RAM(2)%First_OpenTimecheck = 0 + + + data%State%RAM(2)%time=data%State%RAM(2)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + + +!=================================================== +! BOP +!=================================================== +if (data%State%PipeRam1%closed==0) then !bop closing + call bop_code(2,data%State%PipeRam1%H,2) !ramtype=2 2=RNUMBER +endif !bop is closing +!================================================================ +if (data%State%PipeRam1%closed==1) then + data%State%RAM(2)%Q=0 + !p_bop=pram_reg + data%State%RAM(2)%p_bop=data%State%ShearRAM%PA + data%State%RAMS%minloss(2,17)=0. !RNUMBER=2 +endif + +data%State%RAM(2)%timecounter_ram=data%State%RAM(2)%timecounter_ram+1 + + + + + +! MiddleRamsStatus = IDshearBop +! UpperRamsStatus = IDPipeRam1 +! LowerRamsStatus = IDPipeRam2 +! AnnularStatus = IDAnnular +! AccumulatorPressureGauge = p_acc +! ManifoldPressureGauge= pram_reg +! AnnularPressureGauge=Pannular_reg +! +! +! +! WRITE(60,60) data%State%RAM(2)%time,data%State%RAM(2)%Q,data%State%RAM(2)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(2)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + ! call sleepqq(100) + +if (data%State%PipeRam1%closed==1) then + ! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (LowerRamsValve==1. .and. LowerRamsFailureMalf==0) .or. (LowerRamsValve==-1.0 .and. LowerRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then + data%State%PipeRam1%finished=1 + ! endif +endif + + ! if (IsStopped == .true.) return + + ! end do loop3 !while finished_pipe1==0 + + + + + + + if ( data%State%PipeRam1%finished==1 .and. data%State%RAM(2)%Bottles_Charged_MalfActive==.true.) then + call bop_code(2,data%State%PipeRam1%H,2) !ramtype=2 2=RNUMBER + ! call sleepqq(100) + endif + + + + + + END SUBROUTINE PIPE_RAMS1_SUB \ No newline at end of file diff --git a/Equipments/BopStack/PIPE_RAM2.f90 b/Equipments/BopStack/PIPE_RAM2.f90 index ea9eff3..c9e8ae0 100644 --- a/Equipments/BopStack/PIPE_RAM2.f90 +++ b/Equipments/BopStack/PIPE_RAM2.f90 @@ -1,398 +1,398 @@ - - -SUBROUTINE PIPE_RAMS2 - use SimulationVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! ! use CSimulationVariables - implicit none - - - !write(*,*) 'checkpoint 1' - -!===================================================================== -! PIPE RAMS 2- BOP CAMERON Type U 5000 -! START CONDITIONS FOR PIPE RAMS 2 -!===================================================================== - data%State%RAM(3)%SuccessionCounter = data%State%RAM(3)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%LowerRamsValve == 1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - !write(*,*) 'close 1' - - - if (data%State%BopStackInput%LowerRamsCloseLEDMine == LedOn) then - RETURN - end if - - - if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then - data%State%RAM(3)%SuccessionCounter = 0 ! also in starup - data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter - endif - - - if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(3)%First_CloseTimecheck= 1 - - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff - data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn !LedBlinking - - data%State%RAM(3)%FourwayValve = 1 - - endif - - - endif - - - - if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close - !write(*,*) 'close 2' - - - - data%State%RAM(3)%FourwayValve = 0 - - data%State%PipeRam2%closed=0 - !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) - data%State%RAM(3)%vdis_tot=0 - data%State%RAM(3)%vdis_bottles=0. - data%State%RAM(3)%fvr_air=0. - data%State%RAM(3)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(3)%Qzero=70 - data%State%RAM(3)%Q=data%State%RAM(3)%Qzero - data%State%RAM(3)%flow=70 - data%State%RAM(3)%tol=0.0037 - if (data%State%PipeRam2%finished==1) then - data%State%PipeRam2%LeverOld=-1.0 - else - data%State%PipeRam2%LeverOld=data%EquipmentControl%BopControlPanel%LowerRamsValve - endif - data%State%PipeRam2%finished=0 - data%State%PipeRam2%IsClosing = .true. - data%State%PipeRam2%IsOpening = .false. - - - data%State%RAM(3)%bop_type = 3 - !AbopPipeRam=196.67 - data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !galon for each BOP - !write(*,*) 'close 1' - endif - - if (data%EquipmentControl%BopControlPanel%LowerRamsValve == -1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - !write(*,*) 'open 1' - - if (data%State%BopStackInput%LowerRamsOpenLEDMine == LedOn) then - RETURN - end if - - - if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then - data%State%RAM(3)%SuccessionCounter = 0 ! also in starup - data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter - endif - - - if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(3)%First_OpenTimecheck= 1 - - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff !new - data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff !new - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn !LedBlinking - - data%State%RAM(3)%FourwayValve = 1 - - endif - - - endif - - - if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close - !write(*,*) 'open 2' - - data%State%RAM(3)%FourwayValve = 0 - - data%State%PipeRam2%closed=0 - !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) - data%State%RAM(3)%vdis_tot=0 - data%State%RAM(3)%vdis_bottles=0. - data%State%RAM(3)%fvr_air=0. - data%State%RAM(3)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(3)%Qzero=70 - data%State%RAM(3)%Q=data%State%RAM(3)%Qzero - data%State%RAM(3)%flow=70 - data%State%RAM(3)%tol=0.0037 - - if (data%State%PipeRam2%finished==1) then - data%State%PipeRam2%LeverOld=1.0 - else - data%State%PipeRam2%LeverOld=data%EquipmentControl%BopControlPanel%LowerRamsValve - endif - data%State%PipeRam2%finished=0 - data%State%PipeRam2%IsOpening = .true. - data%State%PipeRam2%IsClosing = .false. - - - !if (LowerRamsOpenLED == LedOn) then - ! RETURN - !end if - - - data%State%RAM(3)%bop_type = 3 - !AbopPipeRam=186.5 - data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !galon for each BOP - !write(*,*) 'open 1' - - endif - - -!===================================================================== - - if (data%State%PipeRam2%IsOpening .or. data%State%PipeRam2%IsClosing .or. data%State%RAM(3)%Bottles_Charged_MalfActive) then - data%State%Annular%FirstSet= 0 - data%State%AnnularComputational%RamsFirstSet= 0 - CALL PIPE_RAMS2_SUB - end if - -END SUBROUTINE PIPE_RAMS2 - - - - - - - - - - - - -SUBROUTINE PIPE_RAMS2_SUB - - use SimulationVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - implicit none - - - ! FirstSet= 0 - ! RamsFirstSet= 0 - - ! loop4: do while (finished_pipe2==0) - - !write(*,*) 'checkpoint 2' - - - data%State%RAM(3)%SuccessionCounter = data%State%RAM(3)%SuccessionCounter + 1 - - - if (data%EquipmentControl%BopControlPanel%LowerRamsValve == 1.0 .and. data%State%PipeRam2%LeverOld == -1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - !write(*,*) 'close 3' - - if ( data%State%RAM(3)%First_CloseTimecheck == 0 ) then - - - if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then - data%State%RAM(3)%SuccessionCounter = 0 ! also in starup - data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter - endif - - - - if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff - data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn !LedBlinking - - data%State%RAM(3)%FourwayValve = 1 - - endif - - endif - - - - - endif - - if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - !write(*,*) 'close 4' - - data%State%RAM(3)%FourwayValve = 0 - - - data%State%PipeRam2%closed=0 - !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) - data%State%RAM(3)%p_bop=data%State%ShearRAM%PA - data%State%PipeRam2%LeverOld = data%EquipmentControl%BopControlPanel%LowerRamsValve - - CALL OpenLowerRams - data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code - data%State%RAM(3)%bop_type = 3 - !AbopPipeRam=196.67 - data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam2%ID-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) - - data%State%RAM(3)%vdis_bottles=0. - data%State%RAM(3)%fvr_air=0. - data%State%RAM(3)%vdis_elecp=0. - data%State%PipeRam2%IsClosing = .true. - data%State%PipeRam2%IsOpening = .false. - !write(*,*) 'close 2' - - endif - - if (data%EquipmentControl%BopControlPanel%LowerRamsValve == -1.0 .and. data%State%PipeRam2%LeverOld == 1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - !write(*,*) 'open 3' - - - if ( data%State%RAM(3)%First_OpenTimecheck == 0 ) then - - if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then - data%State%RAM(3)%SuccessionCounter = 0 ! also in starup - data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter - endif - - if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff - data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff - data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn !LedBlinking - - data%State%RAM(3)%FourwayValve = 1 - - endif - - endif - - - endif - - - if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - !write(*,*) 'open 4' - - data%State%RAM(3)%FourwayValve = 0 - - data%State%PipeRam2%closed=0 - !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) - data%State%RAM(3)%p_bop=data%State%ShearRAM%PA - data%State%PipeRam2%LeverOld = data%EquipmentControl%BopControlPanel%LowerRamsValve - - CALL OpenLowerRams - data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code - data%State%RAM(3)%bop_type = 3 - !AbopPipeRam=186.5 - data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) - data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-data%State%PipeRam2%ID)/(2.*231) - data%State%RAM(3)%vdis_bottles=0. - data%State%RAM(3)%fvr_air=0. - data%State%RAM(3)%vdis_elecp=0. - - data%State%PipeRam2%IsOpening = .true. - data%State%PipeRam2%IsClosing = .false. - !write(*,*) 'open 2' - - endif - - - data%State%RAM(3)%First_CloseTimecheck = 0 - data%State%RAM(3)%First_OpenTimecheck = 0 - - - data%State%RAM(3)%time=data%State%RAM(3)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - - -!=================================================== -! BOP -!=================================================== -if (data%State%PipeRam2%closed==0) then !bop closing -!write(*,*) 'BOP code is called' - call bop_code(3,data%State%PipeRam2%H_Bop,3) !ramtype=3 3=RNUMBER -endif !bop is closing -!================================================================ -if (data%State%PipeRam2%closed==1) then - data%State%RAM(3)%Q=0 - !p_bop=pram_reg - data%State%RAM(3)%p_bop=data%State%ShearRAM%PA - data%State%RAMS%minloss(3,17)=0. !RNUMBER=3 -endif - -data%State%RAM(3)%timecounter_ram=data%State%RAM(3)%timecounter_ram+1 - - - - - -! MiddleRamsStatus = IDshearBop -! UpperRamsStatus = IDPipeRam1 -! LowerRamsStatus = IDPipeRam2 -! AnnularStatus = IDAnnular -! AccumulatorPressureGauge = p_acc -! ManifoldPressureGauge= pram_reg -! AnnularPressureGauge=Pannular_reg -! -! -! -! WRITE(60,60) data%State%RAM(3)%time,data%State%RAM(3)%Q,data%State%RAM(3)%vdis_tot,p_acc, & -! pram_reg,Pannular_reg,data%State%RAM(3)%p_bop,IDshearBop, & -! IDPipeRam1,IDPipeRam2,IDAnnular -!60 FORMAT(11(f18.5)) - - - ! call sleepqq(100) - -if (data%State%PipeRam2%closed==1) then - -! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then - data%State%PipeRam2%finished=1 -! endif -endif - - ! if (IsStopped == .true.) return - - - ! end do loop4 !while finished_pipe2==0 - - if ( data%State%PipeRam2%finished==1 .and. data%State%RAM(3)%Bottles_Charged_MalfActive==.true.) then - call bop_code(3,data%State%PipeRam2%H_Bop,3) !ramtype=3 3=RNUMBER - ! call sleepqq(100) - endif - - - - + + +SUBROUTINE PIPE_RAMS2 + use SimulationVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! ! use CSimulationVariables + implicit none + + + !write(*,*) 'checkpoint 1' + +!===================================================================== +! PIPE RAMS 2- BOP CAMERON Type U 5000 +! START CONDITIONS FOR PIPE RAMS 2 +!===================================================================== + data%State%RAM(3)%SuccessionCounter = data%State%RAM(3)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%LowerRamsValve == 1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + !write(*,*) 'close 1' + + + if (data%State%BopStackInput%LowerRamsCloseLEDMine == LedOn) then + RETURN + end if + + + if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then + data%State%RAM(3)%SuccessionCounter = 0 ! also in starup + data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter + endif + + + if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(3)%First_CloseTimecheck= 1 + + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff + data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn !LedBlinking + + data%State%RAM(3)%FourwayValve = 1 + + endif + + + endif + + + + if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'close 2' + + + + data%State%RAM(3)%FourwayValve = 0 + + data%State%PipeRam2%closed=0 + !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) + data%State%RAM(3)%vdis_tot=0 + data%State%RAM(3)%vdis_bottles=0. + data%State%RAM(3)%fvr_air=0. + data%State%RAM(3)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(3)%Qzero=70 + data%State%RAM(3)%Q=data%State%RAM(3)%Qzero + data%State%RAM(3)%flow=70 + data%State%RAM(3)%tol=0.0037 + if (data%State%PipeRam2%finished==1) then + data%State%PipeRam2%LeverOld=-1.0 + else + data%State%PipeRam2%LeverOld=data%EquipmentControl%BopControlPanel%LowerRamsValve + endif + data%State%PipeRam2%finished=0 + data%State%PipeRam2%IsClosing = .true. + data%State%PipeRam2%IsOpening = .false. + + + data%State%RAM(3)%bop_type = 3 + !AbopPipeRam=196.67 + data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !galon for each BOP + !write(*,*) 'close 1' + endif + + if (data%EquipmentControl%BopControlPanel%LowerRamsValve == -1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + !write(*,*) 'open 1' + + if (data%State%BopStackInput%LowerRamsOpenLEDMine == LedOn) then + RETURN + end if + + + if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then + data%State%RAM(3)%SuccessionCounter = 0 ! also in starup + data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter + endif + + + if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(3)%First_OpenTimecheck= 1 + + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff !new + data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff !new + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn !LedBlinking + + data%State%RAM(3)%FourwayValve = 1 + + endif + + + endif + + + if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'open 2' + + data%State%RAM(3)%FourwayValve = 0 + + data%State%PipeRam2%closed=0 + !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) + data%State%RAM(3)%vdis_tot=0 + data%State%RAM(3)%vdis_bottles=0. + data%State%RAM(3)%fvr_air=0. + data%State%RAM(3)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(3)%Qzero=70 + data%State%RAM(3)%Q=data%State%RAM(3)%Qzero + data%State%RAM(3)%flow=70 + data%State%RAM(3)%tol=0.0037 + + if (data%State%PipeRam2%finished==1) then + data%State%PipeRam2%LeverOld=1.0 + else + data%State%PipeRam2%LeverOld=data%EquipmentControl%BopControlPanel%LowerRamsValve + endif + data%State%PipeRam2%finished=0 + data%State%PipeRam2%IsOpening = .true. + data%State%PipeRam2%IsClosing = .false. + + + !if (LowerRamsOpenLED == LedOn) then + ! RETURN + !end if + + + data%State%RAM(3)%bop_type = 3 + !AbopPipeRam=186.5 + data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) !galon for each BOP + !write(*,*) 'open 1' + + endif + + +!===================================================================== + + if (data%State%PipeRam2%IsOpening .or. data%State%PipeRam2%IsClosing .or. data%State%RAM(3)%Bottles_Charged_MalfActive) then + data%State%Annular%FirstSet= 0 + data%State%AnnularComputational%RamsFirstSet= 0 + CALL PIPE_RAMS2_SUB + end if + +END SUBROUTINE PIPE_RAMS2 + + + + + + + + + + + + +SUBROUTINE PIPE_RAMS2_SUB + + use SimulationVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + implicit none + + + ! FirstSet= 0 + ! RamsFirstSet= 0 + + ! loop4: do while (finished_pipe2==0) + + !write(*,*) 'checkpoint 2' + + + data%State%RAM(3)%SuccessionCounter = data%State%RAM(3)%SuccessionCounter + 1 + + + if (data%EquipmentControl%BopControlPanel%LowerRamsValve == 1.0 .and. data%State%PipeRam2%LeverOld == -1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + !write(*,*) 'close 3' + + if ( data%State%RAM(3)%First_CloseTimecheck == 0 ) then + + + if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then + data%State%RAM(3)%SuccessionCounter = 0 ! also in starup + data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter + endif + + + + if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOff + data%State%BopStackInput%LowerRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOn !LedBlinking + + data%State%RAM(3)%FourwayValve = 1 + + endif + + endif + + + + + endif + + if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + !write(*,*) 'close 4' + + data%State%RAM(3)%FourwayValve = 0 + + + data%State%PipeRam2%closed=0 + !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) + data%State%RAM(3)%p_bop=data%State%ShearRAM%PA + data%State%PipeRam2%LeverOld = data%EquipmentControl%BopControlPanel%LowerRamsValve + + CALL OpenLowerRams + data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code + data%State%RAM(3)%bop_type = 3 + !AbopPipeRam=196.67 + data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamClose*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam2%ID-max(data%State%PipeRam2%ODDrillpipe_in,data%State%PipeRam1%ODDrillpipe_inBase))/(2.*231) + + data%State%RAM(3)%vdis_bottles=0. + data%State%RAM(3)%fvr_air=0. + data%State%RAM(3)%vdis_elecp=0. + data%State%PipeRam2%IsClosing = .true. + data%State%PipeRam2%IsOpening = .false. + !write(*,*) 'close 2' + + endif + + if (data%EquipmentControl%BopControlPanel%LowerRamsValve == -1.0 .and. data%State%PipeRam2%LeverOld == 1.0 .and. data%State%PipeRam2%LowerRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + !write(*,*) 'open 3' + + + if ( data%State%RAM(3)%First_OpenTimecheck == 0 ) then + + if ( data%State%RAM(3)%SuccessionCounter /= data%State%RAM(3)%SuccessionCounterOld+1 ) then + data%State%RAM(3)%SuccessionCounter = 0 ! also in starup + data%State%RAM(3)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(3)%SuccessionCounterOld= data%State%RAM(3)%SuccessionCounter + endif + + if ( data%State%RAM(3)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%EquipmentControl%BopControlPanel%LowerRamsCloseLED = LedOff + data%State%BopStackInput%LowerRamsCloseLEDMine = LedOff + data%EquipmentControl%BopControlPanel%LowerRamsOpenLED = LedOn !LedBlinking + + data%State%RAM(3)%FourwayValve = 1 + + endif + + endif + + + endif + + + if (data%State%RAM(3)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + !write(*,*) 'open 4' + + data%State%RAM(3)%FourwayValve = 0 + + data%State%PipeRam2%closed=0 + !PipeRam2_closed_withPossibility= PipeRam2_closed * TD_BOPConnectionPossibility(4) + data%State%RAM(3)%p_bop=data%State%ShearRAM%PA + data%State%PipeRam2%LeverOld = data%EquipmentControl%BopControlPanel%LowerRamsValve + + CALL OpenLowerRams + data%State%PipeRam2%Situation_forTD= 0 ! open - for TD code + data%State%RAM(3)%bop_type = 3 + !AbopPipeRam=186.5 + data%State%PipeRam1%A=(data%Configuration%BopStack%LowerRamOpen*231)/((data%State%PipeRam1%IDBase-data%State%PipeRam1%ODDrillpipe_inBase)/2.) + data%State%PipeRam2%NeededVolume=data%State%PipeRam1%A*(data%State%PipeRam1%IDBase-data%State%PipeRam2%ID)/(2.*231) + data%State%RAM(3)%vdis_bottles=0. + data%State%RAM(3)%fvr_air=0. + data%State%RAM(3)%vdis_elecp=0. + + data%State%PipeRam2%IsOpening = .true. + data%State%PipeRam2%IsClosing = .false. + !write(*,*) 'open 2' + + endif + + + data%State%RAM(3)%First_CloseTimecheck = 0 + data%State%RAM(3)%First_OpenTimecheck = 0 + + + data%State%RAM(3)%time=data%State%RAM(3)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + + +!=================================================== +! BOP +!=================================================== +if (data%State%PipeRam2%closed==0) then !bop closing +!write(*,*) 'BOP code is called' + call bop_code(3,data%State%PipeRam2%H_Bop,3) !ramtype=3 3=RNUMBER +endif !bop is closing +!================================================================ +if (data%State%PipeRam2%closed==1) then + data%State%RAM(3)%Q=0 + !p_bop=pram_reg + data%State%RAM(3)%p_bop=data%State%ShearRAM%PA + data%State%RAMS%minloss(3,17)=0. !RNUMBER=3 +endif + +data%State%RAM(3)%timecounter_ram=data%State%RAM(3)%timecounter_ram+1 + + + + + +! MiddleRamsStatus = IDshearBop +! UpperRamsStatus = IDPipeRam1 +! LowerRamsStatus = IDPipeRam2 +! AnnularStatus = IDAnnular +! AccumulatorPressureGauge = p_acc +! ManifoldPressureGauge= pram_reg +! AnnularPressureGauge=Pannular_reg +! +! +! +! WRITE(60,60) data%State%RAM(3)%time,data%State%RAM(3)%Q,data%State%RAM(3)%vdis_tot,p_acc, & +! pram_reg,Pannular_reg,data%State%RAM(3)%p_bop,IDshearBop, & +! IDPipeRam1,IDPipeRam2,IDAnnular +!60 FORMAT(11(f18.5)) + + + ! call sleepqq(100) + +if (data%State%PipeRam2%closed==1) then + +! if ((MiddleRamsValve==1. .and. MiddleRamsFailureMalf==0) .or. (MiddleRamsValve==-1.0 .and. MiddleRamsFailureMalf==0) .or. (UpperRamsValve==1. .and. UpperRamsFailureMalf==0) .or. (UpperRamsValve==-1.0 .and. UpperRamsFailureMalf==0) .or. (AnnularValve==1. .and. AnnularFailureMalf==0) .or. (AnnularValve==-1.0 .and. AnnularFailureMalf==0) .or. ChokeLineValve==1. .or. ChokeLineValve==-1.0 .or. KillLineValve==1. .or. KillLineValve==-1.0) then + data%State%PipeRam2%finished=1 +! endif +endif + + ! if (IsStopped == .true.) return + + + ! end do loop4 !while finished_pipe2==0 + + if ( data%State%PipeRam2%finished==1 .and. data%State%RAM(3)%Bottles_Charged_MalfActive==.true.) then + call bop_code(3,data%State%PipeRam2%H_Bop,3) !ramtype=3 3=RNUMBER + ! call sleepqq(100) + endif + + + + END SUBROUTINE PIPE_RAMS2_SUB \ No newline at end of file diff --git a/Equipments/BopStack/PipeRams1Main.f90 b/Equipments/BopStack/PipeRams1Main.f90 index baa426f..8d03aae 100644 --- a/Equipments/BopStack/PipeRams1Main.f90 +++ b/Equipments/BopStack/PipeRams1Main.f90 @@ -1,79 +1,79 @@ -module PipeRams1Main - implicit none - public - contains - - ! subroutine PipeRams1_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(PipeRams1_Init) - ! call OnSimulationStop%Add(PipeRams1_Init) - ! call OnPipeRams1Step%Add(PipeRams1_Step) - ! call OnPipeRams1Output%Add(PipeRams1_Output) - ! call OnPipeRams1Main%Add(PipeRams1MainBody) - ! end subroutine - - subroutine PipeRams1_Init - call BOP_StartUp() - end subroutine PipeRams1_Init - - subroutine PipeRams1_Step - use SimulationVariables - implicit none - if (data%State%PipeRam1%finished/=0) then - call PIPE_RAMS1 - if (data%State%PipeRam1%IsOpening .or. data%State%PipeRam1%IsClosing .or. data%State%RAM(2)%Bottles_Charged_MalfActive) then - if(data%State%PipeRam1%finished==0) then - call PIPE_RAMS1_SUB !only body of loop2 - endif - endif - else - call PIPE_RAMS1_SUB - endif - end subroutine PipeRams1_Step - - ! subroutine PipeRams1_Output - - ! end subroutine PipeRams1_Output - - ! subroutine PipeRams1MainBody - - ! USE ifport - ! USE ifmt - ! ! use CSimulationVariables - ! ! USE BOP - - ! implicit none - - ! INTEGER :: PipeRam1Duration - ! integer,dimension(8) :: PipeRam1StartTime , PipeRam1EndTime - - ! ! CALL BOP_StartUp() - ! loop1: DO - - ! CALL DATE_AND_TIME(values=PipeRam1StartTime) - ! CALL PIPE_RAMS1 - ! CALL DATE_AND_TIME(values=PipeRam1EndTime) - - ! PipeRam1Duration = 3600000 * (PipeRam1EndTime(5) - PipeRam1StartTime(5)) + 60000 * (PipeRam1EndTime(6) - PipeRam1StartTime(6)) + 1000 * (PipeRam1EndTime(7) - PipeRam1StartTime(7)) + (PipeRam1EndTime(8) - PipeRam1StartTime(8)) - - ! if (PipeRam1Duration < 100) then - ! call sleepqq(100 - PipeRam1Duration) - ! ELSE - ! WRITE (*,*) 'PipeRam1 BOP run duration exceeded 100 ms and =', PipeRam1Duration - ! end if - - - ! IF (IsStopped==.true.) THEN - ! EXIT loop1 - ! ENDIF - - - ! ENDDO loop1 - - - ! ! CALL DEALLOCATE_ARRAYS() - - ! end subroutine PipeRams1MainBody - +module PipeRams1Main + implicit none + public + contains + + ! subroutine PipeRams1_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(PipeRams1_Init) + ! call OnSimulationStop%Add(PipeRams1_Init) + ! call OnPipeRams1Step%Add(PipeRams1_Step) + ! call OnPipeRams1Output%Add(PipeRams1_Output) + ! call OnPipeRams1Main%Add(PipeRams1MainBody) + ! end subroutine + + subroutine PipeRams1_Init + call BOP_StartUp() + end subroutine PipeRams1_Init + + subroutine PipeRams1_Step + use SimulationVariables + implicit none + if (data%State%PipeRam1%finished/=0) then + call PIPE_RAMS1 + if (data%State%PipeRam1%IsOpening .or. data%State%PipeRam1%IsClosing .or. data%State%RAM(2)%Bottles_Charged_MalfActive) then + if(data%State%PipeRam1%finished==0) then + call PIPE_RAMS1_SUB !only body of loop2 + endif + endif + else + call PIPE_RAMS1_SUB + endif + end subroutine PipeRams1_Step + + ! subroutine PipeRams1_Output + + ! end subroutine PipeRams1_Output + + ! subroutine PipeRams1MainBody + + ! USE ifport + ! USE ifmt + ! ! use CSimulationVariables + ! ! USE BOP + + ! implicit none + + ! INTEGER :: PipeRam1Duration + ! integer,dimension(8) :: PipeRam1StartTime , PipeRam1EndTime + + ! ! CALL BOP_StartUp() + ! loop1: DO + + ! CALL DATE_AND_TIME(values=PipeRam1StartTime) + ! CALL PIPE_RAMS1 + ! CALL DATE_AND_TIME(values=PipeRam1EndTime) + + ! PipeRam1Duration = 3600000 * (PipeRam1EndTime(5) - PipeRam1StartTime(5)) + 60000 * (PipeRam1EndTime(6) - PipeRam1StartTime(6)) + 1000 * (PipeRam1EndTime(7) - PipeRam1StartTime(7)) + (PipeRam1EndTime(8) - PipeRam1StartTime(8)) + + ! if (PipeRam1Duration < 100) then + ! call sleepqq(100 - PipeRam1Duration) + ! ELSE + ! WRITE (*,*) 'PipeRam1 BOP run duration exceeded 100 ms and =', PipeRam1Duration + ! end if + + + ! IF (IsStopped==.true.) THEN + ! EXIT loop1 + ! ENDIF + + + ! ENDDO loop1 + + + ! ! CALL DEALLOCATE_ARRAYS() + + ! end subroutine PipeRams1MainBody + end module PipeRams1Main \ No newline at end of file diff --git a/Equipments/BopStack/PipeRams2Main.f90 b/Equipments/BopStack/PipeRams2Main.f90 index c04b088..5e14ea6 100644 --- a/Equipments/BopStack/PipeRams2Main.f90 +++ b/Equipments/BopStack/PipeRams2Main.f90 @@ -1,79 +1,79 @@ - - module PipeRams2Main - implicit none - public - contains - - ! subroutine PipeRams2_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(PipeRams2_Init) - ! call OnSimulationStop%Add(PipeRams2_Init) - ! call OnPipeRams2Step%Add(PipeRams2_Step) - ! call OnPipeRams2Output%Add(PipeRams2_Output) - ! call OnPipeRams2Main%Add(PipeRams2MainBody) - ! end subroutine - - ! subroutine PipeRams2_Init - ! implicit none - ! end subroutine PipeRams2_Init - - subroutine PipeRams2_Step - use SimulationVariables - implicit none - if (data%State%PipeRam2%finished/=0) then - call PIPE_RAMS2 - if (data%State%PipeRam2%IsOpening .or. data%State%PipeRam2%IsClosing .or. data%State%RAM(3)%Bottles_Charged_MalfActive) then - if(data%State%PipeRam2%finished==0) then - call PIPE_RAMS2_SUB !only body of loop2 - endif - endif - else - call PIPE_RAMS2_SUB - endif - end subroutine PipeRams2_Step - - ! subroutine PipeRams2_Output - ! implicit none - ! end subroutine PipeRams2_Output - - ! subroutine PipeRams2MainBody - ! USE ifport - ! USE ifmt - ! ! use CSimulationVariables - ! ! USE BOP - ! implicit none - - ! INTEGER :: PipeRam2Duration - ! integer,dimension(8) :: PipeRam2StartTime , PipeRam2EndTime - - ! ! CALL BOP_StartUp() - ! loop1: DO - - ! CALL DATE_AND_TIME(values=PipeRam2StartTime) - - - ! CALL PIPE_RAMS2 - - ! CALL DATE_AND_TIME(values=PipeRam2EndTime) - - ! PipeRam2Duration = 3600000 * (PipeRam2EndTime(5) - PipeRam2StartTime(5)) + 60000 * (PipeRam2EndTime(6) - PipeRam2StartTime(6)) + 1000 * (PipeRam2EndTime(7) - PipeRam2StartTime(7)) + (PipeRam2EndTime(8) - PipeRam2StartTime(8)) - - ! if (PipeRam2Duration < 100) then - ! call sleepqq(100 - PipeRam2Duration) - ! ELSE - ! WRITE (*,*) 'PipeRam2 BOP run duration exceeded 100 ms and =', PipeRam2Duration - ! end if - - ! IF (IsStopped==.true.) THEN - ! EXIT loop1 - ! ENDIF - - - ! ENDDO loop1 - - - ! ! CALL DEALLOCATE_ARRAYS() - ! end subroutine PipeRams2MainBody - + + module PipeRams2Main + implicit none + public + contains + + ! subroutine PipeRams2_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(PipeRams2_Init) + ! call OnSimulationStop%Add(PipeRams2_Init) + ! call OnPipeRams2Step%Add(PipeRams2_Step) + ! call OnPipeRams2Output%Add(PipeRams2_Output) + ! call OnPipeRams2Main%Add(PipeRams2MainBody) + ! end subroutine + + ! subroutine PipeRams2_Init + ! implicit none + ! end subroutine PipeRams2_Init + + subroutine PipeRams2_Step + use SimulationVariables + implicit none + if (data%State%PipeRam2%finished/=0) then + call PIPE_RAMS2 + if (data%State%PipeRam2%IsOpening .or. data%State%PipeRam2%IsClosing .or. data%State%RAM(3)%Bottles_Charged_MalfActive) then + if(data%State%PipeRam2%finished==0) then + call PIPE_RAMS2_SUB !only body of loop2 + endif + endif + else + call PIPE_RAMS2_SUB + endif + end subroutine PipeRams2_Step + + ! subroutine PipeRams2_Output + ! implicit none + ! end subroutine PipeRams2_Output + + ! subroutine PipeRams2MainBody + ! USE ifport + ! USE ifmt + ! ! use CSimulationVariables + ! ! USE BOP + ! implicit none + + ! INTEGER :: PipeRam2Duration + ! integer,dimension(8) :: PipeRam2StartTime , PipeRam2EndTime + + ! ! CALL BOP_StartUp() + ! loop1: DO + + ! CALL DATE_AND_TIME(values=PipeRam2StartTime) + + + ! CALL PIPE_RAMS2 + + ! CALL DATE_AND_TIME(values=PipeRam2EndTime) + + ! PipeRam2Duration = 3600000 * (PipeRam2EndTime(5) - PipeRam2StartTime(5)) + 60000 * (PipeRam2EndTime(6) - PipeRam2StartTime(6)) + 1000 * (PipeRam2EndTime(7) - PipeRam2StartTime(7)) + (PipeRam2EndTime(8) - PipeRam2StartTime(8)) + + ! if (PipeRam2Duration < 100) then + ! call sleepqq(100 - PipeRam2Duration) + ! ELSE + ! WRITE (*,*) 'PipeRam2 BOP run duration exceeded 100 ms and =', PipeRam2Duration + ! end if + + ! IF (IsStopped==.true.) THEN + ! EXIT loop1 + ! ENDIF + + + ! ENDDO loop1 + + + ! ! CALL DEALLOCATE_ARRAYS() + ! end subroutine PipeRams2MainBody + end module PipeRams2Main \ No newline at end of file diff --git a/Equipments/BopStack/SHEAR_RAM.f90 b/Equipments/BopStack/SHEAR_RAM.f90 index 49482c3..de298f9 100644 --- a/Equipments/BopStack/SHEAR_RAM.f90 +++ b/Equipments/BopStack/SHEAR_RAM.f90 @@ -1,276 +1,276 @@ - -SUBROUTINE SHEAR_RAMS - use SimulationVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - implicit none - - - -!===================================================================== -! SHEAR RAMS- BOP CAMERON Type U 5000 -! START CONDITIONS FOR SHEAR RAMS -!===================================================================== - - data%State%RAM(4)%SuccessionCounter = data%State%RAM(4)%SuccessionCounter + 1 - - if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == 1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - if (data%State%BopStackInput%MiddleRamsCloseLEDMine == LedOn) then - RETURN - end if - - - if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then - data%State%RAM(4)%SuccessionCounter = 0 ! also in starup - data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter - endif - - - if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(4)%First_CloseTimecheck= 1 - - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff - data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn !LedBlinking - - data%State%RAM(4)%FourwayValve = 1 - - endif - - endif - - - if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close - !write(*,*) 'close 2' - data%State%RAM(4)%FourwayValve = 0 - - - data%State%RamLine%ShearBop_closed=0 - !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) - data%State%RAM(4)%vdis_tot=0 - data%State%RAM(4)%vdis_bottles=0. - data%State%RAM(4)%fvr_air=0. - data%State%RAM(4)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(4)%Qzero=70 - data%State%RAM(4)%Q=data%State%RAM(4)%Qzero - data%State%RAM(4)%flow=70 - data%State%RAM(4)%tol=0.0037 - - - if (data%State%RamLine%FINISHED_shear==1) then - data%State%RamLine%ShearRamsLeverOld=-1.0 - else - data%State%RamLine%ShearRamsLeverOld=data%EquipmentControl%BopControlPanel%MiddleRamsValve - endif - data%State%RamLine%FINISHED_shear=0 - data%State%RamLine%ShearRamIsClosing = .true. - data%State%RamLine%ShearRamIsOpening = .false. - - data%State%RAM(4)%bop_type = 2 - !NeededVolumeShearRams=5.8 !galon for each BOP - !AbopShearRam=196.67 !(in^2) - data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamClose*231)/(data%State%ShearRAM%IDshearBopBase/2.) - !NeededVolumeShearRams=BlindRamClose !galon for each BOP **changed - data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) !3.67 galon for each BOP ! **changed - data%State%ShearRAM%VA=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) - data%State%ShearRAM%VB=data%State%ShearRAM%NeededVolumeShearRams - endif - - if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == -1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then - - if (data%State%BopStackInput%MiddleRamsOpenLEDMine == LedOn) then - RETURN - end if - - if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then - data%State%RAM(4)%SuccessionCounter = 0 ! also in starup - data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter - endif - - - if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - !return - - data%State%RAM(4)%First_OpenTimecheck= 1 - - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff !new - data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff !new - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn !LedBlinking - - endif - - endif - - - if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close - !write(*,*) 'open 2' - - data%State%RAM(4)%FourwayValve = 0 - - - - data%State%RamLine%ShearBop_closed=0 - !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) - data%State%RAM(4)%vdis_tot=0 - data%State%RAM(4)%vdis_bottles=0. - data%State%RAM(4)%fvr_air=0. - data%State%RAM(4)%vdis_elecp=0. - data%State%Pumps%Qiter=7 - data%State%RAM(4)%Qzero=70 - data%State%RAM(4)%Q=data%State%RAM(4)%Qzero - data%State%RAM(4)%flow=70 - data%State%RAM(4)%tol=0.0037 - - if (data%State%RamLine%FINISHED_shear==1) then - data%State%RamLine%ShearRamsLeverOld=1.0 - else - data%State%RamLine%ShearRamsLeverOld=data%EquipmentControl%BopControlPanel%MiddleRamsValve - endif - data%State%RamLine%FINISHED_shear=0 - data%State%RamLine%ShearRamIsOpening = .true. - data%State%RamLine%ShearRamIsClosing = .false. - - data%State%RAM(4)%bop_type = 3 - !AbopShearRam=186.5 !(in^2) - data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamOpen*231)/(data%State%ShearRAM%IDshearBopBase/2.) - !NeededVolumeShearRams=5.5 !galon for each BOP - !NeededVolumeShearRams=BlindRamOpen ! **changed - data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) !3.67 galon for each BOP ! **changed - !va=AbopShearRam*(IDshearBopBase-ODDrillpipe_inShearRam)/(2.*231) - !vb=NeededVolumeShearRams - endif -!===================================================================== - ! if (ShearRamIsOpening .or. ShearRamIsClosing .or. data%State%RAM(4)%Bottles_Charged_MalfActive) then - ! CALL SHEAR_RAMS_SUB - ! end if - -END SUBROUTINE SHEAR_RAMS - - - - - -SUBROUTINE SHEAR_RAMS_SUB - use SimulationVariables - USE CBopStackVariables - use CBopControlPanel - use SimulationVariables - USE CEquipmentsConstants - ! use CSimulationVariables - implicit none - - ! FirstSet= 0 - ! RamsFirstSet= 0 - - ! loop2: do while (finished_shear==0) - data%State%RAM(4)%SuccessionCounter = data%State%RAM(4)%SuccessionCounter + 1 - if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == 1.0 .and. data%State%RamLine%ShearRamsLeverOld == -1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RAM(4)%First_CloseTimecheck == 0) then - if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then - data%State%RAM(4)%SuccessionCounter = 0 ! also in starup - data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup - else - data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter - endif - if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff - data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn !LedBlinking - data%State%RAM(4)%FourwayValve = 1 - endif - endif - - if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - data%State%RAM(4)%FourwayValve = 0 - data%State%RamLine%ShearBop_closed=0 - data%State%RAM(4)%p_bop=data%State%ShearRAM%PA - data%State%RamLine%ShearRamsLeverOld = data%EquipmentControl%BopControlPanel%MiddleRamsValve - CALL OpenMiddleRams ! for C code - data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code - data%State%RAM(4)%bop_type = 2 - data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamClose*231)/(data%State%ShearRAM%IDshearBopBase/2.) - data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBop-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) ! **changed - data%State%RAM(4)%vdis_bottles=0. - data%State%RAM(4)%fvr_air=0. - data%State%RAM(4)%vdis_elecp=0. - data%State%RamLine%ShearRamIsClosing = .true. - data%State%RamLine%ShearRamIsOpening = .false. - endif - - if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == -1.0 .and. data%State%RamLine%ShearRamsLeverOld == 1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RAM(4)%First_OpenTimecheck == 0) then - if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then - data%State%RAM(4)%SuccessionCounter = 0 ! also in starup - data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup - !return - else - data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter - endif - - if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then - data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff - data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff - data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn !LedBlinking - data%State%RAM(4)%FourwayValve = 1 - endif - endif - - if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then - data%State%RAM(4)%FourwayValve = 0 - data%State%RamLine%ShearBop_closed=0 - data%State%RAM(4)%p_bop=data%State%ShearRAM%PA - data%State%RamLine%ShearRamsLeverOld = data%EquipmentControl%BopControlPanel%MiddleRamsValve - CALL OpenMiddleRams - data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code - data%State%RAM(4)%bop_type = 3 - data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%IDshearBop)/(2.*231) - data%State%RAM(4)%vdis_bottles=0. - data%State%RAM(4)%fvr_air=0. - data%State%RAM(4)%vdis_elecp=0. - data%State%RamLine%ShearRamIsOpening = .true. - data%State%RamLine%ShearRamIsClosing = .false. - endif - - data%State%RAM(4)%First_CloseTimecheck = 0 - data%State%RAM(4)%First_OpenTimecheck = 0 - data%State%RAM(4)%time=data%State%RAM(4)%time+data%State%RamLine%DeltaT_BOP !overal time (s) - - !=================================================== - ! BOP - !=================================================== - if (data%State%RamLine%ShearBop_closed==0) then !bop closing - call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) !ramtype=1 4=RNUMBER - endif !bop is closing - !================================================================ - if (data%State%RamLine%ShearBop_closed==1) then - data%State%RAM(4)%Q=0 - data%State%RAM(4)%p_bop=data%State%ShearRAM%PA - data%State%RAMS%minloss(4,17)=0. !RNUMBER=4 - endif - - data%State%RAM(4)%timecounter_ram=data%State%RAM(4)%timecounter_ram+1 - call sleepqq(100) - - if (data%State%RamLine%ShearBop_closed==1) then - data%State%RamLine%FINISHED_shear=1 - endif - ! if (IsStopped == .true.) return - ! end do loop2 !while finished_shear==0 - - ! if ( finished_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then - ! call bop_code(1,H_ShearRamBop,4) !ramtype=1 4=RNUMBER - ! call sleepqq(100) - ! endif - + +SUBROUTINE SHEAR_RAMS + use SimulationVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + implicit none + + + +!===================================================================== +! SHEAR RAMS- BOP CAMERON Type U 5000 +! START CONDITIONS FOR SHEAR RAMS +!===================================================================== + + data%State%RAM(4)%SuccessionCounter = data%State%RAM(4)%SuccessionCounter + 1 + + if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == 1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + if (data%State%BopStackInput%MiddleRamsCloseLEDMine == LedOn) then + RETURN + end if + + + if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then + data%State%RAM(4)%SuccessionCounter = 0 ! also in starup + data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter + endif + + + if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(4)%First_CloseTimecheck= 1 + + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff + data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn !LedBlinking + + data%State%RAM(4)%FourwayValve = 1 + + endif + + endif + + + if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'close 2' + data%State%RAM(4)%FourwayValve = 0 + + + data%State%RamLine%ShearBop_closed=0 + !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) + data%State%RAM(4)%vdis_tot=0 + data%State%RAM(4)%vdis_bottles=0. + data%State%RAM(4)%fvr_air=0. + data%State%RAM(4)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(4)%Qzero=70 + data%State%RAM(4)%Q=data%State%RAM(4)%Qzero + data%State%RAM(4)%flow=70 + data%State%RAM(4)%tol=0.0037 + + + if (data%State%RamLine%FINISHED_shear==1) then + data%State%RamLine%ShearRamsLeverOld=-1.0 + else + data%State%RamLine%ShearRamsLeverOld=data%EquipmentControl%BopControlPanel%MiddleRamsValve + endif + data%State%RamLine%FINISHED_shear=0 + data%State%RamLine%ShearRamIsClosing = .true. + data%State%RamLine%ShearRamIsOpening = .false. + + data%State%RAM(4)%bop_type = 2 + !NeededVolumeShearRams=5.8 !galon for each BOP + !AbopShearRam=196.67 !(in^2) + data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamClose*231)/(data%State%ShearRAM%IDshearBopBase/2.) + !NeededVolumeShearRams=BlindRamClose !galon for each BOP **changed + data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) !3.67 galon for each BOP ! **changed + data%State%ShearRAM%VA=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) + data%State%ShearRAM%VB=data%State%ShearRAM%NeededVolumeShearRams + endif + + if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == -1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1) then + + if (data%State%BopStackInput%MiddleRamsOpenLEDMine == LedOn) then + RETURN + end if + + if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then + data%State%RAM(4)%SuccessionCounter = 0 ! also in starup + data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter + endif + + + if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + !return + + data%State%RAM(4)%First_OpenTimecheck= 1 + + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff !new + data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff !new + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn !LedBlinking + + endif + + endif + + + if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then ! 1: Open , 0: Close + !write(*,*) 'open 2' + + data%State%RAM(4)%FourwayValve = 0 + + + + data%State%RamLine%ShearBop_closed=0 + !ShearBop_closed_withPossibility= ShearBop_closed * TD_BOPConnectionPossibility(3) + data%State%RAM(4)%vdis_tot=0 + data%State%RAM(4)%vdis_bottles=0. + data%State%RAM(4)%fvr_air=0. + data%State%RAM(4)%vdis_elecp=0. + data%State%Pumps%Qiter=7 + data%State%RAM(4)%Qzero=70 + data%State%RAM(4)%Q=data%State%RAM(4)%Qzero + data%State%RAM(4)%flow=70 + data%State%RAM(4)%tol=0.0037 + + if (data%State%RamLine%FINISHED_shear==1) then + data%State%RamLine%ShearRamsLeverOld=1.0 + else + data%State%RamLine%ShearRamsLeverOld=data%EquipmentControl%BopControlPanel%MiddleRamsValve + endif + data%State%RamLine%FINISHED_shear=0 + data%State%RamLine%ShearRamIsOpening = .true. + data%State%RamLine%ShearRamIsClosing = .false. + + data%State%RAM(4)%bop_type = 3 + !AbopShearRam=186.5 !(in^2) + data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamOpen*231)/(data%State%ShearRAM%IDshearBopBase/2.) + !NeededVolumeShearRams=5.5 !galon for each BOP + !NeededVolumeShearRams=BlindRamOpen ! **changed + data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) !3.67 galon for each BOP ! **changed + !va=AbopShearRam*(IDshearBopBase-ODDrillpipe_inShearRam)/(2.*231) + !vb=NeededVolumeShearRams + endif +!===================================================================== + ! if (ShearRamIsOpening .or. ShearRamIsClosing .or. data%State%RAM(4)%Bottles_Charged_MalfActive) then + ! CALL SHEAR_RAMS_SUB + ! end if + +END SUBROUTINE SHEAR_RAMS + + + + + +SUBROUTINE SHEAR_RAMS_SUB + use SimulationVariables + USE CBopStackVariables + use CBopControlPanel + use SimulationVariables + USE CEquipmentsConstants + ! use CSimulationVariables + implicit none + + ! FirstSet= 0 + ! RamsFirstSet= 0 + + ! loop2: do while (finished_shear==0) + data%State%RAM(4)%SuccessionCounter = data%State%RAM(4)%SuccessionCounter + 1 + if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == 1.0 .and. data%State%RamLine%ShearRamsLeverOld == -1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RAM(4)%First_CloseTimecheck == 0) then + if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then + data%State%RAM(4)%SuccessionCounter = 0 ! also in starup + data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup + else + data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter + endif + if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOff + data%State%BopStackInput%MiddleRamsOpenLEDMine = LedOff + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOn !LedBlinking + data%State%RAM(4)%FourwayValve = 1 + endif + endif + + if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + data%State%RAM(4)%FourwayValve = 0 + data%State%RamLine%ShearBop_closed=0 + data%State%RAM(4)%p_bop=data%State%ShearRAM%PA + data%State%RamLine%ShearRamsLeverOld = data%EquipmentControl%BopControlPanel%MiddleRamsValve + CALL OpenMiddleRams ! for C code + data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code + data%State%RAM(4)%bop_type = 2 + data%State%ShearRAM%AbopShearRam=(data%Configuration%BopStack%BlindRamClose*231)/(data%State%ShearRAM%IDshearBopBase/2.) + data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBop-data%State%ShearRAM%ShearIsNotAllowed*data%State%ShearRAM%ODDrillpipe_inShearRam)/(2.*231) ! **changed + data%State%RAM(4)%vdis_bottles=0. + data%State%RAM(4)%fvr_air=0. + data%State%RAM(4)%vdis_elecp=0. + data%State%RamLine%ShearRamIsClosing = .true. + data%State%RamLine%ShearRamIsOpening = .false. + endif + + if (data%EquipmentControl%BopControlPanel%MiddleRamsValve == -1.0 .and. data%State%RamLine%ShearRamsLeverOld == 1.0 .and. data%State%ShearRAM%MiddleRamsFailureMalf==0 .and. data%State%BopStackAcc%RigAirMalf==0 .and. data%EquipmentControl%BopControlPanel%AirMasterValve==1 .and. data%State%RAM(4)%First_OpenTimecheck == 0) then + if ( data%State%RAM(4)%SuccessionCounter /= data%State%RAM(4)%SuccessionCounterOld+1 ) then + data%State%RAM(4)%SuccessionCounter = 0 ! also in starup + data%State%RAM(4)%SuccessionCounterOld = 0 ! also in starup + !return + else + data%State%RAM(4)%SuccessionCounterOld= data%State%RAM(4)%SuccessionCounter + endif + + if ( data%State%RAM(4)%SuccessionCounter >= int(2.5/data%State%RamLine%DeltaT_BOP) ) then + data%EquipmentControl%BopControlPanel%MiddleRamsCloseLED = LedOff + data%State%BopStackInput%MiddleRamsCloseLEDMine = LedOff + data%EquipmentControl%BopControlPanel%MiddleRamsOpenLED = LedOn !LedBlinking + data%State%RAM(4)%FourwayValve = 1 + endif + endif + + if (data%State%RAM(4)%FourwayValve == 1 .and. data%State%RamLine%P_ACC>data%State%BopStackAcc%acc_MinPressure) then + data%State%RAM(4)%FourwayValve = 0 + data%State%RamLine%ShearBop_closed=0 + data%State%RAM(4)%p_bop=data%State%ShearRAM%PA + data%State%RamLine%ShearRamsLeverOld = data%EquipmentControl%BopControlPanel%MiddleRamsValve + CALL OpenMiddleRams + data%State%RamLine%ShearBop_Situation_forTD= 0 ! open - for TD code + data%State%RAM(4)%bop_type = 3 + data%State%ShearRAM%NeededVolumeShearRams=data%State%ShearRAM%AbopShearRam*(data%State%ShearRAM%IDshearBopBase-data%State%ShearRAM%IDshearBop)/(2.*231) + data%State%RAM(4)%vdis_bottles=0. + data%State%RAM(4)%fvr_air=0. + data%State%RAM(4)%vdis_elecp=0. + data%State%RamLine%ShearRamIsOpening = .true. + data%State%RamLine%ShearRamIsClosing = .false. + endif + + data%State%RAM(4)%First_CloseTimecheck = 0 + data%State%RAM(4)%First_OpenTimecheck = 0 + data%State%RAM(4)%time=data%State%RAM(4)%time+data%State%RamLine%DeltaT_BOP !overal time (s) + + !=================================================== + ! BOP + !=================================================== + if (data%State%RamLine%ShearBop_closed==0) then !bop closing + call bop_code(1,data%State%ShearRAM%H_ShearRamBop,4) !ramtype=1 4=RNUMBER + endif !bop is closing + !================================================================ + if (data%State%RamLine%ShearBop_closed==1) then + data%State%RAM(4)%Q=0 + data%State%RAM(4)%p_bop=data%State%ShearRAM%PA + data%State%RAMS%minloss(4,17)=0. !RNUMBER=4 + endif + + data%State%RAM(4)%timecounter_ram=data%State%RAM(4)%timecounter_ram+1 + call sleepqq(100) + + if (data%State%RamLine%ShearBop_closed==1) then + data%State%RamLine%FINISHED_shear=1 + endif + ! if (IsStopped == .true.) return + ! end do loop2 !while finished_shear==0 + + ! if ( finished_shear==1 .and. data%State%RAM(4)%Bottles_Charged_MalfActive==.true.) then + ! call bop_code(1,H_ShearRamBop,4) !ramtype=1 4=RNUMBER + ! call sleepqq(100) + ! endif + END SUBROUTINE SHEAR_RAMS_SUB \ No newline at end of file diff --git a/Equipments/BopStack/VARIABLES.f90 b/Equipments/BopStack/VARIABLES.f90 index 8acf589..0c3cd5e 100644 --- a/Equipments/BopStack/VARIABLES.f90 +++ b/Equipments/BopStack/VARIABLES.f90 @@ -1,180 +1,180 @@ -MODULE BopVariables - use DynamicDoubleArray, only:DynamicDoubleArrayType - IMPLICIT NONE - - - - -!=========================================================================== -! INPUT VARIABLES -!=========================================================================== -type :: BopStackInputType - REAL,ALLOCATABLE:: MINORS1(:,:),PIPINGS_RAMLINE(:,:),MINORS_ANNULAR(:,:),PIPINGS_ANNULAR(:,:),PIPINGS_AIRPUMP(:,:),MINORS_AIRPUMP(:,:) - integer AnnularOpenLedMine,AnnularCloseLedMine,UpperRamsCloseLEDMine,UpperRamsOpenLEDMine,LowerRamsOpenLEDMine,LowerRamsCloseLEDMine - integer MiddleRamsOpenLEDMine,MiddleRamsCloseLEDMine,KillLineOpenLedMine,KillLineCloseLedMine,ChokeLineOpenLEDMine,ChokeLineCloseLEDMine - integer BOP_timeCounter -end type BopStackInputType -!=========================================================================== -! ACC. VARIABLES -!=========================================================================== -REAL,PARAMETER :: PressureDifferenceSteps = 20. ,BaseDifferenceP= 200. ! psi -type::BopStackAccType - REAL FVR_TOT,BOTTLE_CAPACITY,PRAMS_REGSET,acc_ChargedPressure,acc_MinPressure,ACC_PRECHARGE,ByPassOld - REAL pram_reg,test1,test2,test3,test4,test5,test6,test7,test8,test9,ax,bx - integer NOBOTTLES,AccPupmsFailMalf,AirSupplyPressureGaugeMalf,ManifoldPressureGaugeMalf,AccumulatorPressureGaugeMalf,RigAirMalf - real Cumulative_AirVolume, PressureDifference - integer SoundKoomeyAirPump -end type BopStackAccType -!=========================================================================== - -! RAM LINE COMPUTATIONAL VARIABLES -!=========================================================================== -type:: RamLineType - logical ShearRamIsClosing,ShearRamIsOpening - REAL ShearRamsLeverOld,NoActiveRmas - !REAL checkp,p_acccheck - REAL P_ACC,FVR,DeltaT_BOP - REAL diffp_air,losses_air,Qup,kinetic_air,pipe_loss1air,minor_loss1air,static_loss1air!,pipe_loss1_before,minor_loss1,static_loss1,kinetic_loss1,pipe_loss1 - !REAL loss_before,pipe_loss2,minor_loss2,deltah,static_loss2,kinetic_loss2,loss_after - integer AIRP_SWITCH,ELECP_SWITCH,ShearBop_closed,FINISHED_shear,EOF,NO_MINORSRAMLINE,NO_PIPINGSRAMLINE,NO_PIPINGS_AIRPLINE,NO_MINORS_AIRPLINE - integer counter,iteration,ShearBop_Situation_forTD - real BA1,BA2,BA3,BA4,BBA1,BBA2,BBA3,BBA4 - REAL B1,B2,B3,B4 - REAL,ALLOCATABLE:: Re_air(:),DIAM_AIR_MM(:),DIAM_AIR_INCH(:),AREA_AIR(:),REL_ROUGHAIR(:),LENGT_AIR(:),LF_AIR(:),CV_AIR(:),NOTE_AIR(:) - REAL,ALLOCATABLE:: fric_air(:),fricloss_air(:),minlosspa_air(:),minloss_air(:) - REAL,ALLOCATABLE:: MINORDIAM_AIR_INCH(:),MINORAREA_AIR(:) - REAL,ALLOCATABLE:: DIAM_RAMLINE_INCH(:),DIAM_RAMLINE_MM(:),AREA_RAMLINE(:),ROUGHNESS_AIRPLINE(:),ROUGHNESS_RAMLINE(:),RELROUGH_RAMLINE(:),LENGT_RAMLINE(:),LF_RAMLINE(:),CV_RAMLINE(:),NOTE_RAMLINE(:),AREAMINOR_RAMLINE(:) - !REAL,ALLOCATABLE:: Re_ramline(:),fric(:),fricloss(:) - REAL,ALLOCATABLE:: MINORDIAMETER_RAMLINE(:) - INTEGER,ALLOCATABLE:: ITEM(:),ITEM_PIPING(:),ITEM_PIPINGAIR(:),ITEM_MINORAIR(:) - CHARACTER,ALLOCATABLE:: DECRIPTION(:),DECRIPTION2(:),DECRIPTION_RAM(:),DESCRIPTION_AIR1(:),DESCRIPTION_AIR2(:) - real:: counter_airp,pacc_before - integer Annular_active,ShearBop_active,PipeRam1_active,PipeRam2_active,ChokeLine_active,KillLine_active -end type RamLineType - - !=========================================================================== -! ANNULAR PREVENTER COMPUTATIONAL VARIABLES -!=========================================================================== -type::AnnularComputationalType - integer PannularTimeStepDelay - type(DynamicDoubleArrayType) :: Pannular_regDelay - logical AnnPressureRise - integer NO_MinorsAnnularLine,NO_PipingsAnnularLine,RamsFirstSet - REAL pa_annular,p_annular - REAL,ALLOCATABLE:: MINORDIAMETER_ANNULARLINE(:),AREAMINOR_ANNULARLINE(:) - !REAL,ALLOCATABLE:: REAL_PregAnnular(:),real_IDAnnular(:),real_pAnnular(:) - REAL REAL_PregAnnular,real_IDAnnular,real_pAnnular - REAL,ALLOCATABLE:: LF_ANNULARLINE(:),CV_ANNULARLINE(:),NOTE_ANNULARLINE(:),minlosspa_ANNULAR(:),minloss_ANNULAR(:) - REAL,ALLOCATABLE:: DIAM_ANNULARLINE_INCH(:),DIAM_ANNULARLINE_MM(:),AREA_ANNULARLINE(:) - REAL,ALLOCATABLE:: LENGT_ANNULARLINE(:),ROUGHNESS_ANNULARLINE(:),RELROUGH_ANNULARLINE(:),Re_ANNULARline(:),fricANNULAR(:),friclossANNULAR(:) - INTEGER,ALLOCATABLE:: ITEMANNULAR(:),ITEM_PIPINGANNULAR(:) - CHARACTER,ALLOCATABLE:: DECRIPTIONANNULAR(:),DECRIPTION2ANNULAR(:),DECRIPTION_ANNULAR(:) - REAL WellBorePressure,acoef,Bcoef,const,AnnularSealingPressure,AnnularMovingPressure -end type AnnularComputationalType -!=========================================================================== -! ANNULAR PREVENTER VARIABLES -!=========================================================================== -type :: AnnularType - REAL (8) Pannular_reg - real Pannular_regset - logical AnnularIsClosing,AnnularIsOpening - REAL tolAnnular,tolzeroAnnular - integer Annular_closed,finished_Annular,FirstSet,AnnularFailureMalf,AnnularLeakMalf,AnnularPressureGaugeMalf,Annular_Situation_forTD - REAL AnnularLeverOld,H_AnnularBop,IDAnnular,AbopAnnular,ODDrillpipe_inAnnular,IDAnnularBase,ODDrillpipe_inAnnularBase - REAL NeededVolumeAnnular -end type AnnularType -!=========================================================================== -! PIPE RAMS 1 VARIABLES -!=========================================================================== -type::PipeRams1Type - logical IsClosing,IsOpening - REAL PipeRams1DotLeverOld,H - REAL NeededVolume,A,IDBase,ID,ODDrillpipe_in,ODDrillpipe_inBase - integer closed,finished,UpperRamsFailureMalf,UpperRamsLeakMalf,Situation_forTD - ! REAL real_ID -end type PipeRams1Type -!============================================================================ -! SHEAR RAM BOP VARIABLES -!============================================================================ -type:: ShearRamType - REAL PA,PB,P_SHEAR,VA,VB,RAM_COURSE,H_REGRAM,H_ShearRamBop - REAL,ALLOCATABLE:: ALPHA_QRAM(:),ALPHA_VDISRAM(:),ALPHA_PACC(:),ALPHA_PREGRAM(:),ALPHA_PBOP(:) - !REAL,ALLOCATABLE:: REAL_TIME(:),REAL_QRAM(:),REAL_VDISRAM(:),REAL_PACC(:),REAL_PREGRAM(:),REAL_PBOP(:),real_IDshearBop(:) - REAL REAL_TIME,REAL_QRAM,REAL_VDISRAM,REAL_PACC,REAL_PREGRAM,REAL_PBOP,real_IDshearBop - REAL IDshearBopBase,IDshearBop,ODDrillpipe_inShearRam,AbopShearRam,NeededVolumeShearRams,ODDrillpipe_inShearRamBase - Real IDshearBopFinal,IDPipeRam1Final,IDPipeRam2Final,IDAnnularFinal,OpenArea_shearBop,OpenArea_PipeRam1,OpenArea_PipeRam2,OpenArea_Annular - Real MinimumOpenArea_InBOP - integer MiddleRamsFailureMalf,MiddleRamsLeakMalf,ShearIsNotAllowed -end type ShearRamType -!=========================================================================== -! PIPE RAMS 2 VARIABLES -!=========================================================================== -type::PipeRam2Type - logical IsClosing,IsOpening - REAL LeverOld,H_Bop - REAL NeededVolume,ID,ODDrillpipe_in,ODDrillpipe_inBase - integer closed,finished,LowerRamsFailureMalf,LowerRamsLeakMalf,Situation_forTD - !REAL,ALLOCATABLE:: real_IDPipeRam2(:) - REAL real_ID -end type PipeRam2Type -!=========================================================================== -! CHOKE LINE VARIABLES -!=========================================================================== -type::ChokeLineType - logical IsClosing,IsOpening - REAL LeverOld,H_Bop - REAL NeededVolume,Abop,ID,ODDrillpipe_in,IDBase,ODDrillpipe_inBase - integer closed,finished - !REAL,ALLOCATABLE:: real_IDPipeRam1(:) - REAL real_ID -end type ChokeLineType -!=========================================================================== -! KILL LINE VARIABLES -!=========================================================================== -type::KillLineType - logical IsClosing,IsOpening - REAL LeverOld,H_Bop - REAL NeededVolume,Abop,ID,ODDrillpipe_in,IDBase,ODDrillpipe_inBase - integer closed,finished - !REAL,ALLOCATABLE:: real_IDPipeRam1(:) - REAL real_ID -end type KillLineType -!============================================================================ -! OIL & ENVIRONMENT VARIABLES -!============================================================================ -! REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000 -!specific gravity of liquid -!water density(kg/m^3) -!============================================================================ -! PUMP VARIABLES -!============================================================================ -type::PumpsType - REAL P_AIRP,DELTAV_AIR,TOL_AIR,DELTAV_ELECP,Qiter - REAL ELECTRIC_ON,ELECTRIC_OFF,AIR_ON,AIR_OFF,QAIR,QELECTRIC - !REAL,ALLOCATABLE:: alpha_Qair(:),alpha_timeair(:),alpha_paccair(:),alpha_pairp(:),alpha_diffpair(:),alpha_lossesair(:),alpha_fvrair(:) - REAL alpha_Qair,alpha_timeair,alpha_paccair,alpha_pairp,alpha_diffpair,alpha_lossesair,alpha_fvrair - logical SoundKoomeyElectric -end type PumpsType - -!================================================================================= - - TYPE, PUBLIC :: BOP_TypeVars - REAL vdis_tot,vdis_bottles,deltav_bottles,fvr_air,vdis_elecp,Qzero,Q,flow,tol,TIME,timecounter_ram,clock - integer bop_type, SuccessionCounter, SuccessionCounterOld,First_CloseTimecheck,First_OpenTimecheck,FourwayValve ! FourwayValve 1: Open , 0: Close - REAL loss_before,pipe_loss2,minor_loss2,deltah,static_loss2,kinetic_loss2,loss_after,TOLZERO,diffp_ram - REAL checkp,p_acccheck,P_BOP,minor_loss1,static_loss1,kinetic_loss1,pipe_loss1 - Logical Bottles_Charged_MalfActive - END TYPE BOP_TypeVars - - ! 1 : Annular (RNUMBER) - ! 2 : PipeRam1 (RNUMBER) - ! 3 : PipeRam2 (RNUMBER) - ! 4 : ShearRam (RNUMBER) - ! 5 : ChokeLine (RNUMBER) - ! 6 : KillLine (RNUMBER) - - TYPE, PUBLIC :: BOP_TypeVars2D - REAL, ALLOCATABLE:: minlosspa(:,:),minloss(:,:) - REAL,ALLOCATABLE:: Re_ramline(:,:),fric(:,:),fricloss(:,:) - END TYPE BOP_TypeVars2D +MODULE BopVariables + use DynamicDoubleArray, only:DynamicDoubleArrayType + IMPLICIT NONE + + + + +!=========================================================================== +! INPUT VARIABLES +!=========================================================================== +type :: BopStackInputType + REAL,ALLOCATABLE:: MINORS1(:,:),PIPINGS_RAMLINE(:,:),MINORS_ANNULAR(:,:),PIPINGS_ANNULAR(:,:),PIPINGS_AIRPUMP(:,:),MINORS_AIRPUMP(:,:) + integer AnnularOpenLedMine,AnnularCloseLedMine,UpperRamsCloseLEDMine,UpperRamsOpenLEDMine,LowerRamsOpenLEDMine,LowerRamsCloseLEDMine + integer MiddleRamsOpenLEDMine,MiddleRamsCloseLEDMine,KillLineOpenLedMine,KillLineCloseLedMine,ChokeLineOpenLEDMine,ChokeLineCloseLEDMine + integer BOP_timeCounter +end type BopStackInputType +!=========================================================================== +! ACC. VARIABLES +!=========================================================================== +REAL,PARAMETER :: PressureDifferenceSteps = 20. ,BaseDifferenceP= 200. ! psi +type::BopStackAccType + REAL FVR_TOT,BOTTLE_CAPACITY,PRAMS_REGSET,acc_ChargedPressure,acc_MinPressure,ACC_PRECHARGE,ByPassOld + REAL pram_reg,test1,test2,test3,test4,test5,test6,test7,test8,test9,ax,bx + integer NOBOTTLES,AccPupmsFailMalf,AirSupplyPressureGaugeMalf,ManifoldPressureGaugeMalf,AccumulatorPressureGaugeMalf,RigAirMalf + real Cumulative_AirVolume, PressureDifference + integer SoundKoomeyAirPump +end type BopStackAccType +!=========================================================================== + +! RAM LINE COMPUTATIONAL VARIABLES +!=========================================================================== +type:: RamLineType + logical ShearRamIsClosing,ShearRamIsOpening + REAL ShearRamsLeverOld,NoActiveRmas + !REAL checkp,p_acccheck + REAL P_ACC,FVR,DeltaT_BOP + REAL diffp_air,losses_air,Qup,kinetic_air,pipe_loss1air,minor_loss1air,static_loss1air!,pipe_loss1_before,minor_loss1,static_loss1,kinetic_loss1,pipe_loss1 + !REAL loss_before,pipe_loss2,minor_loss2,deltah,static_loss2,kinetic_loss2,loss_after + integer AIRP_SWITCH,ELECP_SWITCH,ShearBop_closed,FINISHED_shear,EOF,NO_MINORSRAMLINE,NO_PIPINGSRAMLINE,NO_PIPINGS_AIRPLINE,NO_MINORS_AIRPLINE + integer counter,iteration,ShearBop_Situation_forTD + real BA1,BA2,BA3,BA4,BBA1,BBA2,BBA3,BBA4 + REAL B1,B2,B3,B4 + REAL,ALLOCATABLE:: Re_air(:),DIAM_AIR_MM(:),DIAM_AIR_INCH(:),AREA_AIR(:),REL_ROUGHAIR(:),LENGT_AIR(:),LF_AIR(:),CV_AIR(:),NOTE_AIR(:) + REAL,ALLOCATABLE:: fric_air(:),fricloss_air(:),minlosspa_air(:),minloss_air(:) + REAL,ALLOCATABLE:: MINORDIAM_AIR_INCH(:),MINORAREA_AIR(:) + REAL,ALLOCATABLE:: DIAM_RAMLINE_INCH(:),DIAM_RAMLINE_MM(:),AREA_RAMLINE(:),ROUGHNESS_AIRPLINE(:),ROUGHNESS_RAMLINE(:),RELROUGH_RAMLINE(:),LENGT_RAMLINE(:),LF_RAMLINE(:),CV_RAMLINE(:),NOTE_RAMLINE(:),AREAMINOR_RAMLINE(:) + !REAL,ALLOCATABLE:: Re_ramline(:),fric(:),fricloss(:) + REAL,ALLOCATABLE:: MINORDIAMETER_RAMLINE(:) + INTEGER,ALLOCATABLE:: ITEM(:),ITEM_PIPING(:),ITEM_PIPINGAIR(:),ITEM_MINORAIR(:) + CHARACTER,ALLOCATABLE:: DECRIPTION(:),DECRIPTION2(:),DECRIPTION_RAM(:),DESCRIPTION_AIR1(:),DESCRIPTION_AIR2(:) + real:: counter_airp,pacc_before + integer Annular_active,ShearBop_active,PipeRam1_active,PipeRam2_active,ChokeLine_active,KillLine_active +end type RamLineType + + !=========================================================================== +! ANNULAR PREVENTER COMPUTATIONAL VARIABLES +!=========================================================================== +type::AnnularComputationalType + integer PannularTimeStepDelay + type(DynamicDoubleArrayType) :: Pannular_regDelay + logical AnnPressureRise + integer NO_MinorsAnnularLine,NO_PipingsAnnularLine,RamsFirstSet + REAL pa_annular,p_annular + REAL,ALLOCATABLE:: MINORDIAMETER_ANNULARLINE(:),AREAMINOR_ANNULARLINE(:) + !REAL,ALLOCATABLE:: REAL_PregAnnular(:),real_IDAnnular(:),real_pAnnular(:) + REAL REAL_PregAnnular,real_IDAnnular,real_pAnnular + REAL,ALLOCATABLE:: LF_ANNULARLINE(:),CV_ANNULARLINE(:),NOTE_ANNULARLINE(:),minlosspa_ANNULAR(:),minloss_ANNULAR(:) + REAL,ALLOCATABLE:: DIAM_ANNULARLINE_INCH(:),DIAM_ANNULARLINE_MM(:),AREA_ANNULARLINE(:) + REAL,ALLOCATABLE:: LENGT_ANNULARLINE(:),ROUGHNESS_ANNULARLINE(:),RELROUGH_ANNULARLINE(:),Re_ANNULARline(:),fricANNULAR(:),friclossANNULAR(:) + INTEGER,ALLOCATABLE:: ITEMANNULAR(:),ITEM_PIPINGANNULAR(:) + CHARACTER,ALLOCATABLE:: DECRIPTIONANNULAR(:),DECRIPTION2ANNULAR(:),DECRIPTION_ANNULAR(:) + REAL WellBorePressure,acoef,Bcoef,const,AnnularSealingPressure,AnnularMovingPressure +end type AnnularComputationalType +!=========================================================================== +! ANNULAR PREVENTER VARIABLES +!=========================================================================== +type :: AnnularType + REAL (8) Pannular_reg + real Pannular_regset + logical AnnularIsClosing,AnnularIsOpening + REAL tolAnnular,tolzeroAnnular + integer Annular_closed,finished_Annular,FirstSet,AnnularFailureMalf,AnnularLeakMalf,AnnularPressureGaugeMalf,Annular_Situation_forTD + REAL AnnularLeverOld,H_AnnularBop,IDAnnular,AbopAnnular,ODDrillpipe_inAnnular,IDAnnularBase,ODDrillpipe_inAnnularBase + REAL NeededVolumeAnnular +end type AnnularType +!=========================================================================== +! PIPE RAMS 1 VARIABLES +!=========================================================================== +type::PipeRams1Type + logical IsClosing,IsOpening + REAL PipeRams1DotLeverOld,H + REAL NeededVolume,A,IDBase,ID,ODDrillpipe_in,ODDrillpipe_inBase + integer closed,finished,UpperRamsFailureMalf,UpperRamsLeakMalf,Situation_forTD + ! REAL real_ID +end type PipeRams1Type +!============================================================================ +! SHEAR RAM BOP VARIABLES +!============================================================================ +type:: ShearRamType + REAL PA,PB,P_SHEAR,VA,VB,RAM_COURSE,H_REGRAM,H_ShearRamBop + REAL,ALLOCATABLE:: ALPHA_QRAM(:),ALPHA_VDISRAM(:),ALPHA_PACC(:),ALPHA_PREGRAM(:),ALPHA_PBOP(:) + !REAL,ALLOCATABLE:: REAL_TIME(:),REAL_QRAM(:),REAL_VDISRAM(:),REAL_PACC(:),REAL_PREGRAM(:),REAL_PBOP(:),real_IDshearBop(:) + REAL REAL_TIME,REAL_QRAM,REAL_VDISRAM,REAL_PACC,REAL_PREGRAM,REAL_PBOP,real_IDshearBop + REAL IDshearBopBase,IDshearBop,ODDrillpipe_inShearRam,AbopShearRam,NeededVolumeShearRams,ODDrillpipe_inShearRamBase + Real IDshearBopFinal,IDPipeRam1Final,IDPipeRam2Final,IDAnnularFinal,OpenArea_shearBop,OpenArea_PipeRam1,OpenArea_PipeRam2,OpenArea_Annular + Real MinimumOpenArea_InBOP + integer MiddleRamsFailureMalf,MiddleRamsLeakMalf,ShearIsNotAllowed +end type ShearRamType +!=========================================================================== +! PIPE RAMS 2 VARIABLES +!=========================================================================== +type::PipeRam2Type + logical IsClosing,IsOpening + REAL LeverOld,H_Bop + REAL NeededVolume,ID,ODDrillpipe_in,ODDrillpipe_inBase + integer closed,finished,LowerRamsFailureMalf,LowerRamsLeakMalf,Situation_forTD + !REAL,ALLOCATABLE:: real_IDPipeRam2(:) + REAL real_ID +end type PipeRam2Type +!=========================================================================== +! CHOKE LINE VARIABLES +!=========================================================================== +type::ChokeLineType + logical IsClosing,IsOpening + REAL LeverOld,H_Bop + REAL NeededVolume,Abop,ID,ODDrillpipe_in,IDBase,ODDrillpipe_inBase + integer closed,finished + !REAL,ALLOCATABLE:: real_IDPipeRam1(:) + REAL real_ID +end type ChokeLineType +!=========================================================================== +! KILL LINE VARIABLES +!=========================================================================== +type::KillLineType + logical IsClosing,IsOpening + REAL LeverOld,H_Bop + REAL NeededVolume,Abop,ID,ODDrillpipe_in,IDBase,ODDrillpipe_inBase + integer closed,finished + !REAL,ALLOCATABLE:: real_IDPipeRam1(:) + REAL real_ID +end type KillLineType +!============================================================================ +! OIL & ENVIRONMENT VARIABLES +!============================================================================ +! REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000 +!specific gravity of liquid +!water density(kg/m^3) +!============================================================================ +! PUMP VARIABLES +!============================================================================ +type::PumpsType + REAL P_AIRP,DELTAV_AIR,TOL_AIR,DELTAV_ELECP,Qiter + REAL ELECTRIC_ON,ELECTRIC_OFF,AIR_ON,AIR_OFF,QAIR,QELECTRIC + !REAL,ALLOCATABLE:: alpha_Qair(:),alpha_timeair(:),alpha_paccair(:),alpha_pairp(:),alpha_diffpair(:),alpha_lossesair(:),alpha_fvrair(:) + REAL alpha_Qair,alpha_timeair,alpha_paccair,alpha_pairp,alpha_diffpair,alpha_lossesair,alpha_fvrair + logical SoundKoomeyElectric +end type PumpsType + +!================================================================================= + + TYPE, PUBLIC :: BOP_TypeVars + REAL vdis_tot,vdis_bottles,deltav_bottles,fvr_air,vdis_elecp,Qzero,Q,flow,tol,TIME,timecounter_ram,clock + integer bop_type, SuccessionCounter, SuccessionCounterOld,First_CloseTimecheck,First_OpenTimecheck,FourwayValve ! FourwayValve 1: Open , 0: Close + REAL loss_before,pipe_loss2,minor_loss2,deltah,static_loss2,kinetic_loss2,loss_after,TOLZERO,diffp_ram + REAL checkp,p_acccheck,P_BOP,minor_loss1,static_loss1,kinetic_loss1,pipe_loss1 + Logical Bottles_Charged_MalfActive + END TYPE BOP_TypeVars + + ! 1 : Annular (RNUMBER) + ! 2 : PipeRam1 (RNUMBER) + ! 3 : PipeRam2 (RNUMBER) + ! 4 : ShearRam (RNUMBER) + ! 5 : ChokeLine (RNUMBER) + ! 6 : KillLine (RNUMBER) + + TYPE, PUBLIC :: BOP_TypeVars2D + REAL, ALLOCATABLE:: minlosspa(:,:),minloss(:,:) + REAL,ALLOCATABLE:: Re_ramline(:,:),fric(:,:),fricloss(:,:) + END TYPE BOP_TypeVars2D END MODULE \ No newline at end of file diff --git a/Equipments/ChokeControl/AirPump_Choke_Subs.f90 b/Equipments/ChokeControl/AirPump_Choke_Subs.f90 index 554e459..3b35ca5 100644 --- a/Equipments/ChokeControl/AirPump_Choke_Subs.f90 +++ b/Equipments/ChokeControl/AirPump_Choke_Subs.f90 @@ -1,337 +1,337 @@ - - SUBROUTINE DEALLOCATE_ARRAYS_CHOKE() - -USE CHOKEVARIABLES -use SimulationVariables !@ - -implicit none -write(*,*) 'deallocateeeeeeeeeeeee' -!=========================================================================== -! AIR PUMP LOSSES INPUT -!=========================================================================== -!if(allocated(PIPINGS_AIRPUMP)) deallocate(PIPINGS_AIRPUMP) - -DEALLOCATE (data%State%AirPumpLine%PIPINGS_AIRPUMP,data%State%AirPumpLine%DIAM_AIR_INCH, & - data%State%AirPumpLine%Re_air,data%State%AirPumpLine%AREA_AIR,data%State%AirPumpLine%LENGT_AIR,data%State%AirPumpLine%ROUGHNESS_AIRPLINE,data%State%AirPumpLine%REL_ROUGHAIR, & - data%State%AirPumpLine%fric_air,data%State%AirPumpLine%fricloss_air) - !================================================================ -DEALLOCATE (data%State%AirPumpLine%MINORS_AIRPUMP,data%State%AirPumpLine%MINORDIAM_AIR_INCH, & - data%State%AirPumpLine%MINORAREA_AIR,data%State%AirPumpLine%LF_AIR,data%State%AirPumpLine%CV_AIR,data%State%AirPumpLine%NOTE_AIR & - ,data%State%AirPumpLine%minlosspa_air,data%State%AirPumpLine%minloss_air) - - END - - - - - - - SUBROUTINE LOSS_INPUTS_CHOKE() -USE CHOKEVARIABLES -use SimulationVariables !@ -implicit none - Integer I - - -!=========================================================================== -! AIR PUMP LOSSES INPUT -!=========================================================================== -data%State%AirPumpLine%NO_PIPINGS_AIRPLINE=1 - -ALLOCATE (data%State%AirPumpLine%PIPINGS_AIRPUMP(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE,3)) - ! ID(INCH) L(MM) ROUGHNESS(MM)=e DESCRIPTION -data%State%AirPumpLine%PIPINGS_AIRPUMP(1,1:3)= (/0.5, 60960., 0.03/) !Avg.acc.distance - -!60960= 200 ft - - - ALLOCATE (data%State%AirPumpLine%DIAM_AIR_INCH(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%Re_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%AREA_AIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE), & - data%State%AirPumpLine%LENGT_AIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%ROUGHNESS_AIRPLINE(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%REL_ROUGHAIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE), & - data%State%AirPumpLine%fric_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%fricloss_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE)) - - - -DO I=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE - data%State%AirPumpLine%DIAM_AIR_INCH(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,1) - data%State%AirPumpLine%LENGT_AIR(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,2) - data%State%AirPumpLine%ROUGHNESS_AIRPLINE(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,3) - - - data%State%AirPumpLine%AREA_AIR(I)=PI*(data%State%AirPumpLine%DIAM_AIR_INCH(I)*0.0254)**2/4 !D(in), AREA(m) - data%State%AirPumpLine%REL_ROUGHAIR(I)=data%State%AirPumpLine%ROUGHNESS_AIRPLINE(I)/(data%State%AirPumpLine%DIAM_AIR_INCH(I)*25.4) - !DIAM_RAMLINE_MM(I)=DIAM_RAMLINE_MM(I)*.001 ! (m) - data%State%AirPumpLine%LENGT_AIR(I)=data%State%AirPumpLine%LENGT_AIR(I)*.001 ! (m) - ENDDO - - - !================================================================ -data%State%AirPumpLine%NO_MINORS_AIRPLINE=6 - -ALLOCATE (data%State%AirPumpLine%MINORS_AIRPUMP(data%State%AirPumpLine%NO_MINORS_AIRPLINE,4)) - - ! ID(INCH) LF CV NOTE(BAR) DESCRIPTION -data%State%AirPumpLine%MINORS_AIRPUMP(1,1:4)= (/2., 10., 0., 0./) !Acc.tee -data%State%AirPumpLine%MINORS_AIRPUMP(2,1:4)= (/2., 11., 0., 0./) !elbow -data%State%AirPumpLine%MINORS_AIRPUMP(3,1:4)= (/1., 0., 0., 3.4/) !filter -data%State%AirPumpLine%MINORS_AIRPUMP(4,1:4)= (/2., 0., 105., 0./) !valve -data%State%AirPumpLine%MINORS_AIRPUMP(5,1:4)= (/1., 0., 9.2, 0./) !valve -data%State%AirPumpLine%MINORS_AIRPUMP(6,1:4)= (/2., 6.4, 0., 0./) !unionA - - - - ALLOCATE (data%State%AirPumpLine%MINORDIAM_AIR_INCH(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%MINORAREA_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE), & - data%State%AirPumpLine%LF_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%CV_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%NOTE_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE) & - ,data%State%AirPumpLine%minlosspa_air(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%minloss_air(data%State%AirPumpLine%NO_MINORS_AIRPLINE)) - - - -DO I=1,data%State%AirPumpLine%NO_MINORS_AIRPLINE - data%State%AirPumpLine%MINORDIAM_AIR_INCH(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,1) - data%State%AirPumpLine%LF_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,2) - data%State%AirPumpLine%CV_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,3) - data%State%AirPumpLine%NOTE_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,4) - - - data%State%AirPumpLine%MINORAREA_AIR(I)=PI*(data%State%AirPumpLine%MINORDIAM_AIR_INCH(I)*0.0254)**2/4. !D(in), AREA(m) -ENDDO - - - END - - - - - -! SUBROUTINE PIPE_RAMS_CHOKE(CHNUMBER) -! USE CHOKEVARIABLES -! use ConfigurationVariables !@ -! Use CSimulationVariables -! implicit none -! INTEGER CHNUMBER -! Integer I - -! loop3: do while (ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) -! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then -! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. -! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. -! endif -! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then -! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. -! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. -! endif -! data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) -! call airpump_code_CHOKE(CHNUMBER) -! call sleepqq(100) -! if (IsStopped == .true.) return -! end do loop3 !while finished_Choke==0 -! end - - - - - - - SUBROUTINE airpump_code_CHOKE(CHNUMBER) - USE CHOKEVARIABLES -use SimulationVariables !@ - use CChokeManifold - use SimulationVariables - use CSounds - USE CChokeProblemsVariables - implicit none - Integer I - - INTEGER CHNUMBER - - data%State%AirDrivenPump%QAIR_PUMP=data%State%AirPumpLine%QITER+.1 !(gpm) maximum flow for the start - data%State%AirPumpLine%diffp_air=-10 - data%State%AirPumpLine%losses_air=10 - - !=================================================================== - ! AIR OPERATED PUMP - ! MODEL 10-6000W030 RATIO 55:1 - !=================for air consumption at 100 psig=================== - do while (data%State%AirPumpLine%diffp_air<0) - data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP-.1 - ! Qup=data%State%AirDrivenPump%QAIR_PUMP; - !cc1 = 1354; cc2 = -2066; cc3 = -2109; cc4 = -513.6; cc5 = 5935 FOR OUTPUT IN GPM - data%State%AirPumpLine%P_AIRP=data%State%AirDrivenPump%cc1*(data%State%AirDrivenPump%QAIR_PUMP**4) + data%State%AirDrivenPump%cc2*(data%State%AirDrivenPump%QAIR_PUMP**3) + data%State%AirDrivenPump%cc3*(data%State%AirDrivenPump%QAIR_PUMP**2) + data%State%AirDrivenPump%cc4*data%State%AirDrivenPump%QAIR_PUMP + data%State%AirDrivenPump%cc5 !(psig) - ! kinetic_air=sg*wdens*(QAIR_PUMP*6.30902e-5/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) - data%State%AirPumpLine%diffp_air= data%State%AirPumpLine%P_AIRP - data%State%AirPumpLine%Pdownstrem - end do !returns Qup - - do while (abs((data%State%AirPumpLine%diffp_air-data%State%AirPumpLine%losses_air)/data%State%AirPumpLine%diffp_air)>data%State%AirPumpLine%TOL_AIR) !finding correct QAIR_pump for 1 timecounter_ram - if (data%State%AirPumpLine%diffp_air-data%State%AirPumpLine%losses_air>0) then - data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP+.005 - else - data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP-.005 - endif - !=================================================================== - ! AIR OPERATED PUMP - ! MODEL 10-6000W030 RATIO 55:1 - !=================for air consumption at 100 psig=================== - data%State%AirPumpLine%P_AIRP=data%State%AirDrivenPump%cc1*(data%State%AirDrivenPump%QAIR_PUMP**4) + data%State%AirDrivenPump%cc2*(data%State%AirDrivenPump%QAIR_PUMP**3) + data%State%AirDrivenPump%cc3*(data%State%AirDrivenPump%QAIR_PUMP**2) + data%State%AirDrivenPump%cc4*data%State%AirDrivenPump%QAIR_PUMP + data%State%AirDrivenPump%cc5 !(psig) - !kinetic_air=sg*wdens*(QAIR_PUMP*6.30902e-005/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) - data%State%AirPumpLine%diffp_air= data%State%AirPumpLine%P_AIRP - data%State%AirPumpLine%Pdownstrem - !===========================LOSSES==================================== - do i=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE - data%State%AirPumpLine%Re_air(i)=data%State%AirDrivenPump%QAIR_PUMP*6.30902e-005*data%State%AirPumpLine%DIAM_AIR_INCH(I)*0.0254/(data%State%AirPumpLine%AREA_AIR(i)*nu) - enddo - do i=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE - if (data%State%AirPumpLine%Re_air(i) 1.0 ) then - data%State%Choke%SoundChokePump= 60 - data%State%Choke%Cumulative_AirVolume_Choke= data%State%Choke%Cumulative_AirVolume_Choke - 1.0 - else - data%State%Choke%SoundChokePump= 0.0 - endif - data%State%AirPumpLine%DELTAV_AIR=data%State%AirDrivenPump%QAIR_PUMP*data%State%AirPumpLine%DeltaT_Choke/60 !(galon) delta_t=1sec , Q(gpm) - if (data%State%CHOOKE(CHNUMBER)%ChokeIsClosing) data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%CHOOKE(CHNUMBER)%PassedCourse + (data%State%AirPumpLine%DELTAV_AIR*3785.412/data%State%AirPumpLine%Acylinder)!*(ChokeRateControlKnob/10.) ! 3785.412 : GALON TO CM^3 - if (data%State%CHOOKE(CHNUMBER)%ChokeIsOpening) data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%CHOOKE(CHNUMBER)%PassedCourse - (data%State%AirPumpLine%DELTAV_AIR*3785.412/data%State%AirPumpLine%Acylinder)!*(ChokeRateControlKnob/10.) - !DeltaT_Choke= 1sec or 2sec - !((((((((IN OUTER LOOP)))))) - !===============AIR PUMP OUTPUTS========================= - data%State%AirPumpLine%alpha_timeair=data%State%AirPumpLine%TIME ! overal time (s) - data%State%AirPumpLine%alpha_Pdownstrem=data%State%AirPumpLine%Pdownstrem - data%State%AirPumpLine%alpha_pairp=data%State%AirPumpLine%P_AIRP - data%State%AirPumpLine%alpha_Qair=data%State%AirDrivenPump%QAIR_PUMP - !write(*,*) 'diffp_air=',diffp_air - !pause - data%State%AirPumpLine%alpha_diffpair=data%State%AirPumpLine%diffp_air - data%State%AirPumpLine%alpha_lossesair=data%State%AirPumpLine%losses_air - !======================================================== - !OPEN(150,FILE='CHOKE_AIRPUMP_OUTPUTS.DAT') - - if (data%State%CHOOKE(CHNUMBER)%ChokeIsClosing .AND. data%State%CHOOKE(CHNUMBER)%PassedCourse>data%State%AirPumpLine%CourseBase) then - data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%AirPumpLine%CourseBase - data%State%Choke%SoundChokePump= 0.0 - endif - if (data%State%CHOOKE(CHNUMBER)%ChokeIsOpening .AND. data%State%CHOOKE(CHNUMBER)%PassedCourse<0.) then - data%State%CHOOKE(CHNUMBER)%PassedCourse=0. - data%State%Choke%SoundChokePump= 0.0 - endif - - call SetSoundChokePump(data%State%Choke%SoundChokePump) - data%State%CHOOKE(CHNUMBER)%PercentClose= data%State%CHOOKE(CHNUMBER)%PassedCourse/data%State%AirPumpLine%CourseBase - IF (data%EquipmentControl%ChokeControlPanel%Choke1LED==1) THEN - data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(1)%PercentClose*10 - ELSE ! Choke2LED==1 - data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(2)%PercentClose*10 - ENDIF - !CALL SetHydraulicChock1(nint(MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)*100)) - ! CALL SetHydraulicChock2(nint(MIN(data%State%CHOOKE(2)%PercentClose / 0.91 , 1.0)*100)) - ! .91 >> 9 percent clearance - - ! =================== calculating Area - ! AreaChoke=0.5 - ! .91 >> 9 percent clearance - - data%State%CHOOKE(1)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)) !ft^2 0.01334635 is ChokeAreaFullyOpen (ft^2) - data%State%CHOOKE(2)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(2)%PercentClose/ 0.91 , 1.0)) !ft^2 - data%State%Choke%HydraulicChoke1WashoutCoef= data%State%Choke%HydraulicChoke1WashoutCoef * data%State%CHOOKE(1)%WashoutMalf - data%State%Choke%HydraulicChoke1WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke1WashoutCoef+ data%State%CHOOKE(1)%WashoutMalf*(0.5/(60.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5=maximum washout coef , 60.0 sec= 1min duration time - data%State%Choke%HydraulicChoke2WashoutCoef= data%State%Choke%HydraulicChoke2WashoutCoef * data%State%CHOOKE(2)%WashoutMalf - data%State%Choke%HydraulicChoke2WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke2WashoutCoef+ data%State%CHOOKE(2)%WashoutMalf*(0.5/(60.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5=maximum washout coef , 60.0 sec= 1min duration time - !write(*,*) 'HydraulicChoke1WashoutCoef=' , HydraulicChoke1WashoutCoef - - IF (data%State%CHOOKE(1)%PlugMalf == 1) THEN - data%State%Choke%Present_HydraulicChoke1Plug= data%State%Choke%Present_HydraulicChoke1Plug * data%State%CHOOKE(1)%PlugMalf - ! integer: HydraulicChoke1PluggedPercent,HydraulicChoke1PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay - ! real: Present_HydraulicChoke1Plug,DeltaPlug1Percent - !write(*,*) 'HydraulicChoke1PluggedPercent=' , HydraulicChoke1PluggedPercent - - if ( (data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - data%State%Choke%HydraulicChoke1PluggedPercent_Old) /= 0) then - data%State%Choke%DeltaPlug1Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke1Plug - data%State%Choke%Plug1TimeCounter = 0 - !write(*,*) 'DeltaPlug1Percent, Present_HydraulicChoke1Plug = ' ,DeltaPlug1Percent , Present_HydraulicChoke1Plug - endif - data%State%Choke%Plug1TimeCounter= data%State%Choke%Plug1TimeCounter + 1 - data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - - if (data%State%Choke%Plug1TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=600 - data%State%Choke%Present_HydraulicChoke1Plug = data%State%Choke%Present_HydraulicChoke1Plug + data%State%CHOOKE(1)%PlugMalf* ((data%State%Choke%DeltaPlug1Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 - endif - !write(*,*) 'Present_HydraulicChoke1Plug=' , Present_HydraulicChoke1Plug - ENDIF - - IF (data%State%CHOOKE(2)%PlugMalf == 1) THEN - data%State%Choke%Present_HydraulicChoke2Plug= data%State%Choke%Present_HydraulicChoke2Plug * data%State%CHOOKE(2)%PlugMalf - ! integer: HydraulicChoke2PluggedPercent,HydraulicChoke2PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay - ! real: Present_HydraulicChoke2Plug,DeltaPlug2Percent - if ( (data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - data%State%Choke%HydraulicChoke2PluggedPercent_Old) /= 0 ) then - data%State%Choke%DeltaPlug2Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke2Plug - data%State%Choke%Plug2TimeCounter = 0 - endif - data%State%Choke%Plug2TimeCounter= data%State%Choke%Plug2TimeCounter + 1 - data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - if (data%State%Choke%Plug2TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=600 - data%State%Choke%Present_HydraulicChoke2Plug = data%State%Choke%Present_HydraulicChoke2Plug + data%State%CHOOKE(2)%PlugMalf *((data%State%Choke%DeltaPlug2Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 - endif - ENDIF - ! fully open area is 123/64 in^2 = 0.01334635 ft^2 - data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke+(data%State%CHOOKE(1)%WashoutMalf*data%State%Choke%HydraulicChoke1WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup - - !write(*,*) 'data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke=' ,data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke - - data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke-(data%State%CHOOKE(1)%PlugMalf* data%State%Choke%Present_HydraulicChoke1Plug *data%State%CHOOKE(1)%AreaChoke) ! Initialised in Choke Startup - - data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke+(data%State%CHOOKE(2)%WashoutMalf*data%State%Choke%HydraulicChoke2WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup - data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke-(data%State%CHOOKE(2)%PlugMalf* data%State%Choke%Present_HydraulicChoke2Plug *data%State%CHOOKE(2)%AreaChoke) ! Initialised in Choke Startup - !write(*,*) 'data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke=' ,data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke - - - data%State%CHOOKE(1)%AreaChokeFinal= data%State%CHOOKE(1)%AreaChoke - data%State%CHOOKE(2)%AreaChokeFinal= data%State%CHOOKE(2)%AreaChoke - - ! 144: ft^2 to in^2 - CALL SetHydraulicChock1(100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve - CALL SetHydraulicChock2(100 - nint((data%State%CHOOKE(2)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve - - - !write(*,*) 'data%State%CHOOKE(1)%PercentClose=' , data%State%CHOOKE(1)%PercentClose ! close percent 0 to 100 - !write(*,*) 'ChokePosition=' , ChokePosition ! close position 0 to 10 for display - !write(*,*) 'data%State%CHOOKE(1)%AreaChokeFinal=' , data%State%CHOOKE(1)%AreaChokeFinal ! Open Area (in^2) with clearance - !write(*,*) '(ChokeAreaFullyOpen/144.)=' , (ChokeAreaFullyOpen/144.) - !write(*,*) 'valve value=' , 100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(ChokeAreaFullyOpen/144.))*100) ! percent close 0 to 100 with clearance - !write(*,*) 'Valve(33)%Status=' , Valve(33)%Status ! T : open , F: close - ! =================== calculating Area - !write(*,*) 'data%State%CHOOKE(1)%AreaChoke= ' , data%State%CHOOKE(1)%AreaChoke - !WRITE(150,50) alpha_timeair,alpha_Qair,alpha_pairp, & - !alpha_Pdownstrem,alpha_diffpair,alpha_lossesair,data%State%CHOOKE(CHNUMBER)%PassedCourse - !50 FORMAT(7(f15.5)) - !======================================================================================== - !======================================================================================== - ! write(*,*) PassedCourse - end + + SUBROUTINE DEALLOCATE_ARRAYS_CHOKE() + +USE CHOKEVARIABLES +use SimulationVariables !@ + +implicit none +write(*,*) 'deallocateeeeeeeeeeeee' +!=========================================================================== +! AIR PUMP LOSSES INPUT +!=========================================================================== +!if(allocated(PIPINGS_AIRPUMP)) deallocate(PIPINGS_AIRPUMP) + +DEALLOCATE (data%State%AirPumpLine%PIPINGS_AIRPUMP,data%State%AirPumpLine%DIAM_AIR_INCH, & + data%State%AirPumpLine%Re_air,data%State%AirPumpLine%AREA_AIR,data%State%AirPumpLine%LENGT_AIR,data%State%AirPumpLine%ROUGHNESS_AIRPLINE,data%State%AirPumpLine%REL_ROUGHAIR, & + data%State%AirPumpLine%fric_air,data%State%AirPumpLine%fricloss_air) + !================================================================ +DEALLOCATE (data%State%AirPumpLine%MINORS_AIRPUMP,data%State%AirPumpLine%MINORDIAM_AIR_INCH, & + data%State%AirPumpLine%MINORAREA_AIR,data%State%AirPumpLine%LF_AIR,data%State%AirPumpLine%CV_AIR,data%State%AirPumpLine%NOTE_AIR & + ,data%State%AirPumpLine%minlosspa_air,data%State%AirPumpLine%minloss_air) + + END + + + + + + + SUBROUTINE LOSS_INPUTS_CHOKE() +USE CHOKEVARIABLES +use SimulationVariables !@ +implicit none + Integer I + + +!=========================================================================== +! AIR PUMP LOSSES INPUT +!=========================================================================== +data%State%AirPumpLine%NO_PIPINGS_AIRPLINE=1 + +ALLOCATE (data%State%AirPumpLine%PIPINGS_AIRPUMP(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE,3)) + ! ID(INCH) L(MM) ROUGHNESS(MM)=e DESCRIPTION +data%State%AirPumpLine%PIPINGS_AIRPUMP(1,1:3)= (/0.5, 60960., 0.03/) !Avg.acc.distance + +!60960= 200 ft + + + ALLOCATE (data%State%AirPumpLine%DIAM_AIR_INCH(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%Re_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%AREA_AIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE), & + data%State%AirPumpLine%LENGT_AIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%ROUGHNESS_AIRPLINE(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%REL_ROUGHAIR(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE), & + data%State%AirPumpLine%fric_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE),data%State%AirPumpLine%fricloss_air(data%State%AirPumpLine%NO_PIPINGS_AIRPLINE)) + + + +DO I=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE + data%State%AirPumpLine%DIAM_AIR_INCH(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,1) + data%State%AirPumpLine%LENGT_AIR(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,2) + data%State%AirPumpLine%ROUGHNESS_AIRPLINE(I)=data%State%AirPumpLine%PIPINGS_AIRPUMP(I,3) + + + data%State%AirPumpLine%AREA_AIR(I)=PI*(data%State%AirPumpLine%DIAM_AIR_INCH(I)*0.0254)**2/4 !D(in), AREA(m) + data%State%AirPumpLine%REL_ROUGHAIR(I)=data%State%AirPumpLine%ROUGHNESS_AIRPLINE(I)/(data%State%AirPumpLine%DIAM_AIR_INCH(I)*25.4) + !DIAM_RAMLINE_MM(I)=DIAM_RAMLINE_MM(I)*.001 ! (m) + data%State%AirPumpLine%LENGT_AIR(I)=data%State%AirPumpLine%LENGT_AIR(I)*.001 ! (m) + ENDDO + + + !================================================================ +data%State%AirPumpLine%NO_MINORS_AIRPLINE=6 + +ALLOCATE (data%State%AirPumpLine%MINORS_AIRPUMP(data%State%AirPumpLine%NO_MINORS_AIRPLINE,4)) + + ! ID(INCH) LF CV NOTE(BAR) DESCRIPTION +data%State%AirPumpLine%MINORS_AIRPUMP(1,1:4)= (/2., 10., 0., 0./) !Acc.tee +data%State%AirPumpLine%MINORS_AIRPUMP(2,1:4)= (/2., 11., 0., 0./) !elbow +data%State%AirPumpLine%MINORS_AIRPUMP(3,1:4)= (/1., 0., 0., 3.4/) !filter +data%State%AirPumpLine%MINORS_AIRPUMP(4,1:4)= (/2., 0., 105., 0./) !valve +data%State%AirPumpLine%MINORS_AIRPUMP(5,1:4)= (/1., 0., 9.2, 0./) !valve +data%State%AirPumpLine%MINORS_AIRPUMP(6,1:4)= (/2., 6.4, 0., 0./) !unionA + + + + ALLOCATE (data%State%AirPumpLine%MINORDIAM_AIR_INCH(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%MINORAREA_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE), & + data%State%AirPumpLine%LF_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%CV_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%NOTE_AIR(data%State%AirPumpLine%NO_MINORS_AIRPLINE) & + ,data%State%AirPumpLine%minlosspa_air(data%State%AirPumpLine%NO_MINORS_AIRPLINE),data%State%AirPumpLine%minloss_air(data%State%AirPumpLine%NO_MINORS_AIRPLINE)) + + + +DO I=1,data%State%AirPumpLine%NO_MINORS_AIRPLINE + data%State%AirPumpLine%MINORDIAM_AIR_INCH(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,1) + data%State%AirPumpLine%LF_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,2) + data%State%AirPumpLine%CV_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,3) + data%State%AirPumpLine%NOTE_AIR(I)=data%State%AirPumpLine%MINORS_AIRPUMP(I,4) + + + data%State%AirPumpLine%MINORAREA_AIR(I)=PI*(data%State%AirPumpLine%MINORDIAM_AIR_INCH(I)*0.0254)**2/4. !D(in), AREA(m) +ENDDO + + + END + + + + + +! SUBROUTINE PIPE_RAMS_CHOKE(CHNUMBER) +! USE CHOKEVARIABLES +! use ConfigurationVariables !@ +! Use CSimulationVariables +! implicit none +! INTEGER CHNUMBER +! Integer I + +! loop3: do while (ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) +! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then +! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. +! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. +! endif +! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then +! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. +! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. +! endif +! data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) +! call airpump_code_CHOKE(CHNUMBER) +! call sleepqq(100) +! if (IsStopped == .true.) return +! end do loop3 !while finished_Choke==0 +! end + + + + + + + SUBROUTINE airpump_code_CHOKE(CHNUMBER) + USE CHOKEVARIABLES +use SimulationVariables !@ + use CChokeManifold + use SimulationVariables + use CSounds + USE CChokeProblemsVariables + implicit none + Integer I + + INTEGER CHNUMBER + + data%State%AirDrivenPump%QAIR_PUMP=data%State%AirPumpLine%QITER+.1 !(gpm) maximum flow for the start + data%State%AirPumpLine%diffp_air=-10 + data%State%AirPumpLine%losses_air=10 + + !=================================================================== + ! AIR OPERATED PUMP + ! MODEL 10-6000W030 RATIO 55:1 + !=================for air consumption at 100 psig=================== + do while (data%State%AirPumpLine%diffp_air<0) + data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP-.1 + ! Qup=data%State%AirDrivenPump%QAIR_PUMP; + !cc1 = 1354; cc2 = -2066; cc3 = -2109; cc4 = -513.6; cc5 = 5935 FOR OUTPUT IN GPM + data%State%AirPumpLine%P_AIRP=data%State%AirDrivenPump%cc1*(data%State%AirDrivenPump%QAIR_PUMP**4) + data%State%AirDrivenPump%cc2*(data%State%AirDrivenPump%QAIR_PUMP**3) + data%State%AirDrivenPump%cc3*(data%State%AirDrivenPump%QAIR_PUMP**2) + data%State%AirDrivenPump%cc4*data%State%AirDrivenPump%QAIR_PUMP + data%State%AirDrivenPump%cc5 !(psig) + ! kinetic_air=sg*wdens*(QAIR_PUMP*6.30902e-5/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) + data%State%AirPumpLine%diffp_air= data%State%AirPumpLine%P_AIRP - data%State%AirPumpLine%Pdownstrem + end do !returns Qup + + do while (abs((data%State%AirPumpLine%diffp_air-data%State%AirPumpLine%losses_air)/data%State%AirPumpLine%diffp_air)>data%State%AirPumpLine%TOL_AIR) !finding correct QAIR_pump for 1 timecounter_ram + if (data%State%AirPumpLine%diffp_air-data%State%AirPumpLine%losses_air>0) then + data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP+.005 + else + data%State%AirDrivenPump%QAIR_PUMP=data%State%AirDrivenPump%QAIR_PUMP-.005 + endif + !=================================================================== + ! AIR OPERATED PUMP + ! MODEL 10-6000W030 RATIO 55:1 + !=================for air consumption at 100 psig=================== + data%State%AirPumpLine%P_AIRP=data%State%AirDrivenPump%cc1*(data%State%AirDrivenPump%QAIR_PUMP**4) + data%State%AirDrivenPump%cc2*(data%State%AirDrivenPump%QAIR_PUMP**3) + data%State%AirDrivenPump%cc3*(data%State%AirDrivenPump%QAIR_PUMP**2) + data%State%AirDrivenPump%cc4*data%State%AirDrivenPump%QAIR_PUMP + data%State%AirDrivenPump%cc5 !(psig) + !kinetic_air=sg*wdens*(QAIR_PUMP*6.30902e-005/((1/4.)*pi*(2*0.254e-1)**2))**2/(2*6895) !(psi) + data%State%AirPumpLine%diffp_air= data%State%AirPumpLine%P_AIRP - data%State%AirPumpLine%Pdownstrem + !===========================LOSSES==================================== + do i=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE + data%State%AirPumpLine%Re_air(i)=data%State%AirDrivenPump%QAIR_PUMP*6.30902e-005*data%State%AirPumpLine%DIAM_AIR_INCH(I)*0.0254/(data%State%AirPumpLine%AREA_AIR(i)*nu) + enddo + do i=1,data%State%AirPumpLine%NO_PIPINGS_AIRPLINE + if (data%State%AirPumpLine%Re_air(i) 1.0 ) then + data%State%Choke%SoundChokePump= 60 + data%State%Choke%Cumulative_AirVolume_Choke= data%State%Choke%Cumulative_AirVolume_Choke - 1.0 + else + data%State%Choke%SoundChokePump= 0.0 + endif + data%State%AirPumpLine%DELTAV_AIR=data%State%AirDrivenPump%QAIR_PUMP*data%State%AirPumpLine%DeltaT_Choke/60 !(galon) delta_t=1sec , Q(gpm) + if (data%State%CHOOKE(CHNUMBER)%ChokeIsClosing) data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%CHOOKE(CHNUMBER)%PassedCourse + (data%State%AirPumpLine%DELTAV_AIR*3785.412/data%State%AirPumpLine%Acylinder)!*(ChokeRateControlKnob/10.) ! 3785.412 : GALON TO CM^3 + if (data%State%CHOOKE(CHNUMBER)%ChokeIsOpening) data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%CHOOKE(CHNUMBER)%PassedCourse - (data%State%AirPumpLine%DELTAV_AIR*3785.412/data%State%AirPumpLine%Acylinder)!*(ChokeRateControlKnob/10.) + !DeltaT_Choke= 1sec or 2sec + !((((((((IN OUTER LOOP)))))) + !===============AIR PUMP OUTPUTS========================= + data%State%AirPumpLine%alpha_timeair=data%State%AirPumpLine%TIME ! overal time (s) + data%State%AirPumpLine%alpha_Pdownstrem=data%State%AirPumpLine%Pdownstrem + data%State%AirPumpLine%alpha_pairp=data%State%AirPumpLine%P_AIRP + data%State%AirPumpLine%alpha_Qair=data%State%AirDrivenPump%QAIR_PUMP + !write(*,*) 'diffp_air=',diffp_air + !pause + data%State%AirPumpLine%alpha_diffpair=data%State%AirPumpLine%diffp_air + data%State%AirPumpLine%alpha_lossesair=data%State%AirPumpLine%losses_air + !======================================================== + !OPEN(150,FILE='CHOKE_AIRPUMP_OUTPUTS.DAT') + + if (data%State%CHOOKE(CHNUMBER)%ChokeIsClosing .AND. data%State%CHOOKE(CHNUMBER)%PassedCourse>data%State%AirPumpLine%CourseBase) then + data%State%CHOOKE(CHNUMBER)%PassedCourse=data%State%AirPumpLine%CourseBase + data%State%Choke%SoundChokePump= 0.0 + endif + if (data%State%CHOOKE(CHNUMBER)%ChokeIsOpening .AND. data%State%CHOOKE(CHNUMBER)%PassedCourse<0.) then + data%State%CHOOKE(CHNUMBER)%PassedCourse=0. + data%State%Choke%SoundChokePump= 0.0 + endif + + call SetSoundChokePump(data%State%Choke%SoundChokePump) + data%State%CHOOKE(CHNUMBER)%PercentClose= data%State%CHOOKE(CHNUMBER)%PassedCourse/data%State%AirPumpLine%CourseBase + IF (data%EquipmentControl%ChokeControlPanel%Choke1LED==1) THEN + data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(1)%PercentClose*10 + ELSE ! Choke2LED==1 + data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(2)%PercentClose*10 + ENDIF + !CALL SetHydraulicChock1(nint(MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)*100)) + ! CALL SetHydraulicChock2(nint(MIN(data%State%CHOOKE(2)%PercentClose / 0.91 , 1.0)*100)) + ! .91 >> 9 percent clearance + + ! =================== calculating Area + ! AreaChoke=0.5 + ! .91 >> 9 percent clearance + + data%State%CHOOKE(1)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)) !ft^2 0.01334635 is ChokeAreaFullyOpen (ft^2) + data%State%CHOOKE(2)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(2)%PercentClose/ 0.91 , 1.0)) !ft^2 + data%State%Choke%HydraulicChoke1WashoutCoef= data%State%Choke%HydraulicChoke1WashoutCoef * data%State%CHOOKE(1)%WashoutMalf + data%State%Choke%HydraulicChoke1WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke1WashoutCoef+ data%State%CHOOKE(1)%WashoutMalf*(0.5/(60.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5=maximum washout coef , 60.0 sec= 1min duration time + data%State%Choke%HydraulicChoke2WashoutCoef= data%State%Choke%HydraulicChoke2WashoutCoef * data%State%CHOOKE(2)%WashoutMalf + data%State%Choke%HydraulicChoke2WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke2WashoutCoef+ data%State%CHOOKE(2)%WashoutMalf*(0.5/(60.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5=maximum washout coef , 60.0 sec= 1min duration time + !write(*,*) 'HydraulicChoke1WashoutCoef=' , HydraulicChoke1WashoutCoef + + IF (data%State%CHOOKE(1)%PlugMalf == 1) THEN + data%State%Choke%Present_HydraulicChoke1Plug= data%State%Choke%Present_HydraulicChoke1Plug * data%State%CHOOKE(1)%PlugMalf + ! integer: HydraulicChoke1PluggedPercent,HydraulicChoke1PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay + ! real: Present_HydraulicChoke1Plug,DeltaPlug1Percent + !write(*,*) 'HydraulicChoke1PluggedPercent=' , HydraulicChoke1PluggedPercent + + if ( (data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - data%State%Choke%HydraulicChoke1PluggedPercent_Old) /= 0) then + data%State%Choke%DeltaPlug1Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke1Plug + data%State%Choke%Plug1TimeCounter = 0 + !write(*,*) 'DeltaPlug1Percent, Present_HydraulicChoke1Plug = ' ,DeltaPlug1Percent , Present_HydraulicChoke1Plug + endif + data%State%Choke%Plug1TimeCounter= data%State%Choke%Plug1TimeCounter + 1 + data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent + + if (data%State%Choke%Plug1TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=600 + data%State%Choke%Present_HydraulicChoke1Plug = data%State%Choke%Present_HydraulicChoke1Plug + data%State%CHOOKE(1)%PlugMalf* ((data%State%Choke%DeltaPlug1Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 + endif + !write(*,*) 'Present_HydraulicChoke1Plug=' , Present_HydraulicChoke1Plug + ENDIF + + IF (data%State%CHOOKE(2)%PlugMalf == 1) THEN + data%State%Choke%Present_HydraulicChoke2Plug= data%State%Choke%Present_HydraulicChoke2Plug * data%State%CHOOKE(2)%PlugMalf + ! integer: HydraulicChoke2PluggedPercent,HydraulicChoke2PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay + ! real: Present_HydraulicChoke2Plug,DeltaPlug2Percent + if ( (data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - data%State%Choke%HydraulicChoke2PluggedPercent_Old) /= 0 ) then + data%State%Choke%DeltaPlug2Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke2Plug + data%State%Choke%Plug2TimeCounter = 0 + endif + data%State%Choke%Plug2TimeCounter= data%State%Choke%Plug2TimeCounter + 1 + data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent + if (data%State%Choke%Plug2TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=600 + data%State%Choke%Present_HydraulicChoke2Plug = data%State%Choke%Present_HydraulicChoke2Plug + data%State%CHOOKE(2)%PlugMalf *((data%State%Choke%DeltaPlug2Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 + endif + ENDIF + ! fully open area is 123/64 in^2 = 0.01334635 ft^2 + data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke+(data%State%CHOOKE(1)%WashoutMalf*data%State%Choke%HydraulicChoke1WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup + + !write(*,*) 'data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke=' ,data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke + + data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke-(data%State%CHOOKE(1)%PlugMalf* data%State%Choke%Present_HydraulicChoke1Plug *data%State%CHOOKE(1)%AreaChoke) ! Initialised in Choke Startup + + data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke+(data%State%CHOOKE(2)%WashoutMalf*data%State%Choke%HydraulicChoke2WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup + data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke-(data%State%CHOOKE(2)%PlugMalf* data%State%Choke%Present_HydraulicChoke2Plug *data%State%CHOOKE(2)%AreaChoke) ! Initialised in Choke Startup + !write(*,*) 'data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke=' ,data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke + + + data%State%CHOOKE(1)%AreaChokeFinal= data%State%CHOOKE(1)%AreaChoke + data%State%CHOOKE(2)%AreaChokeFinal= data%State%CHOOKE(2)%AreaChoke + + ! 144: ft^2 to in^2 + CALL SetHydraulicChock1(100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve + CALL SetHydraulicChock2(100 - nint((data%State%CHOOKE(2)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve + + + !write(*,*) 'data%State%CHOOKE(1)%PercentClose=' , data%State%CHOOKE(1)%PercentClose ! close percent 0 to 100 + !write(*,*) 'ChokePosition=' , ChokePosition ! close position 0 to 10 for display + !write(*,*) 'data%State%CHOOKE(1)%AreaChokeFinal=' , data%State%CHOOKE(1)%AreaChokeFinal ! Open Area (in^2) with clearance + !write(*,*) '(ChokeAreaFullyOpen/144.)=' , (ChokeAreaFullyOpen/144.) + !write(*,*) 'valve value=' , 100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(ChokeAreaFullyOpen/144.))*100) ! percent close 0 to 100 with clearance + !write(*,*) 'Valve(33)%Status=' , Valve(33)%Status ! T : open , F: close + ! =================== calculating Area + !write(*,*) 'data%State%CHOOKE(1)%AreaChoke= ' , data%State%CHOOKE(1)%AreaChoke + !WRITE(150,50) alpha_timeair,alpha_Qair,alpha_pairp, & + !alpha_Pdownstrem,alpha_diffpair,alpha_lossesair,data%State%CHOOKE(CHNUMBER)%PassedCourse + !50 FORMAT(7(f15.5)) + !======================================================================================== + !======================================================================================== + ! write(*,*) PassedCourse + end diff --git a/Equipments/ChokeControl/CHOKE.f90 b/Equipments/ChokeControl/CHOKE.f90 index 2a70d64..75ced6b 100644 --- a/Equipments/ChokeControl/CHOKE.f90 +++ b/Equipments/ChokeControl/CHOKE.f90 @@ -1,140 +1,140 @@ - - -module ChokeModule - USE CHOKEVARIABLES -use SimulationVariables !@ - !use CDataDisplayConsole - ! !@use ConfigurationVariables, CasingPressureDataDisplay=>CasingPressure!, StandPipePressureDataDisplay=>StandPipePressure - USE CChokeProblemsVariables - !use CChokeControlPanelVariables - ! !@use ConfigurationVariables, StandPipePressureChoke=>StandPipePressure - USE MudSystemVARIABLES -use SimulationVariables !@@@ - use CChokeManifold - use SimulationVariables - - contains - - ! function CHOKE_MainBody1 result(CHNUMBER) - ! implicit none - ! INTEGER CHNUMBER - ! IF(data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch== 1) THEN - ! data%EquipmentControl%ChokeControlPanel%Choke1LED=1 - ! data%EquipmentControl%ChokeControlPanel%Choke2LED=0 - ! CHNUMBER=1 - ! ELSE - ! data%EquipmentControl%ChokeControlPanel%Choke2LED=1 - ! data%EquipmentControl%ChokeControlPanel%Choke1LED=0 - ! CHNUMBER=2 - ! ENDIF - ! end function CHOKE_MainBody1 - ! CALL PIPE_RAMS_CHOKE(CHNUMBER) - - ! subroutine Choke_innerLoop - ! ! do while (ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) - ! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then - ! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. - ! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. - ! endif - ! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then - ! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. - ! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. - ! endif - ! data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) - ! call airpump_code_CHOKE(CHNUMBER) - ! ! call sleepqq(100) - ! ! if (IsStopped == .true.) return - ! ! enddo - ! end if - ! end subroutine Choke_innerLoop - - subroutine CHOKE_MainBody2 - IF (data%EquipmentControl%ChokeControlPanel%Choke1LED==1) THEN - data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(1)%PercentClose*10 ! display monitor - ELSE ! Choke2LED==1 - data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(2)%PercentClose*10 ! display monitor - ENDIF - ! =================== calculating Area - ! AreaChoke=0.5 - ! .91 >> 9 percent clearance - data%State%CHOOKE(1)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)) !ft^2 0.01334635 is ChokeAreaFullyOpen (ft^2) - data%State%CHOOKE(2)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(2)%PercentClose/ 0.91 , 1.0)) !ft^2 - !write(*,*) 'data%State%CHOOKE(1)%AreaChoke= ' , data%State%CHOOKE(1)%AreaChoke - data%State%Choke%HydraulicChoke1WashoutCoef= data%State%Choke%HydraulicChoke1WashoutCoef * data%State%CHOOKE(1)%WashoutMalf - data%State%Choke%HydraulicChoke1WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke1WashoutCoef+ data%State%CHOOKE(1)%WashoutMalf*(0.5/(180.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5 = maximum washout coef , 180.0 sec = 3 min duration time - data%State%Choke%HydraulicChoke2WashoutCoef= data%State%Choke%HydraulicChoke2WashoutCoef * data%State%CHOOKE(2)%WashoutMalf - data%State%Choke%HydraulicChoke2WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke2WashoutCoef+ data%State%CHOOKE(2)%WashoutMalf*(0.5/(180.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5 = maximum washout coef , 180.0 sec = 3 min duration time - !write(*,*) 'HydraulicChoke1WashoutCoef=' , HydraulicChoke1WashoutCoef - IF (data%State%CHOOKE(1)%PlugMalf == 1) THEN - data%State%Choke%Present_HydraulicChoke1Plug= data%State%Choke%Present_HydraulicChoke1Plug * data%State%CHOOKE(1)%PlugMalf - ! integer: HydraulicChoke1PluggedPercent,HydraulicChoke1PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay - ! real: Present_HydraulicChoke1Plug,DeltaPlug1Percent - !write(*,*) 'HydraulicChoke1PluggedPercent=' , HydraulicChoke1PluggedPercent - if ( (data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - data%State%Choke%HydraulicChoke1PluggedPercent_Old) /= 0) then - data%State%Choke%DeltaPlug1Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke1Plug - data%State%Choke%Plug1TimeCounter = 0 - !write(*,*) 'DeltaPlug1Percent, Present_HydraulicChoke1Plug = ' ,DeltaPlug1Percent , Present_HydraulicChoke1Plug - endif - data%State%Choke%Plug1TimeCounter= data%State%Choke%Plug1TimeCounter + 1 - data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - if (data%State%Choke%Plug1TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=1800 - data%State%Choke%Present_HydraulicChoke1Plug = data%State%Choke%Present_HydraulicChoke1Plug + data%State%CHOOKE(1)%PlugMalf* ((data%State%Choke%DeltaPlug1Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 - endif - - !write(*,*) 'Present_HydraulicChoke1Plug=' , Present_HydraulicChoke1Plug - ENDIF - - IF (data%State%CHOOKE(2)%PlugMalf == 1) THEN - data%State%Choke%Present_HydraulicChoke2Plug= data%State%Choke%Present_HydraulicChoke2Plug * data%State%CHOOKE(2)%PlugMalf - ! integer: HydraulicChoke2PluggedPercent,HydraulicChoke2PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay - ! real: Present_HydraulicChoke2Plug,DeltaPlug2Percent - if ( (data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - data%State%Choke%HydraulicChoke2PluggedPercent_Old) /= 0 ) then - data%State%Choke%DeltaPlug2Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke2Plug - data%State%Choke%Plug2TimeCounter = 0 - endif - data%State%Choke%Plug2TimeCounter= data%State%Choke%Plug2TimeCounter + 1 - data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - if (data%State%Choke%Plug2TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=1800 - data%State%Choke%Present_HydraulicChoke2Plug = data%State%Choke%Present_HydraulicChoke2Plug + data%State%CHOOKE(2)%PlugMalf *((data%State%Choke%DeltaPlug2Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 1800.0 - endif - ENDIF - ! fully open area is 123/64 in^2 = 0.01334635 ft^2 - data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke+(data%State%CHOOKE(1)%WashoutMalf*data%State%Choke%HydraulicChoke1WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup - - !write(*,*) 'data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke=' ,data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke - - data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke-(data%State%CHOOKE(1)%PlugMalf* data%State%Choke%Present_HydraulicChoke1Plug *data%State%CHOOKE(1)%AreaChoke) ! Initialised in Choke Startup - - data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke+(data%State%CHOOKE(2)%WashoutMalf*data%State%Choke%HydraulicChoke2WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup - data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke-(data%State%CHOOKE(2)%PlugMalf* data%State%Choke%Present_HydraulicChoke2Plug *data%State%CHOOKE(2)%AreaChoke) ! Initialised in Choke Startup - !write(*,*) 'data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke=' ,data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke - - - data%State%CHOOKE(1)%AreaChokeFinal= data%State%CHOOKE(1)%AreaChoke - data%State%CHOOKE(2)%AreaChokeFinal= data%State%CHOOKE(2)%AreaChoke - - ! 144: ft^2 to in^2 - CALL SetHydraulicChock1(100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve - CALL SetHydraulicChock2(100 - nint((data%State%CHOOKE(2)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve - - !write(*,*) 'data%State%CHOOKE(1)%PercentClose=' , data%State%CHOOKE(1)%PercentClose ! close percent 0 to 100 - !write(*,*) 'ChokePosition=' , ChokePosition ! close position 0 to 10 for display - !write(*,*) 'data%State%CHOOKE(1)%AreaChokeFinal=' , data%State%CHOOKE(1)%AreaChokeFinal ! Open Area (in^2) with clearance - !write(*,*) '(ChokeAreaFullyOpen/144.)=' , (ChokeAreaFullyOpen/144.) - !write(*,*) 'valve value=' , 100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(ChokeAreaFullyOpen/144.))*100) ! percent close 0 to 100 with clearance - !write(*,*) 'Valve(33)%Status=' , Valve(33)%Status ! T : open , F: close - ! =================== calculating Area - - !AreaChoke= data%State%CHOOKE(1)%AreaChoke !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< badan moteghayer 1 ya 2 shavad - - ! write(*,*) 'AreaChoke:',AreaChoke - - !=========================================================================== - ! MUD PUMP STROKES - ! & TOTAL STROKE- CHOKE CONTROL PANEL - !=========================================================================== - - !************************* IN MUD SYSTEM MODULE************************* - end subroutine CHOKE_MainBody2 - + + +module ChokeModule + USE CHOKEVARIABLES +use SimulationVariables !@ + !use CDataDisplayConsole + ! !@use ConfigurationVariables, CasingPressureDataDisplay=>CasingPressure!, StandPipePressureDataDisplay=>StandPipePressure + USE CChokeProblemsVariables + !use CChokeControlPanelVariables + ! !@use ConfigurationVariables, StandPipePressureChoke=>StandPipePressure + USE MudSystemVARIABLES +use SimulationVariables !@@@ + use CChokeManifold + use SimulationVariables + + contains + + ! function CHOKE_MainBody1 result(CHNUMBER) + ! implicit none + ! INTEGER CHNUMBER + ! IF(data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch== 1) THEN + ! data%EquipmentControl%ChokeControlPanel%Choke1LED=1 + ! data%EquipmentControl%ChokeControlPanel%Choke2LED=0 + ! CHNUMBER=1 + ! ELSE + ! data%EquipmentControl%ChokeControlPanel%Choke2LED=1 + ! data%EquipmentControl%ChokeControlPanel%Choke1LED=0 + ! CHNUMBER=2 + ! ENDIF + ! end function CHOKE_MainBody1 + ! CALL PIPE_RAMS_CHOKE(CHNUMBER) + + ! subroutine Choke_innerLoop + ! ! do while (ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) + ! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then + ! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. + ! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. + ! endif + ! if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then + ! data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. + ! data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. + ! endif + ! data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) + ! call airpump_code_CHOKE(CHNUMBER) + ! ! call sleepqq(100) + ! ! if (IsStopped == .true.) return + ! ! enddo + ! end if + ! end subroutine Choke_innerLoop + + subroutine CHOKE_MainBody2 + IF (data%EquipmentControl%ChokeControlPanel%Choke1LED==1) THEN + data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(1)%PercentClose*10 ! display monitor + ELSE ! Choke2LED==1 + data%EquipmentControl%ChokeControlPanel%ChokePosition= (1 - data%State%Choke%GaugeChokePositionMailf) * data%State%CHOOKE(2)%PercentClose*10 ! display monitor + ENDIF + ! =================== calculating Area + ! AreaChoke=0.5 + ! .91 >> 9 percent clearance + data%State%CHOOKE(1)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(1)%PercentClose / 0.91 , 1.0)) !ft^2 0.01334635 is ChokeAreaFullyOpen (ft^2) + data%State%CHOOKE(2)%AreaChoke=0.01334635-(0.01334635* MIN(data%State%CHOOKE(2)%PercentClose/ 0.91 , 1.0)) !ft^2 + !write(*,*) 'data%State%CHOOKE(1)%AreaChoke= ' , data%State%CHOOKE(1)%AreaChoke + data%State%Choke%HydraulicChoke1WashoutCoef= data%State%Choke%HydraulicChoke1WashoutCoef * data%State%CHOOKE(1)%WashoutMalf + data%State%Choke%HydraulicChoke1WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke1WashoutCoef+ data%State%CHOOKE(1)%WashoutMalf*(0.5/(180.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5 = maximum washout coef , 180.0 sec = 3 min duration time + data%State%Choke%HydraulicChoke2WashoutCoef= data%State%Choke%HydraulicChoke2WashoutCoef * data%State%CHOOKE(2)%WashoutMalf + data%State%Choke%HydraulicChoke2WashoutCoef= MIN( 0.5 , data%State%Choke%HydraulicChoke2WashoutCoef+ data%State%CHOOKE(2)%WashoutMalf*(0.5/(180.0/data%State%AirPumpLine%DeltaT_Choke)) ) ! 0.5 = maximum washout coef , 180.0 sec = 3 min duration time + !write(*,*) 'HydraulicChoke1WashoutCoef=' , HydraulicChoke1WashoutCoef + IF (data%State%CHOOKE(1)%PlugMalf == 1) THEN + data%State%Choke%Present_HydraulicChoke1Plug= data%State%Choke%Present_HydraulicChoke1Plug * data%State%CHOOKE(1)%PlugMalf + ! integer: HydraulicChoke1PluggedPercent,HydraulicChoke1PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay + ! real: Present_HydraulicChoke1Plug,DeltaPlug1Percent + !write(*,*) 'HydraulicChoke1PluggedPercent=' , HydraulicChoke1PluggedPercent + if ( (data%problems%ChokeProblems%HydraulicChoke1PluggedPercent - data%State%Choke%HydraulicChoke1PluggedPercent_Old) /= 0) then + data%State%Choke%DeltaPlug1Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke1Plug + data%State%Choke%Plug1TimeCounter = 0 + !write(*,*) 'DeltaPlug1Percent, Present_HydraulicChoke1Plug = ' ,DeltaPlug1Percent , Present_HydraulicChoke1Plug + endif + data%State%Choke%Plug1TimeCounter= data%State%Choke%Plug1TimeCounter + 1 + data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent + if (data%State%Choke%Plug1TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=1800 + data%State%Choke%Present_HydraulicChoke1Plug = data%State%Choke%Present_HydraulicChoke1Plug + data%State%CHOOKE(1)%PlugMalf* ((data%State%Choke%DeltaPlug1Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 600.0 + endif + + !write(*,*) 'Present_HydraulicChoke1Plug=' , Present_HydraulicChoke1Plug + ENDIF + + IF (data%State%CHOOKE(2)%PlugMalf == 1) THEN + data%State%Choke%Present_HydraulicChoke2Plug= data%State%Choke%Present_HydraulicChoke2Plug * data%State%CHOOKE(2)%PlugMalf + ! integer: HydraulicChoke2PluggedPercent,HydraulicChoke2PluggedPercent_Old,PlugTimeCounter,ChokePlugTimeDelay + ! real: Present_HydraulicChoke2Plug,DeltaPlug2Percent + if ( (data%problems%ChokeProblems%HydraulicChoke2PluggedPercent - data%State%Choke%HydraulicChoke2PluggedPercent_Old) /= 0 ) then + data%State%Choke%DeltaPlug2Percent = (REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100.) - data%State%Choke%Present_HydraulicChoke2Plug + data%State%Choke%Plug2TimeCounter = 0 + endif + data%State%Choke%Plug2TimeCounter= data%State%Choke%Plug2TimeCounter + 1 + data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent + if (data%State%Choke%Plug2TimeCounter <= data%State%Choke%ChokePlugTimeDelay) then !ChokePlugTimeDelay=1800 + data%State%Choke%Present_HydraulicChoke2Plug = data%State%Choke%Present_HydraulicChoke2Plug + data%State%CHOOKE(2)%PlugMalf *((data%State%Choke%DeltaPlug2Percent / real(data%State%Choke%ChokePlugTimeDelay))) ! real(ChokePlugTimeDelay)= 1800.0 + endif + ENDIF + ! fully open area is 123/64 in^2 = 0.01334635 ft^2 + data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke+(data%State%CHOOKE(1)%WashoutMalf*data%State%Choke%HydraulicChoke1WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup + + !write(*,*) 'data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke=' ,data%State%CHOOKE(1)%WashoutMalf , data%State%CHOOKE(1)%AreaChoke + + data%State%CHOOKE(1)%AreaChoke=data%State%CHOOKE(1)%AreaChoke-(data%State%CHOOKE(1)%PlugMalf* data%State%Choke%Present_HydraulicChoke1Plug *data%State%CHOOKE(1)%AreaChoke) ! Initialised in Choke Startup + + data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke+(data%State%CHOOKE(2)%WashoutMalf*data%State%Choke%HydraulicChoke2WashoutCoef*data%State%Choke%ChokeAreaFullyOpen/144.0) ! Initialised in Choke Startup + data%State%CHOOKE(2)%AreaChoke=data%State%CHOOKE(2)%AreaChoke-(data%State%CHOOKE(2)%PlugMalf* data%State%Choke%Present_HydraulicChoke2Plug *data%State%CHOOKE(2)%AreaChoke) ! Initialised in Choke Startup + !write(*,*) 'data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke=' ,data%State%CHOOKE(2)%WashoutMalf , data%State%CHOOKE(2)%AreaChoke + + + data%State%CHOOKE(1)%AreaChokeFinal= data%State%CHOOKE(1)%AreaChoke + data%State%CHOOKE(2)%AreaChokeFinal= data%State%CHOOKE(2)%AreaChoke + + ! 144: ft^2 to in^2 + CALL SetHydraulicChock1(100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve + CALL SetHydraulicChock2(100 - nint((data%State%CHOOKE(2)%AreaChokeFinal/(data%State%Choke%ChokeAreaFullyOpen/144.))*100)) ! for manifold valve + + !write(*,*) 'data%State%CHOOKE(1)%PercentClose=' , data%State%CHOOKE(1)%PercentClose ! close percent 0 to 100 + !write(*,*) 'ChokePosition=' , ChokePosition ! close position 0 to 10 for display + !write(*,*) 'data%State%CHOOKE(1)%AreaChokeFinal=' , data%State%CHOOKE(1)%AreaChokeFinal ! Open Area (in^2) with clearance + !write(*,*) '(ChokeAreaFullyOpen/144.)=' , (ChokeAreaFullyOpen/144.) + !write(*,*) 'valve value=' , 100 - nint((data%State%CHOOKE(1)%AreaChokeFinal/(ChokeAreaFullyOpen/144.))*100) ! percent close 0 to 100 with clearance + !write(*,*) 'Valve(33)%Status=' , Valve(33)%Status ! T : open , F: close + ! =================== calculating Area + + !AreaChoke= data%State%CHOOKE(1)%AreaChoke !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< badan moteghayer 1 ya 2 shavad + + ! write(*,*) 'AreaChoke:',AreaChoke + + !=========================================================================== + ! MUD PUMP STROKES + ! & TOTAL STROKE- CHOKE CONTROL PANEL + !=========================================================================== + + !************************* IN MUD SYSTEM MODULE************************* + end subroutine CHOKE_MainBody2 + end module ChokeModule \ No newline at end of file diff --git a/Equipments/ChokeControl/CHOKE_VARIABLES.f90 b/Equipments/ChokeControl/CHOKE_VARIABLES.f90 index 82ff61a..3ab6b49 100644 --- a/Equipments/ChokeControl/CHOKE_VARIABLES.f90 +++ b/Equipments/ChokeControl/CHOKE_VARIABLES.f90 @@ -1,78 +1,78 @@ -MODULE CHOKEVARIABLES -!IMPLICIT DOUBLEPRECISION(A-H,O-Z) -! use CBopControlPanel -! use ConfigurationVariables -! use CEquipmentsConstants -! use CSimulationVariables -! use CAccumulatorVariables -! use CBopStackVariables -! use CChokeControlPanelVariables - ! use ConfigurationVariables - -IMPLICIT NONE - -!=========================================================================== -! CHOKE VARIABLES -!=========================================================================== -type::ChokeType - REAL Ycritical,Cp,Cv,CL,kRatio,nPolytripic,x1,SGliquid,WaterDensity,LiquidDensity,VL,VG1 - REAL epsilon_step,epsilon_abs,step_size,Ycritical_a,Ycritical_b,Ycritical_c - REAL G2,Cdrag,Pwh,MixDens2,Yratio_a,Yratio_b,Yratio_c,Yratio,Yratio_low,Yratio_high - REAL FlowRate,Patm,MassFlux,LiquidPPG,time2,AreaChoke - REAL eps_step,eps_abs,Yratiomat(100),Yrario_actual,Yrario - REAL :: DegreeOpen,GRAVITY1=9.81!,PercentClose - REAL ChokedMassFlux,ChokedFlowRate,PwhChoked - REAL TotalStrokes1,TotalStrokes2 - !INTEGER WashoutMalf,PlugMalf,failMalf - INTEGER GaugeChokePositionMailf,SoundChokePump - Real Cumulative_AirVolume_Choke - Real HydraulicChoke1WashoutCoef,HydraulicChoke2WashoutCoef - - Real Present_HydraulicChoke1Plug, Present_HydraulicChoke2Plug,DeltaPlug1Percent,DeltaPlug2Percent - Integer HydraulicChoke1PluggedPercent_Old,HydraulicChoke2PluggedPercent_Old,Plug1TimeCounter,Plug2TimeCounter,ChokePlugTimeDelay - Real ChokeAreaFullyOpen -end type ChokeType -!=========================================================================== -! AIR DRIVEN PUMP VARIABLES -!=========================================================================== -type::AirDrivenPumpType - REAL QAIR_PUMP,cc1,cc2,cc3,cc4,cc5 - INTEGER ChokeAirFail -end type AirDrivenPumpType - -! PARAMETER PI=3.141593 -!============================================================================ -! OIL & ENVIRONMENT VARIABLES -!============================================================================ -! REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000 -!specific gravity of liquid -!water density(kg/m^3) - - -!=========================================================================== -! AIR PUMP LINE COMPUTATIONAL VARIABLES -!=========================================================================== -!logical ChokeIsClosing,ChokeIsOpening -type::AirPumpLineType - REAL ChokeControlLeverOld - REAL P_AIRP,QITER,DELTAV_AIR,TIME,DeltaT_Choke,TOL_AIR - REAL diffp_air,losses_air,pipe_loss1air,minor_loss1air,static_loss1air - integer NO_PIPINGS_AIRPLINE,NO_MINORS_AIRPLINE - REAL,ALLOCATABLE:: Re_air(:),DIAM_AIR_MM(:),DIAM_AIR_INCH(:),AREA_AIR(:),REL_ROUGHAIR(:),LENGT_AIR(:),LF_AIR(:),CV_AIR(:),NOTE_AIR(:) - REAL,ALLOCATABLE:: fric_air(:),fricloss_air(:),minlosspa_air(:),minloss_air(:),MINORS_AIRPUMP(:,:) - REAL,ALLOCATABLE:: MINORDIAM_AIR_INCH(:),MINORAREA_AIR(:) - REAL,ALLOCATABLE:: ROUGHNESS_AIRPLINE(:),PIPINGS_AIRPUMP(:,:) - REAL Acylinder,CourseBase!,PassedCourse - REAL alpha_Qair,alpha_timeair,alpha_pairp,alpha_diffpair,alpha_lossesair,alpha_Pdownstrem,Pdownstrem -end type AirPumpLineType - -!================================================================================= - - TYPE, PUBLIC :: CHOKE_TypeVars - INTEGER WashoutMalf,PlugMalf,failMalf - REAL PercentClose,PassedCourse,AreaChoke,AreaChokeFinal - logical ChokeIsClosing,ChokeIsOpening - END TYPE CHOKE_TypeVars - - +MODULE CHOKEVARIABLES +!IMPLICIT DOUBLEPRECISION(A-H,O-Z) +! use CBopControlPanel +! use ConfigurationVariables +! use CEquipmentsConstants +! use CSimulationVariables +! use CAccumulatorVariables +! use CBopStackVariables +! use CChokeControlPanelVariables + ! use ConfigurationVariables + +IMPLICIT NONE + +!=========================================================================== +! CHOKE VARIABLES +!=========================================================================== +type::ChokeType + REAL Ycritical,Cp,Cv,CL,kRatio,nPolytripic,x1,SGliquid,WaterDensity,LiquidDensity,VL,VG1 + REAL epsilon_step,epsilon_abs,step_size,Ycritical_a,Ycritical_b,Ycritical_c + REAL G2,Cdrag,Pwh,MixDens2,Yratio_a,Yratio_b,Yratio_c,Yratio,Yratio_low,Yratio_high + REAL FlowRate,Patm,MassFlux,LiquidPPG,time2,AreaChoke + REAL eps_step,eps_abs,Yratiomat(100),Yrario_actual,Yrario + REAL :: DegreeOpen,GRAVITY1=9.81!,PercentClose + REAL ChokedMassFlux,ChokedFlowRate,PwhChoked + REAL TotalStrokes1,TotalStrokes2 + !INTEGER WashoutMalf,PlugMalf,failMalf + INTEGER GaugeChokePositionMailf,SoundChokePump + Real Cumulative_AirVolume_Choke + Real HydraulicChoke1WashoutCoef,HydraulicChoke2WashoutCoef + + Real Present_HydraulicChoke1Plug, Present_HydraulicChoke2Plug,DeltaPlug1Percent,DeltaPlug2Percent + Integer HydraulicChoke1PluggedPercent_Old,HydraulicChoke2PluggedPercent_Old,Plug1TimeCounter,Plug2TimeCounter,ChokePlugTimeDelay + Real ChokeAreaFullyOpen +end type ChokeType +!=========================================================================== +! AIR DRIVEN PUMP VARIABLES +!=========================================================================== +type::AirDrivenPumpType + REAL QAIR_PUMP,cc1,cc2,cc3,cc4,cc5 + INTEGER ChokeAirFail +end type AirDrivenPumpType + +! PARAMETER PI=3.141593 +!============================================================================ +! OIL & ENVIRONMENT VARIABLES +!============================================================================ +! REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000 +!specific gravity of liquid +!water density(kg/m^3) + + +!=========================================================================== +! AIR PUMP LINE COMPUTATIONAL VARIABLES +!=========================================================================== +!logical ChokeIsClosing,ChokeIsOpening +type::AirPumpLineType + REAL ChokeControlLeverOld + REAL P_AIRP,QITER,DELTAV_AIR,TIME,DeltaT_Choke,TOL_AIR + REAL diffp_air,losses_air,pipe_loss1air,minor_loss1air,static_loss1air + integer NO_PIPINGS_AIRPLINE,NO_MINORS_AIRPLINE + REAL,ALLOCATABLE:: Re_air(:),DIAM_AIR_MM(:),DIAM_AIR_INCH(:),AREA_AIR(:),REL_ROUGHAIR(:),LENGT_AIR(:),LF_AIR(:),CV_AIR(:),NOTE_AIR(:) + REAL,ALLOCATABLE:: fric_air(:),fricloss_air(:),minlosspa_air(:),minloss_air(:),MINORS_AIRPUMP(:,:) + REAL,ALLOCATABLE:: MINORDIAM_AIR_INCH(:),MINORAREA_AIR(:) + REAL,ALLOCATABLE:: ROUGHNESS_AIRPLINE(:),PIPINGS_AIRPUMP(:,:) + REAL Acylinder,CourseBase!,PassedCourse + REAL alpha_Qair,alpha_timeair,alpha_pairp,alpha_diffpair,alpha_lossesair,alpha_Pdownstrem,Pdownstrem +end type AirPumpLineType + +!================================================================================= + + TYPE, PUBLIC :: CHOKE_TypeVars + INTEGER WashoutMalf,PlugMalf,failMalf + REAL PercentClose,PassedCourse,AreaChoke,AreaChokeFinal + logical ChokeIsClosing,ChokeIsOpening + END TYPE CHOKE_TypeVars + + END MODULE \ No newline at end of file diff --git a/Equipments/ChokeControl/ChokeControlMain.f90 b/Equipments/ChokeControl/ChokeControlMain.f90 index 72a5736..6bd16b8 100644 --- a/Equipments/ChokeControl/ChokeControlMain.f90 +++ b/Equipments/ChokeControl/ChokeControlMain.f90 @@ -1,88 +1,88 @@ -module ChokeControlMain - USE CHOKEVARIABLES -use SimulationVariables !@ - implicit none - public - contains - - ! subroutine ChokeControl_Setup() - ! ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(ChokeControl_Init) - ! call OnSimulationStop%Add(ChokeControl_Init) - ! call OnChokeControlStep%Add(ChokeControl_Step) - ! call OnChokeControlOutput%Add(ChokeControl_Output) - ! call OnChokeControlMain%Add(ChokeControlMainBody) - ! end subroutine - - subroutine ChokeControl_Init - call Choke_StartUp - end subroutine ChokeControl_Init - - subroutine ChokeControl_Step - use ChokeModule - implicit none - INTEGER CHNUMBER - - IF(data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch== 1) THEN - data%EquipmentControl%ChokeControlPanel%Choke1LED=1 - data%EquipmentControl%ChokeControlPanel%Choke2LED=0 - CHNUMBER=1 - ELSE - data%EquipmentControl%ChokeControlPanel%Choke2LED=1 - data%EquipmentControl%ChokeControlPanel%Choke1LED=0 - CHNUMBER=2 - ENDIF - if(ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) then - if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then - data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. - data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. - endif - if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then - data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. - data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. - endif - data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) - call airpump_code_CHOKE(CHNUMBER) - else - call CHOKE_MainBody2() - endif - end subroutine ChokeControl_Step - - ! subroutine ChokeControl_Output - ! implicit none - ! end subroutine ChokeControl_Output - -! subroutine ChokeControlMainBody -! use CRigSizeVariables -! use CHOKE -! implicit none - -! CALL Choke_StartUp() -! loop1: DO -! CALL CHOKE_MainBody -! call sleepqq(100) -! !IF (IsStopped==.true.) THEN -! ! EXIT loop1 -! !ENDIF -! !write(*,*) '1111111111111' -! if(IsStopped) then -! !write(*,*) '22222222222222' - -! CALL DEALLOCATE_ARRAYS_CHOKE() -! !write(*,*) '333333333' - -! call Quit() -! end if - - - -! ENDDO loop1 - -! CLOSE(150) - -! !CALL DEALLOCATE_ARRAYS_CHOKE() - -! end subroutine ChokeControlMainBody - +module ChokeControlMain + USE CHOKEVARIABLES +use SimulationVariables !@ + implicit none + public + contains + + ! subroutine ChokeControl_Setup() + ! ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(ChokeControl_Init) + ! call OnSimulationStop%Add(ChokeControl_Init) + ! call OnChokeControlStep%Add(ChokeControl_Step) + ! call OnChokeControlOutput%Add(ChokeControl_Output) + ! call OnChokeControlMain%Add(ChokeControlMainBody) + ! end subroutine + + subroutine ChokeControl_Init + call Choke_StartUp + end subroutine ChokeControl_Init + + subroutine ChokeControl_Step + use ChokeModule + implicit none + INTEGER CHNUMBER + + IF(data%EquipmentControl%ChokeControlPanel%ChokeSelectorSwitch== 1) THEN + data%EquipmentControl%ChokeControlPanel%Choke1LED=1 + data%EquipmentControl%ChokeControlPanel%Choke2LED=0 + CHNUMBER=1 + ELSE + data%EquipmentControl%ChokeControlPanel%Choke2LED=1 + data%EquipmentControl%ChokeControlPanel%Choke1LED=0 + CHNUMBER=2 + ENDIF + if(ABS(data%EquipmentControl%ChokeControlPanel%ChokeControlLever)==1.0 .AND. data%EquipmentControl%ChokeControlPanel%ChokePanelRigAirSwitch == 1 .AND. data%State%CHOOKE(CHNUMBER)%FailMalf==0 .AND. data%State%AirDrivenPump%ChokeAirFail==0) then + if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == 1.0) then + data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .true. + data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .false. + endif + if (data%EquipmentControl%ChokeControlPanel%ChokeControlLever == -1.0) then + data%State%CHOOKE(CHNUMBER)%ChokeIsOpening = .true. + data%State%CHOOKE(CHNUMBER)%ChokeIsClosing = .false. + endif + data%State%AirPumpLine%TIME=data%State%AirPumpLine%TIME+data%State%AirPumpLine%DeltaT_Choke !overal time (s) + call airpump_code_CHOKE(CHNUMBER) + else + call CHOKE_MainBody2() + endif + end subroutine ChokeControl_Step + + ! subroutine ChokeControl_Output + ! implicit none + ! end subroutine ChokeControl_Output + +! subroutine ChokeControlMainBody +! use CRigSizeVariables +! use CHOKE +! implicit none + +! CALL Choke_StartUp() +! loop1: DO +! CALL CHOKE_MainBody +! call sleepqq(100) +! !IF (IsStopped==.true.) THEN +! ! EXIT loop1 +! !ENDIF +! !write(*,*) '1111111111111' +! if(IsStopped) then +! !write(*,*) '22222222222222' + +! CALL DEALLOCATE_ARRAYS_CHOKE() +! !write(*,*) '333333333' + +! call Quit() +! end if + + + +! ENDDO loop1 + +! CLOSE(150) + +! !CALL DEALLOCATE_ARRAYS_CHOKE() + +! end subroutine ChokeControlMainBody + end module ChokeControlMain \ No newline at end of file diff --git a/Equipments/ChokeControl/ChokeStartup.f90 b/Equipments/ChokeControl/ChokeStartup.f90 index 485fa45..d0cb17a 100644 --- a/Equipments/ChokeControl/ChokeStartup.f90 +++ b/Equipments/ChokeControl/ChokeStartup.f90 @@ -1,127 +1,127 @@ - SUBROUTINE Choke_StartUp() - - USE CHOKEVARIABLES -use SimulationVariables !@ - USE CChokeProblemsVariables - implicit none - - CALL LOSS_INPUTS_CHOKE() - - !OPEN(150,FILE='CHOKE_AIRPUMP_OUTPUTS.DAT') - - - !data%State%CHOOKE(1)%WashoutMalf=1 - !data%State%CHOOKE(1)%PlugMalf=0 - !data%State%CHOOKE(1)%FailMalf=0 - ! - !data%State%CHOOKE(2)%WashoutMalf=1 - !data%State%CHOOKE(2)%PlugMalf=0 - !data%State%CHOOKE(2)%FailMalf=0 - ! - ! - !ChokeAirFail=0 - ! - !GaugeChokePositionMailf=0 - - - - - - - - data%State%Choke%kRatio=1.4 -data%State%Choke%Cp=0.24 -data%State%Choke%CL=0.8 - -data%State%Choke%x1=0.5 - -data%State%Choke%LiquidPPG=9. -data%State%Choke%LiquidDensity=data%State%Choke%LiquidPPG*7.48 !lbm/ft**3 - -data%State%Choke%VL=1.0/data%State%Choke%LiquidDensity !SpecificVolume of Liquid - -data%State%Choke%Cv=data%State%Choke%Cp/data%State%Choke%kRatio - -data%State%Choke%nPolytripic=1+(data%State%Choke%x1*(data%State%Choke%Cp-data%State%Choke%Cv)/(data%State%Choke%x1*data%State%Choke%Cv+(1-data%State%Choke%x1)*data%State%Choke%CL)) - -data%State%Choke%VG1=1./0.748 !lbm/ft**3 Specific Volume of Air, Upstream - -data%State%Choke%Cdrag=0.8 -data%State%Choke%Pwh=1400. !psi - - -data%State%Choke%Patm=14.7 -data%State%Choke%MixDens2=data%State%Choke%x1*data%State%Choke%VG1 !lbm/ft**3 - - - -data%State%Choke%epsilon_abs= 1e-5 -data%State%Choke%epsilon_step= 1e-5 - - -!ChokeDiameter= 32/64. !in - -data%State%CHOOKE%PercentClose= 0.0 - !AreaChoke=0.01334635 - - ! data%State%CHOOKE(1)%AreaChoke=0.01334635 -!ChokeAreaFullyOpen = 123.d0 / 64.d0 ! fully open area is 123/64 in^2 = 0.01334635 ft^2 - -data%State%AirPumpLine%DeltaT_Choke=0.1 -!TotalStrokes1=0. -!TotalStrokes2=0. - -data%State%Choke%HydraulicChoke1WashoutCoef= 0.0 -data%State%Choke%HydraulicChoke2WashoutCoef= 0.0 - - - -data%State%Choke%ChokePlugTimeDelay = int(180./data%State%AirPumpLine%DeltaT_Choke) ! =1800 = 180/0.1 : for 3 min delay - -data%State%Choke%Present_HydraulicChoke1Plug = REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100. -data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent -data%State%Choke%Plug1TimeCounter= 0 -data%State%Choke%DeltaPlug1Percent = 0.0 - -data%State%Choke%Present_HydraulicChoke2Plug = REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100. -data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent -data%State%Choke%Plug2TimeCounter= 0 -data%State%Choke%DeltaPlug2Percent = 0.0 - - - - - - -!======================AIRPUMP INPUTS(CONSTANTS)=========================== - data%State%AirPumpLine%CourseBase= 24. !cm - data%State%CHOOKE%PassedCourse= 0. - data%EquipmentControl%ChokeControlPanel%ChokePosition=0. - - data%State%AirPumpLine%Acylinder= PI*(8.**2)/4. ! (CM^2), 8=DIAMETER, 24=course , 3785.412: cm^3 to galon - - - data%State%CHOOKE%ChokeIsOpening = .false. - data%State%CHOOKE%ChokeIsClosing = .false. - - - data%State%AirPumpLine%P_AIRP=0 - - data%State%AirDrivenPump%cc1 = 0.1354; data%State%AirDrivenPump%cc2 = -2.066; data%State%AirDrivenPump%cc3 = -21.09; data%State%AirDrivenPump%cc4 = -51.36; data%State%AirDrivenPump%cc5 = 5935 ! FOR OUTPUT IN GPM - ! cc1 = 4.754e-07; cc2 = -0.0001676; cc3 = -0.03953; cc4 = -2.223; cc5 = 5935 FOR OUTPUT IN IN^3/MIN - - -data%State%AirPumpLine%Pdownstrem= 4950 !+0.01*Pchoke (psi) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -data%State%AirPumpLine%QITER=5. !(gpm) - -! Q=0.0003585; true -data%State%AirPumpLine%TIME=0 -data%State%AirPumpLine%TOL_AIR=0.05 - -data%State%AirPumpLine%alpha_Qair=0 -data%State%AirPumpLine%alpha_timeair=0 -data%State%AirPumpLine%alpha_Pdownstrem=data%State%AirPumpLine%Pdownstrem -data%State%AirPumpLine%alpha_diffpair=0 -data%State%AirPumpLine%alpha_lossesair=0 - + SUBROUTINE Choke_StartUp() + + USE CHOKEVARIABLES +use SimulationVariables !@ + USE CChokeProblemsVariables + implicit none + + CALL LOSS_INPUTS_CHOKE() + + !OPEN(150,FILE='CHOKE_AIRPUMP_OUTPUTS.DAT') + + + !data%State%CHOOKE(1)%WashoutMalf=1 + !data%State%CHOOKE(1)%PlugMalf=0 + !data%State%CHOOKE(1)%FailMalf=0 + ! + !data%State%CHOOKE(2)%WashoutMalf=1 + !data%State%CHOOKE(2)%PlugMalf=0 + !data%State%CHOOKE(2)%FailMalf=0 + ! + ! + !ChokeAirFail=0 + ! + !GaugeChokePositionMailf=0 + + + + + + + + data%State%Choke%kRatio=1.4 +data%State%Choke%Cp=0.24 +data%State%Choke%CL=0.8 + +data%State%Choke%x1=0.5 + +data%State%Choke%LiquidPPG=9. +data%State%Choke%LiquidDensity=data%State%Choke%LiquidPPG*7.48 !lbm/ft**3 + +data%State%Choke%VL=1.0/data%State%Choke%LiquidDensity !SpecificVolume of Liquid + +data%State%Choke%Cv=data%State%Choke%Cp/data%State%Choke%kRatio + +data%State%Choke%nPolytripic=1+(data%State%Choke%x1*(data%State%Choke%Cp-data%State%Choke%Cv)/(data%State%Choke%x1*data%State%Choke%Cv+(1-data%State%Choke%x1)*data%State%Choke%CL)) + +data%State%Choke%VG1=1./0.748 !lbm/ft**3 Specific Volume of Air, Upstream + +data%State%Choke%Cdrag=0.8 +data%State%Choke%Pwh=1400. !psi + + +data%State%Choke%Patm=14.7 +data%State%Choke%MixDens2=data%State%Choke%x1*data%State%Choke%VG1 !lbm/ft**3 + + + +data%State%Choke%epsilon_abs= 1e-5 +data%State%Choke%epsilon_step= 1e-5 + + +!ChokeDiameter= 32/64. !in + +data%State%CHOOKE%PercentClose= 0.0 + !AreaChoke=0.01334635 + + ! data%State%CHOOKE(1)%AreaChoke=0.01334635 +!ChokeAreaFullyOpen = 123.d0 / 64.d0 ! fully open area is 123/64 in^2 = 0.01334635 ft^2 + +data%State%AirPumpLine%DeltaT_Choke=0.1 +!TotalStrokes1=0. +!TotalStrokes2=0. + +data%State%Choke%HydraulicChoke1WashoutCoef= 0.0 +data%State%Choke%HydraulicChoke2WashoutCoef= 0.0 + + + +data%State%Choke%ChokePlugTimeDelay = int(180./data%State%AirPumpLine%DeltaT_Choke) ! =1800 = 180/0.1 : for 3 min delay + +data%State%Choke%Present_HydraulicChoke1Plug = REAL(data%problems%ChokeProblems%HydraulicChoke1PluggedPercent)/100. +data%State%Choke%HydraulicChoke1PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke1PluggedPercent +data%State%Choke%Plug1TimeCounter= 0 +data%State%Choke%DeltaPlug1Percent = 0.0 + +data%State%Choke%Present_HydraulicChoke2Plug = REAL(data%problems%ChokeProblems%HydraulicChoke2PluggedPercent)/100. +data%State%Choke%HydraulicChoke2PluggedPercent_Old= data%problems%ChokeProblems%HydraulicChoke2PluggedPercent +data%State%Choke%Plug2TimeCounter= 0 +data%State%Choke%DeltaPlug2Percent = 0.0 + + + + + + +!======================AIRPUMP INPUTS(CONSTANTS)=========================== + data%State%AirPumpLine%CourseBase= 24. !cm + data%State%CHOOKE%PassedCourse= 0. + data%EquipmentControl%ChokeControlPanel%ChokePosition=0. + + data%State%AirPumpLine%Acylinder= PI*(8.**2)/4. ! (CM^2), 8=DIAMETER, 24=course , 3785.412: cm^3 to galon + + + data%State%CHOOKE%ChokeIsOpening = .false. + data%State%CHOOKE%ChokeIsClosing = .false. + + + data%State%AirPumpLine%P_AIRP=0 + + data%State%AirDrivenPump%cc1 = 0.1354; data%State%AirDrivenPump%cc2 = -2.066; data%State%AirDrivenPump%cc3 = -21.09; data%State%AirDrivenPump%cc4 = -51.36; data%State%AirDrivenPump%cc5 = 5935 ! FOR OUTPUT IN GPM + ! cc1 = 4.754e-07; cc2 = -0.0001676; cc3 = -0.03953; cc4 = -2.223; cc5 = 5935 FOR OUTPUT IN IN^3/MIN + + +data%State%AirPumpLine%Pdownstrem= 4950 !+0.01*Pchoke (psi) <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< +data%State%AirPumpLine%QITER=5. !(gpm) + +! Q=0.0003585; true +data%State%AirPumpLine%TIME=0 +data%State%AirPumpLine%TOL_AIR=0.05 + +data%State%AirPumpLine%alpha_Qair=0 +data%State%AirPumpLine%alpha_timeair=0 +data%State%AirPumpLine%alpha_Pdownstrem=data%State%AirPumpLine%Pdownstrem +data%State%AirPumpLine%alpha_diffpair=0 +data%State%AirPumpLine%alpha_lossesair=0 + end \ No newline at end of file diff --git a/Equipments/Drawworks/DWFixModeMotion.f90 b/Equipments/Drawworks/DWFixModeMotion.f90 index 83b8328..ee02045 100644 --- a/Equipments/Drawworks/DWFixModeMotion.f90 +++ b/Equipments/Drawworks/DWFixModeMotion.f90 @@ -1,18 +1,18 @@ -subroutine DWFixModeMotion - - use SimulationVariables !@ - - IMPLICIT NONE - - - - data%State%Drawworks%Hook_Height_final = data%State%Drawworks%Hook_Height_final ![ft] - data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height_final/3.280839895d0 ![m] - data%State%Drawworks%w_drum = 0.d0 - data%State%Drawworks%w_old_drum = 0.d0 - data%State%Drawworks%motion = 0 - - - - +subroutine DWFixModeMotion + + use SimulationVariables !@ + + IMPLICIT NONE + + + + data%State%Drawworks%Hook_Height_final = data%State%Drawworks%Hook_Height_final ![ft] + data%State%Drawworks%Hook_Height = data%State%Drawworks%Hook_Height_final/3.280839895d0 ![m] + data%State%Drawworks%w_drum = 0.d0 + data%State%Drawworks%w_old_drum = 0.d0 + data%State%Drawworks%motion = 0 + + + + End subroutine \ No newline at end of file diff --git a/Equipments/Drawworks/DWMalfunction_MotorFailure.f90 b/Equipments/Drawworks/DWMalfunction_MotorFailure.f90 index 8e62dc0..914ef39 100644 --- a/Equipments/Drawworks/DWMalfunction_MotorFailure.f90 +++ b/Equipments/Drawworks/DWMalfunction_MotorFailure.f90 @@ -1,24 +1,24 @@ -subroutine DWMalfunction_MotorFailure - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use CDataDisplayConsole - use SimulationVariables - use CHoistingVariables - use SimulationVariables - use SimulationVariables !@ - - IMPLICIT NONE - - - - - if (data%State%Drawworks%MotorFaileMalf==1) then - data%State%Drawworks%Conv_Ratio = 1.0D0 - end if - - - - +subroutine DWMalfunction_MotorFailure + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CDataDisplayConsole + use SimulationVariables + use CHoistingVariables + use SimulationVariables + use SimulationVariables !@ + + IMPLICIT NONE + + + + + if (data%State%Drawworks%MotorFaileMalf==1) then + data%State%Drawworks%Conv_Ratio = 1.0D0 + end if + + + + END subroutine \ No newline at end of file diff --git a/Equipments/Drawworks/DrawworksMain.f90 b/Equipments/Drawworks/DrawworksMain.f90 index e7f8703..12fe64e 100644 --- a/Equipments/Drawworks/DrawworksMain.f90 +++ b/Equipments/Drawworks/DrawworksMain.f90 @@ -1,32 +1,32 @@ -module DrawworksMain - implicit none - public - contains - - ! subroutine Drawworks_Setup() - ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(Drawworks_Init) - ! call OnSimulationStop%Add(Drawworks_Init) - ! call OnDrawworksStep%Add(Drawworks_Step) - ! call OnDrawworksOutput%Add(Drawworks_Output) - ! call OnDrawworksMain%Add(DrawworksMainBody) - ! end subroutine - - subroutine Drawworks_Init - call Drawworks_StartUp - end subroutine Drawworks_Init - - subroutine Drawworks_Step - call Drawworks_MainSolver - end subroutine Drawworks_Step - - subroutine DrawworksMainBody - use SimulationVariables !@ - implicit none - Call Drawworks_StartUp - loopdrawsim : do - Call Drawworks_MainSolver - end do loopdrawsim - end subroutine DrawworksMainBody +module DrawworksMain + implicit none + public + contains + + ! subroutine Drawworks_Setup() + ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(Drawworks_Init) + ! call OnSimulationStop%Add(Drawworks_Init) + ! call OnDrawworksStep%Add(Drawworks_Step) + ! call OnDrawworksOutput%Add(Drawworks_Output) + ! call OnDrawworksMain%Add(DrawworksMainBody) + ! end subroutine + + subroutine Drawworks_Init + call Drawworks_StartUp + end subroutine Drawworks_Init + + subroutine Drawworks_Step + call Drawworks_MainSolver + end subroutine Drawworks_Step + + subroutine DrawworksMainBody + use SimulationVariables !@ + implicit none + Call Drawworks_StartUp + loopdrawsim : do + Call Drawworks_MainSolver + end do loopdrawsim + end subroutine DrawworksMainBody end module DrawworksMain \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_Direction.f90 b/Equipments/Drawworks/Drawworks_Direction.f90 index 01a0aa9..d904b44 100644 --- a/Equipments/Drawworks/Drawworks_Direction.f90 +++ b/Equipments/Drawworks/Drawworks_Direction.f90 @@ -1,152 +1,152 @@ -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 - - - +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 \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_INPUTS.f90 b/Equipments/Drawworks/Drawworks_INPUTS.f90 index 4f3bce8..ea1fd03 100644 --- a/Equipments/Drawworks/Drawworks_INPUTS.f90 +++ b/Equipments/Drawworks/Drawworks_INPUTS.f90 @@ -1,209 +1,209 @@ -subroutine Drawworks_Inputs - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - ! Use CSimulationVariables - use OperationScenariosModule - use CWarnings - use SimulationVariables - use SimulationVariables !@ - Use TD_StringConnectionData - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - - IMPLICIT NONE - - - - data%State%Drawworks%AssignmentSwitch = data%EquipmentControl%DrillingConsole%AssignmentSwitch - data%State%Drawworks%Switch = data%EquipmentControl%DrillingConsole%DWSwitch - data%State%Drawworks%Throttle = data%EquipmentControl%DrillingConsole%DWThrottle ![RPM] - data%State%Drawworks%DriveType = data%State%Hoisting%DriveType - data%State%Drawworks%ShearBopSituation = data%State%RamLine%ShearBop_Situation_forTD - !data%State%Drawworks%MotorFaileMalf = ?????? motaghayere voroudi !dar CHoistingProblemsVariables meghdardehi mishavad - - - - !>>> RAM & ToolJoint Collision - data%State%Drawworks%TDBOPElementNo = data%State%TD_BOP%BOPElementNo - data%State%Drawworks%TDBOPHeight = data%State%TD_BOP%BOPHeight - data%State%Drawworks%TDBOPRamDiam = data%State%TD_BOP%BOPRamDiam - data%State%Drawworks%TDBOPThickness = data%State%TD_BOP%BOPThickness - data%State%Drawworks%TDDrillStemBottom = data%State%TD_String%DrillStemBottom - data%State%Drawworks%TDWellTotalLength = data%State%TD_WellGeneral%WellTotalLength - data%State%Drawworks%TDDlMax = data%State%TD_String%DlMax - data%State%Drawworks%TDDrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs - if (Allocated(data%State%Drawworks%TDDrillStemsDownDepth)) deAllocate (data%State%Drawworks%TDDrillStemsDownDepth) ! inja gozashtameshun cho momkene tuye startup tedade elemanha dir berese va error bede - Allocate (data%State%Drawworks%TDDrillStemsDownDepth(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components - data%State%Drawworks%TDDrillStemsDownDepth = data%State%TD_DrillStems%DownDepth - if (Allocated(data%State%Drawworks%TDDrillStemsToolJointRange)) deAllocate (data%State%Drawworks%TDDrillStemsToolJointRange) - Allocate (data%State%Drawworks%TDDrillStemsToolJointRange(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components - data%State%Drawworks%TDDrillStemsToolJointRange = data%State%TD_DrillStems%ToolJointRange - if (Allocated(data%State%Drawworks%TDDrillStemsTopDepth)) deAllocate (data%State%Drawworks%TDDrillStemsTopDepth) - Allocate (data%State%Drawworks%TDDrillStemsTopDepth(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components - data%State%Drawworks%TDDrillStemsTopDepth = data%State%TD_DrillStems%TopDepth - if (Allocated(data%State%Drawworks%TDDrillStemsRtoolJoint)) deAllocate (data%State%Drawworks%TDDrillStemsRtoolJoint) - Allocate (data%State%Drawworks%TDDrillStemsRtoolJoint(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components - data%State%Drawworks%TDDrillStemsRtoolJoint = data%State%TD_DrillStems%RtoolJoint - - - - !>>> Warnings - data%State%Drawworks%CrownCollision = data%Warnings%CrownCollision - data%State%Drawworks%FloorCollision = data%Warnings%FloorCollision - - - - data%State%Drawworks%Conv_Ratio = 1.0d0/.380d0 !che meghdari bashad?????????????????? !data%State%Drawworks%FWD_Conv_Ratio(data%State%Drawworks%ClutchMode,data%State%Drawworks%TransMode) - - - - data%EquipmentControl%DrillingConsole%ParkingBrakeLed = 0 - - - - !===> min&max Hook Height - if ( data%State%Drawworks%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL ) then - if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection()==KELLY_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 1 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HKL-data%State%OperationScenario%RE ![ft] HKL=63.76=Kelly Ass. Height , RE=Release - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection()==KELLY_CONNECTION_SINGLE ) then - data%State%Drawworks%DrillModeCond = 2 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HKL+data%State%OperationScenario%PL-data%State%OperationScenario%RE ![ft] PL=30=Pipe Lenght - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection() == KELLY_CONNECTION_STRING ) then - data%State%Drawworks%DrillModeCond = 3 - data%State%Drawworks%min_Hook_Height = 21.44d0-data%State%OperationScenario%RE ![ft] ?????????? check 21.44=(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_KellyConnection()==KELLY_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 4 - data%State%Drawworks%min_Hook_Height = 66.d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_KellyConnection()==KELLY_CONNECTION_SINGLE ) then - data%State%Drawworks%DrillModeCond = 5 - data%State%Drawworks%min_Hook_Height = 65.1d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - else if ( Get_Swing()==SWING_RAT_HOLE_END ) then - data%State%Drawworks%DrillModeCond = 6 - data%State%Drawworks%min_Hook_Height = 66.d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] - end if - else if ( data%State%Drawworks%DriveType==1 .and. Get_OperationCondition()==OPERATION_TRIP ) then - if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 7 - data%State%Drawworks%min_Hook_Height = 18.38d0 ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND ) then - data%State%Drawworks%DrillModeCond = 8 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HL+data%State%OperationScenario%SL-(3.d0*data%State%OperationScenario%RE) ![ft] HL=17.81=Hook Assy , SL=90=Stand Length , 3: chon meghdari az toole loole(tool joint) dakhele elevator gharar migirad - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then - data%State%Drawworks%DrillModeCond = 9 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HL+data%State%OperationScenario%PL-(3.d0*data%State%OperationScenario%RE) ![ft] 3: chon meghdari az toole loole(tool joint) balaye elevator mimanad - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING ) then - data%State%Drawworks%DrillModeCond = 10 - data%State%Drawworks%min_Hook_Height = 18.5d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 11 - data%State%Drawworks%min_Hook_Height = 19.38d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then - data%State%Drawworks%DrillModeCond = 12 - data%State%Drawworks%min_Hook_Height = 17.73d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_RAT_HOLE_END ) then - data%State%Drawworks%DrillModeCond = 13 - data%State%Drawworks%min_Hook_Height = 27.41d0-data%State%OperationScenario%RE ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING ) then - data%State%Drawworks%DrillModeCond = 14 - data%State%Drawworks%min_Hook_Height = 18.38d0 ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then - data%State%Drawworks%DrillModeCond = 25 !warning & collision - data%State%Drawworks%min_Hook_Height = 18.38d0 !????????????????? ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then - data%State%Drawworks%DrillModeCond = 26 - data%State%Drawworks%min_Hook_Height = 10.38d0 !????????????????? ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_STAND ) then - data%State%Drawworks%DrillModeCond = 27 - data%State%Drawworks%min_Hook_Height = 18.38d0 !????????????????? ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - end if - else if ( data%State%Drawworks%DriveType==0 ) then - if ( Get_TdsSwing()==TDS_SWING_TILT_END ) then - if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then - data%State%Drawworks%DrillModeCond = 15 - data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then - data%State%Drawworks%DrillModeCond = 16 - data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 17 - data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - end if - else if ( Get_TdsSwing()==TDS_SWING_OFF_END ) then - if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then - data%State%Drawworks%DrillModeCond = 18 - data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then - data%State%Drawworks%DrillModeCond = 19 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 20 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 21 - data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then - data%State%Drawworks%DrillModeCond = 22 - data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then - data%State%Drawworks%DrillModeCond = 23 - data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%Drawworks%DrillModeCond = 24 - data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] - data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] - end if - end if - end if - - - - !===> 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 - - - - +subroutine Drawworks_Inputs + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + ! Use CSimulationVariables + use OperationScenariosModule + use CWarnings + use SimulationVariables + use SimulationVariables !@ + Use TD_StringConnectionData + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + + IMPLICIT NONE + + + + data%State%Drawworks%AssignmentSwitch = data%EquipmentControl%DrillingConsole%AssignmentSwitch + data%State%Drawworks%Switch = data%EquipmentControl%DrillingConsole%DWSwitch + data%State%Drawworks%Throttle = data%EquipmentControl%DrillingConsole%DWThrottle ![RPM] + data%State%Drawworks%DriveType = data%Configuration%Hoisting%DriveType + data%State%Drawworks%ShearBopSituation = data%State%RamLine%ShearBop_Situation_forTD + !data%State%Drawworks%MotorFaileMalf = ?????? motaghayere voroudi !dar CHoistingProblemsVariables meghdardehi mishavad + + + + !>>> RAM & ToolJoint Collision + data%State%Drawworks%TDBOPElementNo = data%State%TD_BOP%BOPElementNo + data%State%Drawworks%TDBOPHeight = data%State%TD_BOP%BOPHeight + data%State%Drawworks%TDBOPRamDiam = data%State%TD_BOP%BOPRamDiam + data%State%Drawworks%TDBOPThickness = data%State%TD_BOP%BOPThickness + data%State%Drawworks%TDDrillStemBottom = data%State%TD_String%DrillStemBottom + data%State%Drawworks%TDWellTotalLength = data%State%TD_WellGeneral%WellTotalLength + data%State%Drawworks%TDDlMax = data%State%TD_String%DlMax + data%State%Drawworks%TDDrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs + if (Allocated(data%State%Drawworks%TDDrillStemsDownDepth)) deAllocate (data%State%Drawworks%TDDrillStemsDownDepth) ! inja gozashtameshun cho momkene tuye startup tedade elemanha dir berese va error bede + Allocate (data%State%Drawworks%TDDrillStemsDownDepth(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components + data%State%Drawworks%TDDrillStemsDownDepth = data%State%TD_DrillStems%DownDepth + if (Allocated(data%State%Drawworks%TDDrillStemsToolJointRange)) deAllocate (data%State%Drawworks%TDDrillStemsToolJointRange) + Allocate (data%State%Drawworks%TDDrillStemsToolJointRange(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components + data%State%Drawworks%TDDrillStemsToolJointRange = data%State%TD_DrillStems%ToolJointRange + if (Allocated(data%State%Drawworks%TDDrillStemsTopDepth)) deAllocate (data%State%Drawworks%TDDrillStemsTopDepth) + Allocate (data%State%Drawworks%TDDrillStemsTopDepth(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components + data%State%Drawworks%TDDrillStemsTopDepth = data%State%TD_DrillStems%TopDepth + if (Allocated(data%State%Drawworks%TDDrillStemsRtoolJoint)) deAllocate (data%State%Drawworks%TDDrillStemsRtoolJoint) + Allocate (data%State%Drawworks%TDDrillStemsRtoolJoint(data%State%Drawworks%TDDrillStemComponentsNumbs+400)) ! +400: because of: Add or Remove DrillStem Components + data%State%Drawworks%TDDrillStemsRtoolJoint = data%State%TD_DrillStems%RtoolJoint + + + + !>>> Warnings + data%State%Drawworks%CrownCollision = data%Warnings%CrownCollision + data%State%Drawworks%FloorCollision = data%Warnings%FloorCollision + + + + data%State%Drawworks%Conv_Ratio = 1.0d0/.380d0 !che meghdari bashad?????????????????? !data%State%Drawworks%FWD_Conv_Ratio(data%State%Drawworks%ClutchMode,data%State%Drawworks%TransMode) + + + + data%EquipmentControl%DrillingConsole%ParkingBrakeLed = 0 + + + + !===> min&max Hook Height + if ( data%State%Drawworks%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL ) then + if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection()==KELLY_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 1 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HKL-data%State%OperationScenario%RE ![ft] HKL=63.76=Kelly Ass. Height , RE=Release + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection()==KELLY_CONNECTION_SINGLE ) then + data%State%Drawworks%DrillModeCond = 2 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HKL+data%State%OperationScenario%PL-data%State%OperationScenario%RE ![ft] PL=30=Pipe Lenght + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_KellyConnection() == KELLY_CONNECTION_STRING ) then + data%State%Drawworks%DrillModeCond = 3 + data%State%Drawworks%min_Hook_Height = 21.44d0-data%State%OperationScenario%RE ![ft] ?????????? check 21.44=(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_KellyConnection()==KELLY_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 4 + data%State%Drawworks%min_Hook_Height = 66.d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_KellyConnection()==KELLY_CONNECTION_SINGLE ) then + data%State%Drawworks%DrillModeCond = 5 + data%State%Drawworks%min_Hook_Height = 65.1d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + else if ( Get_Swing()==SWING_RAT_HOLE_END ) then + data%State%Drawworks%DrillModeCond = 6 + data%State%Drawworks%min_Hook_Height = 66.d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 120.d0 ![ft] + end if + else if ( data%State%Drawworks%DriveType==1 .and. Get_OperationCondition()==OPERATION_TRIP ) then + if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 7 + data%State%Drawworks%min_Hook_Height = 18.38d0 ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND ) then + data%State%Drawworks%DrillModeCond = 8 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HL+data%State%OperationScenario%SL-(3.d0*data%State%OperationScenario%RE) ![ft] HL=17.81=Hook Assy , SL=90=Stand Length , 3: chon meghdari az toole loole(tool joint) dakhele elevator gharar migirad + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then + data%State%Drawworks%DrillModeCond = 9 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight+data%State%OperationScenario%HL+data%State%OperationScenario%PL-(3.d0*data%State%OperationScenario%RE) ![ft] 3: chon meghdari az toole loole(tool joint) balaye elevator mimanad + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING ) then + data%State%Drawworks%DrillModeCond = 10 + data%State%Drawworks%min_Hook_Height = 18.5d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 11 + data%State%Drawworks%min_Hook_Height = 19.38d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then + data%State%Drawworks%DrillModeCond = 12 + data%State%Drawworks%min_Hook_Height = 17.73d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_RAT_HOLE_END ) then + data%State%Drawworks%DrillModeCond = 13 + data%State%Drawworks%min_Hook_Height = 27.41d0-data%State%OperationScenario%RE ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_STRING ) then + data%State%Drawworks%DrillModeCond = 14 + data%State%Drawworks%min_Hook_Height = 18.38d0 ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then + data%State%Drawworks%DrillModeCond = 25 !warning & collision + data%State%Drawworks%min_Hook_Height = 18.38d0 !????????????????? ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_MOUSE_HOLE_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then + data%State%Drawworks%DrillModeCond = 26 + data%State%Drawworks%min_Hook_Height = 10.38d0 !????????????????? ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_Swing()==SWING_WELL_END .and. Get_ElevatorConnection() == ELEVATOR_LATCH_STAND ) then + data%State%Drawworks%DrillModeCond = 27 + data%State%Drawworks%min_Hook_Height = 18.38d0 !????????????????? ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + end if + else if ( data%State%Drawworks%DriveType==0 ) then + if ( Get_TdsSwing()==TDS_SWING_TILT_END ) then + if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then + data%State%Drawworks%DrillModeCond = 15 + data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then + data%State%Drawworks%DrillModeCond = 16 + data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 17 + data%State%Drawworks%min_Hook_Height = 15.0d0 ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + end if + else if ( Get_TdsSwing()==TDS_SWING_OFF_END ) then + if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then + data%State%Drawworks%DrillModeCond = 18 + data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then + data%State%Drawworks%DrillModeCond = 19 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 20 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 21 + data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then + data%State%Drawworks%DrillModeCond = 22 + data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then + data%State%Drawworks%DrillModeCond = 23 + data%State%Drawworks%min_Hook_Height = max(16.0d0,data%State%TD_String%TopJointHeight) ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%Drawworks%DrillModeCond = 24 + data%State%Drawworks%min_Hook_Height = data%State%TD_String%TopJointHeight ![ft] + data%State%Drawworks%max_Hook_Height = 140.d0 ![ft] + end if + end if + end if + + + + !===> 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 + + + + end subroutine Drawworks_Inputs \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_MainSolver.f90 b/Equipments/Drawworks/Drawworks_MainSolver.f90 index 87d0fdc..76f6239 100644 --- a/Equipments/Drawworks/Drawworks_MainSolver.f90 +++ b/Equipments/Drawworks/Drawworks_MainSolver.f90 @@ -1,62 +1,62 @@ -subroutine Drawworks_MainSolver - - use SimulationVariables !@ - - IMPLICIT NONE - - - - Call Drawworks_Inputs - - if (data%State%Drawworks%Throttle<=0.d0) then - data%State%Drawworks%K_Throttle = 1 - end if - - - if((any(data%State%Drawworks%AssignmentSwitch==(/1,2,3,4,5,7,8,9,10,11/))) .and. (data%State%Drawworks%Switch==-1 .or. data%State%Drawworks%Switch==1) .and. (data%State%Drawworks%CrownCollision==.false. .and. data%State%Drawworks%FloorCollision==.false.) .and. (data%State%Drawworks%K_Throttle==1)) then - - data%State%Drawworks%SoundBlower = .true. - data%State%Drawworks%BLWR = 1 - - Call Drawworks_Solver - - if ( data%State%Drawworks%motion==+1 ) then - data%State%Drawworks%SoundRev = 0 ![rpm or rad/s????????????????] , Integer - data%State%Drawworks%SoundFw = INT(data%State%Drawworks%w_drum) ![rpm] , Integer - else - data%State%Drawworks%SoundFw = 0 ![rpm] , Integer - data%State%Drawworks%SoundRev = INT(data%State%Drawworks%w_drum) ![rpm] , Integer - end if - - else - - if((any(data%State%Drawworks%AssignmentSwitch==(/1,2,3,4,5,7,8,9,10,11/))) .and. (data%State%Drawworks%Switch==-1 .or. data%State%Drawworks%Switch==1)) then - data%State%Drawworks%SoundBlower = .true. - data%State%Drawworks%BLWR = 1 - else - data%State%Drawworks%SoundBlower = .false. - data%State%Drawworks%BLWR = 0 - end if - - Call Drawworks_Solver_OffMode - - if ( data%State%Drawworks%motion==+1 ) then - data%State%Drawworks%SoundRev = 0 ![rpm] , Integer - data%State%Drawworks%SoundFw = INT(data%State%Drawworks%w_drum) ![rpm] , Integer - else - data%State%Drawworks%SoundFw = 0 ![rpm] , Integer - data%State%Drawworks%SoundRev = INT(data%State%Drawworks%w_drum) ![rpm] , Integer - end if - - data%State%Drawworks%K_Throttle = 0 - - end if - - - Call Drawworks_Outputs - - data%State%Drawworks%N_old = data%State%Drawworks%Speed - - - +subroutine Drawworks_MainSolver + + use SimulationVariables !@ + + IMPLICIT NONE + + + + Call Drawworks_Inputs + + if (data%State%Drawworks%Throttle<=0.d0) then + data%State%Drawworks%K_Throttle = 1 + end if + + + if((any(data%State%Drawworks%AssignmentSwitch==(/1,2,3,4,5,7,8,9,10,11/))) .and. (data%State%Drawworks%Switch==-1 .or. data%State%Drawworks%Switch==1) .and. (data%State%Drawworks%CrownCollision==.false. .and. data%State%Drawworks%FloorCollision==.false.) .and. (data%State%Drawworks%K_Throttle==1)) then + + data%State%Drawworks%SoundBlower = .true. + data%State%Drawworks%BLWR = 1 + + Call Drawworks_Solver + + if ( data%State%Drawworks%motion==+1 ) then + data%State%Drawworks%SoundRev = 0 ![rpm or rad/s????????????????] , Integer + data%State%Drawworks%SoundFw = INT(data%State%Drawworks%w_drum) ![rpm] , Integer + else + data%State%Drawworks%SoundFw = 0 ![rpm] , Integer + data%State%Drawworks%SoundRev = INT(data%State%Drawworks%w_drum) ![rpm] , Integer + end if + + else + + if((any(data%State%Drawworks%AssignmentSwitch==(/1,2,3,4,5,7,8,9,10,11/))) .and. (data%State%Drawworks%Switch==-1 .or. data%State%Drawworks%Switch==1)) then + data%State%Drawworks%SoundBlower = .true. + data%State%Drawworks%BLWR = 1 + else + data%State%Drawworks%SoundBlower = .false. + data%State%Drawworks%BLWR = 0 + end if + + Call Drawworks_Solver_OffMode + + if ( data%State%Drawworks%motion==+1 ) then + data%State%Drawworks%SoundRev = 0 ![rpm] , Integer + data%State%Drawworks%SoundFw = INT(data%State%Drawworks%w_drum) ![rpm] , Integer + else + data%State%Drawworks%SoundFw = 0 ![rpm] , Integer + data%State%Drawworks%SoundRev = INT(data%State%Drawworks%w_drum) ![rpm] , Integer + end if + + data%State%Drawworks%K_Throttle = 0 + + end if + + + Call Drawworks_Outputs + + data%State%Drawworks%N_old = data%State%Drawworks%Speed + + + end subroutine Drawworks_MainSolver \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_Outputs.f90 b/Equipments/Drawworks/Drawworks_Outputs.f90 index 8824a90..303f8c6 100644 --- a/Equipments/Drawworks/Drawworks_Outputs.f90 +++ b/Equipments/Drawworks/Drawworks_Outputs.f90 @@ -1,40 +1,40 @@ -subroutine Drawworks_Outputs - - Use CSounds - use CHook - use SimulationVariables - use CWarnings - use SimulationVariables !@ - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - - IMPLICIT NONE - - - - data%EquipmentControl%DrillingConsole%DWBLWR = data%State%Drawworks%BLWR - - Call SetSoundBlowerDW( data%State%Drawworks%SoundBlower ) !.true. or .false. - Call SetSoundDwRev( data%State%Drawworks%SoundRev ) ![rpm] ??? or rad/s, Integer - Call SetSoundDwFw( data%State%Drawworks%SoundFw ) ![rpm] , Integer - Call SetSoundCrownCollision( data%State%Drawworks%SoundCrownCollision ) !.true. or .false. - Call SetSoundFloorCollision( data%State%Drawworks%SoundFloorCollision ) !.true. or .false. - - if (data%State%Drawworks%CrownCollision==1) then - Call Activate_CrownCollision() - end if - if (data%State%Drawworks%FloorCollision==1) then - Call Activate_FloorCollision() - end if - - Call Set_HookHeight( real(data%State%Drawworks%Hook_Height_final) ) ![ft] - data%State%Drawworks%TDHookHeight = data%State%Drawworks%Hook_Height_final ![ft] - !!data%State%Drawworks%HookHeight_graph_output - - !data%EquipmentControl%DrillingConsole%ParkingBrakeLed = 0 ! in Drawworks_Inputs - - - - +subroutine Drawworks_Outputs + + Use CSounds + use CHook + use SimulationVariables + use CWarnings + use SimulationVariables !@ + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + + IMPLICIT NONE + + + + data%EquipmentControl%DrillingConsole%DWBLWR = data%State%Drawworks%BLWR + + Call SetSoundBlowerDW( data%State%Drawworks%SoundBlower ) !.true. or .false. + Call SetSoundDwRev( data%State%Drawworks%SoundRev ) ![rpm] ??? or rad/s, Integer + Call SetSoundDwFw( data%State%Drawworks%SoundFw ) ![rpm] , Integer + Call SetSoundCrownCollision( data%State%Drawworks%SoundCrownCollision ) !.true. or .false. + Call SetSoundFloorCollision( data%State%Drawworks%SoundFloorCollision ) !.true. or .false. + + if (data%State%Drawworks%CrownCollision==1) then + Call Activate_CrownCollision() + end if + if (data%State%Drawworks%FloorCollision==1) then + Call Activate_FloorCollision() + end if + + Call Set_HookHeight( real(data%State%Drawworks%Hook_Height_final) ) ![ft] + data%State%Drawworks%TDHookHeight = data%State%Drawworks%Hook_Height_final ![ft] + !!data%State%Drawworks%HookHeight_graph_output + + !data%EquipmentControl%DrillingConsole%ParkingBrakeLed = 0 ! in Drawworks_Inputs + + + + end subroutine Drawworks_Outputs \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_Solver.f90 b/Equipments/Drawworks/Drawworks_Solver.f90 index 02cac0e..5ee9566 100644 --- a/Equipments/Drawworks/Drawworks_Solver.f90 +++ b/Equipments/Drawworks/Drawworks_Solver.f90 @@ -1,284 +1,284 @@ -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] - - - - +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 \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_Solver_OffMode.f90 b/Equipments/Drawworks/Drawworks_Solver_OffMode.f90 index bb308fd..dc806c5 100644 --- a/Equipments/Drawworks/Drawworks_Solver_OffMode.f90 +++ b/Equipments/Drawworks/Drawworks_Solver_OffMode.f90 @@ -1,248 +1,248 @@ -subroutine Drawworks_Solver_OffMode - - 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 - - - - - 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 - - - - - - -!==================================================== -! 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.280839895*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 - - - - - - - - -!==================================================== -! Warning (Max_Hook_Height) -!==================================================== - 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 - - - - - - - -!==================================================== -! Warning (Min_Hook_Height) -!==================================================== - 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.0d0)-2.6d0 ![ft] - - - - - +subroutine Drawworks_Solver_OffMode + + 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 + + + + + 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 + + + + + + +!==================================================== +! 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.280839895*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 + + + + + + + + +!==================================================== +! Warning (Max_Hook_Height) +!==================================================== + 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 + + + + + + + +!==================================================== +! Warning (Min_Hook_Height) +!==================================================== + 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.0d0)-2.6d0 ![ft] + + + + + end subroutine Drawworks_Solver_OffMode \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_StartUp.f90 b/Equipments/Drawworks/Drawworks_StartUp.f90 index 66d1954..fde56e5 100644 --- a/Equipments/Drawworks/Drawworks_StartUp.f90 +++ b/Equipments/Drawworks/Drawworks_StartUp.f90 @@ -1,57 +1,57 @@ -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%State%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 - - - - +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 \ No newline at end of file diff --git a/Equipments/Drawworks/Drawworks_VARIABLES.f90 b/Equipments/Drawworks/Drawworks_VARIABLES.f90 index 0eedbc6..bb3e25e 100644 --- a/Equipments/Drawworks/Drawworks_VARIABLES.f90 +++ b/Equipments/Drawworks/Drawworks_VARIABLES.f90 @@ -1,55 +1,55 @@ -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 -!*********************************************************************************************** -!**************************************************************************************************** - - - - - +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 \ No newline at end of file diff --git a/Equipments/DrillingConsole_ScrLEDs.f90 b/Equipments/DrillingConsole_ScrLEDs.f90 index 0963119..829b18d 100644 --- a/Equipments/DrillingConsole_ScrLEDs.f90 +++ b/Equipments/DrillingConsole_ScrLEDs.f90 @@ -1,51 +1,51 @@ -subroutine DrillingConsole_ScrLEDs - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use SimulationVariables !@ - - IMPLICIT NONE - - - - !===> Torque Limit - data%EquipmentControl%DrillingConsole%RTTorqueLimitGauge = sngl(1-data%State%RTable%TorqueLimitGaugeMalf)*(data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob/10.d0)*7000.d0 !tabdile bazeye 0-10 be 0-7000 taghribi anjam shode, baadan eslah shavad ?????? - - - - - - if((any(data%EquipmentControl%DrillingConsole%AssignmentSwitch==(/1,2,3,4,8,9,10,11/)))) then - - data%EquipmentControl%DrillingConsole%SCR1LED=1 - data%EquipmentControl%DrillingConsole%SCR2LED=1 - data%EquipmentControl%DrillingConsole%SCR3LED=1 - data%EquipmentControl%DrillingConsole%SCR4LED=1 - - else if (data%EquipmentControl%DrillingConsole%AssignmentSwitch == 5) then - - data%EquipmentControl%DrillingConsole%SCR1LED=1 - data%EquipmentControl%DrillingConsole%SCR2LED=1 - data%EquipmentControl%DrillingConsole%SCR3LED=0 - data%EquipmentControl%DrillingConsole%SCR4LED=1 - - else if (data%EquipmentControl%DrillingConsole%AssignmentSwitch == 7) then - - data%EquipmentControl%DrillingConsole%SCR1LED=1 - data%EquipmentControl%DrillingConsole%SCR2LED=1 - data%EquipmentControl%DrillingConsole%SCR3LED=1 - data%EquipmentControl%DrillingConsole%SCR4LED=0 - - else - data%EquipmentControl%DrillingConsole%SCR1LED=0 - data%EquipmentControl%DrillingConsole%SCR2LED=0 - data%EquipmentControl%DrillingConsole%SCR3LED=0 - data%EquipmentControl%DrillingConsole%SCR4LED=0 - - end if - - - - +subroutine DrillingConsole_ScrLEDs + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use SimulationVariables !@ + + IMPLICIT NONE + + + + !===> Torque Limit + data%EquipmentControl%DrillingConsole%RTTorqueLimitGauge = sngl(1-data%State%RTable%TorqueLimitGaugeMalf)*(data%EquipmentControl%DrillingConsole%RTTorqueLimitKnob/10.d0)*7000.d0 !tabdile bazeye 0-10 be 0-7000 taghribi anjam shode, baadan eslah shavad ?????? + + + + + + if((any(data%EquipmentControl%DrillingConsole%AssignmentSwitch==(/1,2,3,4,8,9,10,11/)))) then + + data%EquipmentControl%DrillingConsole%SCR1LED=1 + data%EquipmentControl%DrillingConsole%SCR2LED=1 + data%EquipmentControl%DrillingConsole%SCR3LED=1 + data%EquipmentControl%DrillingConsole%SCR4LED=1 + + else if (data%EquipmentControl%DrillingConsole%AssignmentSwitch == 5) then + + data%EquipmentControl%DrillingConsole%SCR1LED=1 + data%EquipmentControl%DrillingConsole%SCR2LED=1 + data%EquipmentControl%DrillingConsole%SCR3LED=0 + data%EquipmentControl%DrillingConsole%SCR4LED=1 + + else if (data%EquipmentControl%DrillingConsole%AssignmentSwitch == 7) then + + data%EquipmentControl%DrillingConsole%SCR1LED=1 + data%EquipmentControl%DrillingConsole%SCR2LED=1 + data%EquipmentControl%DrillingConsole%SCR3LED=1 + data%EquipmentControl%DrillingConsole%SCR4LED=0 + + else + data%EquipmentControl%DrillingConsole%SCR1LED=0 + data%EquipmentControl%DrillingConsole%SCR2LED=0 + data%EquipmentControl%DrillingConsole%SCR3LED=0 + data%EquipmentControl%DrillingConsole%SCR4LED=0 + + end if + + + + end subroutine DrillingConsole_ScrLEDs \ No newline at end of file diff --git a/Equipments/MudSystem/MudSystem.f90 b/Equipments/MudSystem/MudSystem.f90 index 451ab1a..9ccd467 100644 --- a/Equipments/MudSystem/MudSystem.f90 +++ b/Equipments/MudSystem/MudSystem.f90 @@ -704,22 +704,22 @@ use SimulationVariables !@ data%State%MudSystem%PumpsDumpFlowRate= jj2*(1-H82)*DumpPump1*data%State%Pump(1)%Flow_Rate + jj12*(1-H83)*DumpPump2*data%State%Pump(2)%Flow_Rate + jj13*(1-H84)*DumpCementPump*data%State%Pump(3)%Flow_Rate !write(*,*) 'PumpsDumpFlowRate=' , PumpsDumpFlowRate - if (data%State%Hoisting%DriveType==1 .and. data%State%MudSystem%PumpsDumpFlowRate > 0.0 .and. (DumpFromKelly_Pump1 .or. DumpFromKelly_Pump2 .or. DumpFromKelly_Pump3)) then + if (data%Configuration%Hoisting%DriveType==1 .and. data%State%MudSystem%PumpsDumpFlowRate > 0.0 .and. (DumpFromKelly_Pump1 .or. DumpFromKelly_Pump2 .or. DumpFromKelly_Pump3)) then !write(*,*) 'Set_FlowFromKelly(.TRUE.)' call Activate_PumpWithKellyDisconnected() !write(*,*) 'PumpsDumpFlowRate=' , PumpsDumpFlowRate CALL Set_FlowFromKelly(min(data%State%MudSystem%PumpsDumpFlowRate/6.,100.)) ! .TRUE. before - elseif (data%State%Hoisting%DriveType==1) then + elseif (data%Configuration%Hoisting%DriveType==1) then call Deactivate_PumpWithKellyDisconnected() CALL Set_FlowFromKelly(0.0) ! .FALSE. before !write(*,*) 'Set_FlowFromKelly(.FALSE.)' endif !write(*,*) 'DumpFromFillupHead_Pump1=' , DumpFromFillupHead_Pump1 - if (data%State%Hoisting%DriveType==0 .and. data%State%MudSystem%PumpsDumpFlowRate > 0.0 .and. (DumpFromTopDrive_Pump1 .or. DumpFromTopDrive_Pump2 .or. DumpFromTopDrive_Pump3)) then + if (data%Configuration%Hoisting%DriveType==0 .and. data%State%MudSystem%PumpsDumpFlowRate > 0.0 .and. (DumpFromTopDrive_Pump1 .or. DumpFromTopDrive_Pump2 .or. DumpFromTopDrive_Pump3)) then !write(*,*) 'Set_FlowFromKelly(.TRUE.)' call Activate_PumpWithTopdriveDisconnected() CALL Set_FlowFromKelly(min(data%State%MudSystem%PumpsDumpFlowRate/6.,100.)) ! .TRUE. before - elseif (data%State%Hoisting%DriveType==0) then + elseif (data%Configuration%Hoisting%DriveType==0) then call Deactivate_PumpWithTopdriveDisconnected() CALL Set_FlowFromKelly(0.0) ! .FALSE. before !write(*,*) 'Set_FlowFromKelly(.FALSE.)' diff --git a/Equipments/Pumps/Pump1_MainSolver.f90 b/Equipments/Pumps/Pump1_MainSolver.f90 index 33ce64b..8dd7a83 100644 --- a/Equipments/Pumps/Pump1_MainSolver.f90 +++ b/Equipments/Pumps/Pump1_MainSolver.f90 @@ -1,57 +1,57 @@ -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 - - - +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 \ No newline at end of file diff --git a/Equipments/Pumps/Pump2_MainSolver.f90 b/Equipments/Pumps/Pump2_MainSolver.f90 index 5ad431e..3526c51 100644 --- a/Equipments/Pumps/Pump2_MainSolver.f90 +++ b/Equipments/Pumps/Pump2_MainSolver.f90 @@ -1,57 +1,57 @@ -subroutine Pump2_MainSolver - - use SimulationVariables - - Implicit none - - - - - if (data%State%Pump(2)%Throttle<=0.d0) then - data%State%Pump(2)%K_throttle = 1 - end if - - - if((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1) .and. (data%State%Pump(2)%K_throttle==1) .and. (data%State%Pump(2)%PowerFailMalf==0) .and. (data%State%Pump(2)%Failure==0)) then - - data%State%Pump(2)%SoundBlower = .true. - data%State%Pump(2)%BLWR = 1 - - !========================== Pump 2 Rate limit ========================== - if (((data%State%Pump(2)%N_new-data%State%Pump(2)%N_old)/data%State%Pump(2)%time_step)>data%State%Pump(2)%RateChange) then - data%State%Pump(2)%Speed =(data%State%Pump(2)%RateChange*data%State%Pump(2)%time_step)+data%State%Pump(2)%N_old - else if (((data%State%Pump(2)%N_old-data%State%Pump(2)%N_new)/data%State%Pump(2)%time_step)>data%State%Pump(2)%RateChange) then - data%State%Pump(2)%Speed = (-data%State%Pump(2)%RateChange*data%State%Pump(2)%time_step)+data%State%Pump(2)%N_old - else - data%State%Pump(2)%Speed = data%State%Pump(2)%N_new - end if - !======================================================================= - - Call Pump_OnMode_Solver(2) - - else - - if ((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1)) then - data%State%Pump(2)%SoundBlower = .true. - else - data%State%Pump(2)%SoundBlower = .false. - end if - - if ((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1) .and. (data%State%Pump(2)%PowerFailMalf==0) .and. (data%State%Pump(2)%Failure==0)) then - data%State%Pump(2)%BLWR = 1 - else - data%State%Pump(2)%BLWR = 0 - end if - - - Call Pump_OffMode_Solver(2) - data%State%Pump(2)%K_throttle = 0 - - end if - - - data%State%Pump(2)%N_old = data%State%Pump(2)%Speed - - - +subroutine Pump2_MainSolver + + use SimulationVariables + + Implicit none + + + + + if (data%State%Pump(2)%Throttle<=0.d0) then + data%State%Pump(2)%K_throttle = 1 + end if + + + if((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1) .and. (data%State%Pump(2)%K_throttle==1) .and. (data%State%Pump(2)%PowerFailMalf==0) .and. (data%State%Pump(2)%Failure==0)) then + + data%State%Pump(2)%SoundBlower = .true. + data%State%Pump(2)%BLWR = 1 + + !========================== Pump 2 Rate limit ========================== + if (((data%State%Pump(2)%N_new-data%State%Pump(2)%N_old)/data%State%Pump(2)%time_step)>data%State%Pump(2)%RateChange) then + data%State%Pump(2)%Speed =(data%State%Pump(2)%RateChange*data%State%Pump(2)%time_step)+data%State%Pump(2)%N_old + else if (((data%State%Pump(2)%N_old-data%State%Pump(2)%N_new)/data%State%Pump(2)%time_step)>data%State%Pump(2)%RateChange) then + data%State%Pump(2)%Speed = (-data%State%Pump(2)%RateChange*data%State%Pump(2)%time_step)+data%State%Pump(2)%N_old + else + data%State%Pump(2)%Speed = data%State%Pump(2)%N_new + end if + !======================================================================= + + Call Pump_OnMode_Solver(2) + + else + + if ((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1)) then + data%State%Pump(2)%SoundBlower = .true. + else + data%State%Pump(2)%SoundBlower = .false. + end if + + if ((any(data%State%Pump(2)%AssignmentSwitchh==(/1,2,3,4,5,7,8,11/))) .and. (data%State%Pump(2)%Switch==-1) .and. (data%State%Pump(2)%PowerFailMalf==0) .and. (data%State%Pump(2)%Failure==0)) then + data%State%Pump(2)%BLWR = 1 + else + data%State%Pump(2)%BLWR = 0 + end if + + + Call Pump_OffMode_Solver(2) + data%State%Pump(2)%K_throttle = 0 + + end if + + + data%State%Pump(2)%N_old = data%State%Pump(2)%Speed + + + end subroutine Pump2_MainSolver \ No newline at end of file diff --git a/Equipments/Pumps/Pump3_MainSolver.f90 b/Equipments/Pumps/Pump3_MainSolver.f90 index 6c57e3c..31275ca 100644 --- a/Equipments/Pumps/Pump3_MainSolver.f90 +++ b/Equipments/Pumps/Pump3_MainSolver.f90 @@ -1,41 +1,41 @@ -subroutine Pump3_MainSolver - - use SimulationVariables - - Implicit none - - - - - if (data%State%Pump(3)%Throttle<=0.d0) then - data%State%Pump(3)%K_throttle = 1 - end if - - - if((data%State%Pump(3)%Switch==1) .and. (data%State%Pump(3)%K_throttle==1) .and. (data%State%Pump(3)%PowerFailMalf==0) .and. (data%State%Pump(3)%Failure==0)) then - - !========================== Pump 3 Rate limit ========================== - if (((data%State%Pump(3)%N_new-data%State%Pump(3)%N_old)/data%State%Pump(3)%time_step)>data%State%Pump(3)%RateChange) then - data%State%Pump(3)%Speed =(data%State%Pump(3)%RateChange*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old ![RPM] - else if (((data%State%Pump(3)%N_old-data%State%Pump(3)%N_new)/data%State%Pump(3)%time_step)>data%State%Pump(3)%RateChange) then - data%State%Pump(3)%Speed = (-data%State%Pump(3)%RateChange*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old - else - data%State%Pump(3)%Speed = data%State%Pump(3)%N_new - end if - !======================================================================= - - Call Pump_OnMode_Solver(3) - - else - - Call Pump_OffMode_Solver(3) - data%State%Pump(3)%K_throttle = 0 - - end if - - - data%State%Pump(3)%N_old = data%State%Pump(3)%Speed - - - +subroutine Pump3_MainSolver + + use SimulationVariables + + Implicit none + + + + + if (data%State%Pump(3)%Throttle<=0.d0) then + data%State%Pump(3)%K_throttle = 1 + end if + + + if((data%State%Pump(3)%Switch==1) .and. (data%State%Pump(3)%K_throttle==1) .and. (data%State%Pump(3)%PowerFailMalf==0) .and. (data%State%Pump(3)%Failure==0)) then + + !========================== Pump 3 Rate limit ========================== + if (((data%State%Pump(3)%N_new-data%State%Pump(3)%N_old)/data%State%Pump(3)%time_step)>data%State%Pump(3)%RateChange) then + data%State%Pump(3)%Speed =(data%State%Pump(3)%RateChange*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old ![RPM] + else if (((data%State%Pump(3)%N_old-data%State%Pump(3)%N_new)/data%State%Pump(3)%time_step)>data%State%Pump(3)%RateChange) then + data%State%Pump(3)%Speed = (-data%State%Pump(3)%RateChange*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old + else + data%State%Pump(3)%Speed = data%State%Pump(3)%N_new + end if + !======================================================================= + + Call Pump_OnMode_Solver(3) + + else + + Call Pump_OffMode_Solver(3) + data%State%Pump(3)%K_throttle = 0 + + end if + + + data%State%Pump(3)%N_old = data%State%Pump(3)%Speed + + + end subroutine Pump3_MainSolver \ No newline at end of file diff --git a/Equipments/Pumps/Pump_OffMode_Solver.f90 b/Equipments/Pumps/Pump_OffMode_Solver.f90 index 4107085..b80f83a 100644 --- a/Equipments/Pumps/Pump_OffMode_Solver.f90 +++ b/Equipments/Pumps/Pump_OffMode_Solver.f90 @@ -1,46 +1,46 @@ -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 - - - - - - +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 \ No newline at end of file diff --git a/Equipments/Pumps/Pump_OnMode_Solver.f90 b/Equipments/Pumps/Pump_OnMode_Solver.f90 index c622f40..3d41305 100644 --- a/Equipments/Pumps/Pump_OnMode_Solver.f90 +++ b/Equipments/Pumps/Pump_OnMode_Solver.f90 @@ -1,33 +1,33 @@ -subroutine Pump_OnMode_Solver(Pump_No) - - use SimulationVariables - - IMPLICIT NONE - INTEGER :: Pump_No - - - - 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)%Max_FlowRate = data%State%Pump(Pump_No)%FlowRatePerSTK*4118.d0*0.01d0*data%State%Pump(Pump_No)%MaxSPM ![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) ![spm] - - 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 - - - - - +subroutine Pump_OnMode_Solver(Pump_No) + + use SimulationVariables + + IMPLICIT NONE + INTEGER :: Pump_No + + + + 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)%Max_FlowRate = data%State%Pump(Pump_No)%FlowRatePerSTK*4118.d0*0.01d0*data%State%Pump(Pump_No)%MaxSPM ![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) ![spm] + + 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_OnMode_Solver \ No newline at end of file diff --git a/Equipments/Pumps/PumpsMain.f90 b/Equipments/Pumps/PumpsMain.f90 index 2e5c017..9d215cf 100644 --- a/Equipments/Pumps/PumpsMain.f90 +++ b/Equipments/Pumps/PumpsMain.f90 @@ -1,222 +1,222 @@ -module PumpsMain - use SimulationVariables - implicit none - public - contains -! **************************************** -! ***** subroutine Pump1MainBody ***** -! **************************** - ! subroutine Pump1_Setup() - ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(Pump1_Init) - ! call OnSimulationStop%Add(Pump1_Init) - ! call OnPump1Step%Add(Pump1_Step) - ! call OnPump1Output%Add(Pump1_Output) - ! call OnPump1Main%Add(Pump1MainBody) - ! end subroutine - - subroutine Pump1_Init - Call Pumps_StartUp - end subroutine Pump1_Init - - subroutine Pump1_Step - Call Pump1_MainSolver - end subroutine Pump1_Step - - ! subroutine Pump1_Output - ! implicit none - ! end subroutine Pump1_Output - - ! subroutine Pump1MainBody - ! use ifport - ! use ifmt - ! implicit none - - - ! Call Pumps_StartUp - - - ! loop1 : do - - ! Call Pumps_MainSolver - - ! end do loop1 - - - ! end subroutine Pump1MainBody - - - - - -! **************************************** -! ***** subroutine Pump2MainBody ***** -! **************************** -! subroutine Pump2_Setup() -! use CSimulationVariables -! implicit none -! call OnSimulationInitialization%Add(Pump2_Init) -! call OnSimulationStop%Add(Pump2_Init) -! call OnPump2Step%Add(Pump2_Step) -! call OnPump2Output%Add(Pump2_Output) -! call OnPump2Main%Add(Pump2MainBody) -! end subroutine -! -! subroutine Pump2_Init -! implicit none -! end subroutine Pump2_Init -! -! subroutine Pump2_Step -! call Pump2_MainSolver -! end subroutine Pump2_Step -! -! subroutine Pump2_Output -! implicit none -! end subroutine Pump2_Output -! -! subroutine Pump2MainBody -! use ifport -! use ifmt -! use CWarnings -! implicit none -! -! integer,dimension(8) :: MP_START_TIME, MP_END_TIME -! INTEGER :: MP_SolDuration -! -! Call Pump_StartUp -! -! loop1 : do -! -! Call DATE_AND_TIME(values=MP_START_TIME) -! -! Call Pump2_MainSolver -! -! Call DATE_AND_TIME(values=MP_END_TIME) -! MP_SolDuration = 100-(MP_END_TIME(5)*3600000+MP_END_TIME(6)*60000+MP_END_TIME(7)*1000+MP_END_TIME(8)-MP_START_TIME(5)*3600000-MP_START_TIME(6)*60000-MP_START_TIME(7)*1000-MP_START_TIME(8)) -! if(MP_SolDuration > 0.0) then -! Call sleepqq(MP_SolDuration) -! end if -! -! if (IsStopped == .true.) then -! exit loop1 -! end if -! -! end do loop1 -! -! -! end subroutine Pump2MainBody -! -! -! -! -!! **************************************** -!! ***** subroutine Pump3MainBody ***** -!! **************************** -! subroutine Pump3_Setup() -! use CSimulationVariables -! implicit none -! call OnSimulationInitialization%Add(Pump3_Init) -! call OnSimulationStop%Add(Pump3_Init) -! call OnPump3Step%Add(Pump3_Step) -! call OnPump3Output%Add(Pump3_Output) -! call OnPump3Main%Add(Pump3MainBody) -! end subroutine -! -! subroutine Pump3_Init -! implicit none -! end subroutine Pump3_Init -! -! subroutine Pump3_Step -! implicit none -! end subroutine Pump3_Step -! -! subroutine Pump3_Output -! implicit none -! end subroutine Pump3_Output -! -! subroutine Pump3MainBody -! use ifport -! use ifmt -! implicit none -! -! -! integer,dimension(8) :: MP_START_TIME, MP_END_TIME -! INTEGER :: MP_SolDuration -! -! !Call Pump_StartUp -! !loop1 : do -! ! -! ! Call sleepqq(10) -! ! -! ! !!! Pump3 Malfunction ----> Power Failure -! ! !!if (data%State%Pump(1)%PowerFailMalf==1) then -! ! !! !MP1BLWR=0 -! ! !! Call Pump3_OffMode_Solver -! ! !! Call ClosePump1() -! ! !!end if -! ! -! ! !if( (MP1CPSwitch==1) .and. (MP1Throttle==0.) .and. (data%State%Pump(3)%PowerFailMalf==0) ) then -! !! -! !! loop2: do -! !! -! !! Call DATE_AND_TIME(values=MP_START_TIME) -! !! -! !!!! ! Pump3 Malfunction ----> Power Failure -! !!!! if (data%State%Pump(1)%PowerFailMalf==1) then -! !!!! !MP1BLWR=0 -! !!!! Pump3_OffMode_Solver -! !!!! Call ClosePump1() -! !!!! exit loop2 -! !!!! end if -! !! -! !! data%State%Pump(3)%N_new = MP1Throttle -! !! if (((data%State%Pump(3)%N_new-data%State%Pump(3)%N_old)/data%State%Pump(3)%time_step)>193.) then -! !! data%State%Pump(3)%N_ref =(193.*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old -! !! else if (((data%State%Pump(3)%N_old-data%State%Pump(3)%N_new)/data%State%Pump(3)%time_step)>193.) then -! !! data%State%Pump(3)%N_ref = (-193.*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old -! !! else -! !! data%State%Pump(3)%N_ref = data%State%Pump(3)%N_new -! !! end if -! !! -! !! Call Pump3_OnMode_Solver -! !! -! !! IF (data%State%Pump(3)%Flow_Rate>0.) Then -! !! Call OpenCementPump() -! !! Else -! !! Call CloseCementPump() -! !! End if -! !! -! !! data%State%Pump(3)%N_old = data%State%Pump(3)%N_ref -! !! -! !! Call DATE_AND_TIME(values=MP_END_TIME) -! !! MP_SolDuration = 100-(MP_END_TIME(6)*60000+MP_END_TIME(7)*1000+MP_END_TIME(8)-MP_START_TIME(6)*60000-MP_START_TIME(7)*1000-MP_START_TIME(8)) -! !! !print*, 'MPtime=', MP_SolDuration -! !! if(MP_SolDuration > 0.0) then -! !! Call sleepqq(MP_SolDuration) -! !! end if -! !! -! !! if ((MP1CPSwitch==0) .or. (IsStopped == .true.)) then -! !! Call Pump3_OffMode_Solver -! !! Call CloseCementPump() -! !! exit loop2 -! !! end if -! !! end do loop2 -! ! -! ! else -! ! -! ! !Call Pump3_OffMode_Solver -! ! !Call CloseCementPump() -! ! -! ! end if -! ! -! ! if (IsStopped == .true.) then -! ! exit loop1 -! ! end if -! ! -! !end do loop1 -! -! -! end subroutine Pump3MainBody - +module PumpsMain + use SimulationVariables + implicit none + public + contains +! **************************************** +! ***** subroutine Pump1MainBody ***** +! **************************** + ! subroutine Pump1_Setup() + ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(Pump1_Init) + ! call OnSimulationStop%Add(Pump1_Init) + ! call OnPump1Step%Add(Pump1_Step) + ! call OnPump1Output%Add(Pump1_Output) + ! call OnPump1Main%Add(Pump1MainBody) + ! end subroutine + + subroutine Pump1_Init + Call Pumps_StartUp + end subroutine Pump1_Init + + subroutine Pump1_Step + Call Pump1_MainSolver + end subroutine Pump1_Step + + ! subroutine Pump1_Output + ! implicit none + ! end subroutine Pump1_Output + + ! subroutine Pump1MainBody + ! use ifport + ! use ifmt + ! implicit none + + + ! Call Pumps_StartUp + + + ! loop1 : do + + ! Call Pumps_MainSolver + + ! end do loop1 + + + ! end subroutine Pump1MainBody + + + + + +! **************************************** +! ***** subroutine Pump2MainBody ***** +! **************************** +! subroutine Pump2_Setup() +! use CSimulationVariables +! implicit none +! call OnSimulationInitialization%Add(Pump2_Init) +! call OnSimulationStop%Add(Pump2_Init) +! call OnPump2Step%Add(Pump2_Step) +! call OnPump2Output%Add(Pump2_Output) +! call OnPump2Main%Add(Pump2MainBody) +! end subroutine +! +! subroutine Pump2_Init +! implicit none +! end subroutine Pump2_Init +! +! subroutine Pump2_Step +! call Pump2_MainSolver +! end subroutine Pump2_Step +! +! subroutine Pump2_Output +! implicit none +! end subroutine Pump2_Output +! +! subroutine Pump2MainBody +! use ifport +! use ifmt +! use CWarnings +! implicit none +! +! integer,dimension(8) :: MP_START_TIME, MP_END_TIME +! INTEGER :: MP_SolDuration +! +! Call Pump_StartUp +! +! loop1 : do +! +! Call DATE_AND_TIME(values=MP_START_TIME) +! +! Call Pump2_MainSolver +! +! Call DATE_AND_TIME(values=MP_END_TIME) +! MP_SolDuration = 100-(MP_END_TIME(5)*3600000+MP_END_TIME(6)*60000+MP_END_TIME(7)*1000+MP_END_TIME(8)-MP_START_TIME(5)*3600000-MP_START_TIME(6)*60000-MP_START_TIME(7)*1000-MP_START_TIME(8)) +! if(MP_SolDuration > 0.0) then +! Call sleepqq(MP_SolDuration) +! end if +! +! if (IsStopped == .true.) then +! exit loop1 +! end if +! +! end do loop1 +! +! +! end subroutine Pump2MainBody +! +! +! +! +!! **************************************** +!! ***** subroutine Pump3MainBody ***** +!! **************************** +! subroutine Pump3_Setup() +! use CSimulationVariables +! implicit none +! call OnSimulationInitialization%Add(Pump3_Init) +! call OnSimulationStop%Add(Pump3_Init) +! call OnPump3Step%Add(Pump3_Step) +! call OnPump3Output%Add(Pump3_Output) +! call OnPump3Main%Add(Pump3MainBody) +! end subroutine +! +! subroutine Pump3_Init +! implicit none +! end subroutine Pump3_Init +! +! subroutine Pump3_Step +! implicit none +! end subroutine Pump3_Step +! +! subroutine Pump3_Output +! implicit none +! end subroutine Pump3_Output +! +! subroutine Pump3MainBody +! use ifport +! use ifmt +! implicit none +! +! +! integer,dimension(8) :: MP_START_TIME, MP_END_TIME +! INTEGER :: MP_SolDuration +! +! !Call Pump_StartUp +! !loop1 : do +! ! +! ! Call sleepqq(10) +! ! +! ! !!! Pump3 Malfunction ----> Power Failure +! ! !!if (data%State%Pump(1)%PowerFailMalf==1) then +! ! !! !MP1BLWR=0 +! ! !! Call Pump3_OffMode_Solver +! ! !! Call ClosePump1() +! ! !!end if +! ! +! ! !if( (MP1CPSwitch==1) .and. (MP1Throttle==0.) .and. (data%State%Pump(3)%PowerFailMalf==0) ) then +! !! +! !! loop2: do +! !! +! !! Call DATE_AND_TIME(values=MP_START_TIME) +! !! +! !!!! ! Pump3 Malfunction ----> Power Failure +! !!!! if (data%State%Pump(1)%PowerFailMalf==1) then +! !!!! !MP1BLWR=0 +! !!!! Pump3_OffMode_Solver +! !!!! Call ClosePump1() +! !!!! exit loop2 +! !!!! end if +! !! +! !! data%State%Pump(3)%N_new = MP1Throttle +! !! if (((data%State%Pump(3)%N_new-data%State%Pump(3)%N_old)/data%State%Pump(3)%time_step)>193.) then +! !! data%State%Pump(3)%N_ref =(193.*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old +! !! else if (((data%State%Pump(3)%N_old-data%State%Pump(3)%N_new)/data%State%Pump(3)%time_step)>193.) then +! !! data%State%Pump(3)%N_ref = (-193.*data%State%Pump(3)%time_step)+data%State%Pump(3)%N_old +! !! else +! !! data%State%Pump(3)%N_ref = data%State%Pump(3)%N_new +! !! end if +! !! +! !! Call Pump3_OnMode_Solver +! !! +! !! IF (data%State%Pump(3)%Flow_Rate>0.) Then +! !! Call OpenCementPump() +! !! Else +! !! Call CloseCementPump() +! !! End if +! !! +! !! data%State%Pump(3)%N_old = data%State%Pump(3)%N_ref +! !! +! !! Call DATE_AND_TIME(values=MP_END_TIME) +! !! MP_SolDuration = 100-(MP_END_TIME(6)*60000+MP_END_TIME(7)*1000+MP_END_TIME(8)-MP_START_TIME(6)*60000-MP_START_TIME(7)*1000-MP_START_TIME(8)) +! !! !print*, 'MPtime=', MP_SolDuration +! !! if(MP_SolDuration > 0.0) then +! !! Call sleepqq(MP_SolDuration) +! !! end if +! !! +! !! if ((MP1CPSwitch==0) .or. (IsStopped == .true.)) then +! !! Call Pump3_OffMode_Solver +! !! Call CloseCementPump() +! !! exit loop2 +! !! end if +! !! end do loop2 +! ! +! ! else +! ! +! ! !Call Pump3_OffMode_Solver +! ! !Call CloseCementPump() +! ! +! ! end if +! ! +! ! if (IsStopped == .true.) then +! ! exit loop1 +! ! end if +! ! +! !end do loop1 +! +! +! end subroutine Pump3MainBody + end module PumpsMain \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_Inputs.f90 b/Equipments/Pumps/Pumps_Inputs.f90 index c8475fc..6536581 100644 --- a/Equipments/Pumps/Pumps_Inputs.f90 +++ b/Equipments/Pumps/Pumps_Inputs.f90 @@ -1,112 +1,112 @@ -subroutine Pumps_Inputs - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use SimulationVariables - Use MudSystemModule - - IMPLICIT NONE - - - -!>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - !data%State%Pump(1)%BlowPopOffMalf = 0 !??????? motaghayere voroudi - - if ( data%State%Pump(1)%BlowPopOffMalf==1 ) then ! Pump1 Malfunction ----> Blow Pop-offs (Relief Valves) - data%State%Pump(1)%StandPipe_Pressure = 0.d0 - else - data%State%Pump(1)%StandPipe_Pressure = PumpPressure1 ![psi] - if ( data%State%Pump(1)%StandPipe_Pressure<=14.d0 ) then - data%State%Pump(1)%StandPipe_Pressure = 14.d0 - end if - end if - - data%State%Pump(1)%AssignmentSwitchh = data%EquipmentControl%DrillingConsole%AssignmentSwitch - - data%State%Pump(1)%Switch = data%EquipmentControl%DrillingConsole%MP1CPSwitch - - data%State%Pump(1)%Throttle = data%EquipmentControl%DrillingConsole%MP1Throttle ![RPM] - - !data%State%Pump(1)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump1 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad - - data%State%Pump(1)%Failure = data%Warnings%Pump1Failure !(Pump1 Warning ----> Failure) - - data%State%Pump(1)%N_new = data%State%Pump(1)%Throttle - - - - - - - -!>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - !data%State%Pump(2)%BlowPopOffMalf = 0 !??????? motaghayere voroudi - - if ( data%State%Pump(2)%BlowPopOffMalf==1 ) then ! Pump2 Malfunction ----> Blow Pop-offs (Relief Valves) - data%State%Pump(2)%StandPipe_Pressure = 0.d0 - else - data%State%Pump(2)%StandPipe_Pressure = PumpPressure2 ![psi] - if ( data%State%Pump(2)%StandPipe_Pressure<=14.d0 ) then - data%State%Pump(2)%StandPipe_Pressure = 14.d0 - end if - end if - - data%State%Pump(2)%AssignmentSwitchh = data%EquipmentControl%DrillingConsole%AssignmentSwitch - - data%State%Pump(2)%Switch = data%EquipmentControl%DrillingConsole%MP2Switch - - data%State%Pump(2)%Throttle = data%EquipmentControl%DrillingConsole%MP2Throttle ![RPM] - - !data%State%Pump(2)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump2 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad - - data%State%Pump(2)%Failure = data%Warnings%Pump2Failure !(Pump2 Warning ----> Failure) - - data%State%Pump(2)%N_new = data%State%Pump(2)%Throttle - - - - - - - -!!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - !data%State%Pump(3)%BlowPopOffMalf = 0 !??????? motaghayere voroudi - - if ( data%State%Pump(3)%BlowPopOffMalf==1 ) then ! Pump3 Malfunction ----> Blow Pop-offs (Relief Valves) - data%State%Pump(3)%StandPipe_Pressure = 0.d0 - else - data%State%Pump(3)%StandPipe_Pressure = PumpPressure3 ![psi] - if ( data%State%Pump(3)%StandPipe_Pressure<=14.d0 ) then - data%State%Pump(3)%StandPipe_Pressure = 14.d0 - end if - end if - - data%State%Pump(3)%Switch = data%EquipmentControl%DrillingConsole%MP1CPSwitch - - data%State%Pump(3)%Throttle = data%EquipmentControl%DrillingConsole%MP1Throttle ![RPM] - - !data%State%Pump(3)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump3 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad - - data%State%Pump(3)%Failure = data%Warnings%Pump3Failure !(Pump1 Warning ----> Failure) - - data%State%Pump(3)%N_new = data%State%Pump(3)%Throttle - - - - - - -!>>>>>>>>>>>>>>>>>>>>>>> Total Pumps <<<<<<<<<<<<<<<<<<<<<<<<<<< - - - - - - - - +subroutine Pumps_Inputs + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use SimulationVariables + Use MudSystemModule + + IMPLICIT NONE + + + +!>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + !data%State%Pump(1)%BlowPopOffMalf = 0 !??????? motaghayere voroudi + + if ( data%State%Pump(1)%BlowPopOffMalf==1 ) then ! Pump1 Malfunction ----> Blow Pop-offs (Relief Valves) + data%State%Pump(1)%StandPipe_Pressure = 0.d0 + else + data%State%Pump(1)%StandPipe_Pressure = PumpPressure1 ![psi] + if ( data%State%Pump(1)%StandPipe_Pressure<=14.d0 ) then + data%State%Pump(1)%StandPipe_Pressure = 14.d0 + end if + end if + + data%State%Pump(1)%AssignmentSwitchh = data%EquipmentControl%DrillingConsole%AssignmentSwitch + + data%State%Pump(1)%Switch = data%EquipmentControl%DrillingConsole%MP1CPSwitch + + data%State%Pump(1)%Throttle = data%EquipmentControl%DrillingConsole%MP1Throttle ![RPM] + + !data%State%Pump(1)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump1 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad + + data%State%Pump(1)%Failure = data%Warnings%Pump1Failure !(Pump1 Warning ----> Failure) + + data%State%Pump(1)%N_new = data%State%Pump(1)%Throttle + + + + + + + +!>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + !data%State%Pump(2)%BlowPopOffMalf = 0 !??????? motaghayere voroudi + + if ( data%State%Pump(2)%BlowPopOffMalf==1 ) then ! Pump2 Malfunction ----> Blow Pop-offs (Relief Valves) + data%State%Pump(2)%StandPipe_Pressure = 0.d0 + else + data%State%Pump(2)%StandPipe_Pressure = PumpPressure2 ![psi] + if ( data%State%Pump(2)%StandPipe_Pressure<=14.d0 ) then + data%State%Pump(2)%StandPipe_Pressure = 14.d0 + end if + end if + + data%State%Pump(2)%AssignmentSwitchh = data%EquipmentControl%DrillingConsole%AssignmentSwitch + + data%State%Pump(2)%Switch = data%EquipmentControl%DrillingConsole%MP2Switch + + data%State%Pump(2)%Throttle = data%EquipmentControl%DrillingConsole%MP2Throttle ![RPM] + + !data%State%Pump(2)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump2 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad + + data%State%Pump(2)%Failure = data%Warnings%Pump2Failure !(Pump2 Warning ----> Failure) + + data%State%Pump(2)%N_new = data%State%Pump(2)%Throttle + + + + + + + +!!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + !data%State%Pump(3)%BlowPopOffMalf = 0 !??????? motaghayere voroudi + + if ( data%State%Pump(3)%BlowPopOffMalf==1 ) then ! Pump3 Malfunction ----> Blow Pop-offs (Relief Valves) + data%State%Pump(3)%StandPipe_Pressure = 0.d0 + else + data%State%Pump(3)%StandPipe_Pressure = PumpPressure3 ![psi] + if ( data%State%Pump(3)%StandPipe_Pressure<=14.d0 ) then + data%State%Pump(3)%StandPipe_Pressure = 14.d0 + end if + end if + + data%State%Pump(3)%Switch = data%EquipmentControl%DrillingConsole%MP1CPSwitch + + data%State%Pump(3)%Throttle = data%EquipmentControl%DrillingConsole%MP1Throttle ![RPM] + + !data%State%Pump(3)%PowerFailMalf = 0 !??????? motaghayere voroudi (Pump3 Malfunction ----> Power Failure) !dar CPumpProblemsVariables meghdardehi mishavad + + data%State%Pump(3)%Failure = data%Warnings%Pump3Failure !(Pump1 Warning ----> Failure) + + data%State%Pump(3)%N_new = data%State%Pump(3)%Throttle + + + + + + +!>>>>>>>>>>>>>>>>>>>>>>> Total Pumps <<<<<<<<<<<<<<<<<<<<<<<<<<< + + + + + + + + end subroutine Pumps_Inputs \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_MainSolver.f90 b/Equipments/Pumps/Pumps_MainSolver.f90 index 9794484..a4f91e4 100644 --- a/Equipments/Pumps/Pumps_MainSolver.f90 +++ b/Equipments/Pumps/Pumps_MainSolver.f90 @@ -1,26 +1,26 @@ -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 - - +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 \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_Outputs.f90 b/Equipments/Pumps/Pumps_Outputs.f90 index 08bc61c..d423585 100644 --- a/Equipments/Pumps/Pumps_Outputs.f90 +++ b/Equipments/Pumps/Pumps_Outputs.f90 @@ -1,96 +1,96 @@ -subroutine Pumps_Outputs - - use CDataDisplayConsole - use SimulationVariables - ! Use CSimulationVariables - use SimulationVariables - Use MudSystemModule - use SimulationVariables !@ - Use CSounds - - IMPLICIT NONE - - - -!>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - If (data%State%Pump(1)%Open_Close==1) then - Call OpenPump1() - Else if (data%State%Pump(1)%Open_Close==0) then - Call ClosePump1() - End if - - data%EquipmentControl%DrillingConsole%MP1BLWR = data%State%Pump(1)%BLWR - - Call SetSoundBlowerMP1( data%State%Pump(1)%SoundBlower ) !.true. or .false. - Call SetSoundMP1( data%State%Pump(1)%SoundSPM ) ![spm] , integer - - if ((data%State%Pump(1)%Switch==-1) .or. (data%State%Pump(1)%Switch==0)) then - Call Set_MP1SPMGauge( sngl(1-data%State%Pump(1)%SPMGaugeMalf)*real((data%State%Pump(1)%Speed/data%State%Pump(1)%Trans_Ratio),8) ) ![spm] , real - data%EquipmentControl%DrillingWatch%SPM1 = data%EquipmentControl%DataDisplayConsole%MP1SPMGauge - end if - - !data%State%Pump(1)%Flow_Rate !to other modules , [gpm] - - - - - - - -!>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - If (data%State%Pump(2)%Open_Close==1) then - Call OpenPump2() - Else if (data%State%Pump(2)%Open_Close==0) then - Call ClosePump2() - End if - - data%EquipmentControl%DrillingConsole%MP2BLWR = data%State%Pump(2)%BLWR - - Call SetSoundBlowerMP2( data%State%Pump(2)%SoundBlower ) - Call SetSoundMP2( data%State%Pump(2)%SoundSPM ) - - Call Set_MP2SPMGauge( sngl(1-data%State%Pump(2)%SPMGaugeMalf)*real((data%State%Pump(2)%Speed/data%State%Pump(2)%Trans_Ratio),8) ) - data%EquipmentControl%DrillingWatch%SPM2 = data%EquipmentControl%DataDisplayConsole%MP2SPMGauge - - !data%State%Pump(2)%Flow_Rate !to other modules - - - - - - -!!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< - - If (data%State%Pump(3)%Open_Close==1) then - Call OpenCementPump() - Else if (data%State%Pump(3)%Open_Close==0) then - Call CloseCementPump() - End if - - Call SetSoundMP3( data%State%Pump(3)%SoundSPM ) - - if (data%State%Pump(3)%Switch==1) then - Call Set_MP1SPMGauge( real((data%State%Pump(3)%Speed/data%State%Pump(3)%Trans_Ratio),8) ) - data%EquipmentControl%DrillingWatch%SPM1 = data%EquipmentControl%DataDisplayConsole%MP1SPMGauge - end if - - !data%State%Pump(3)%Flow_Rate !to other modules - - - -!>>>>>>>>>>>>>>>>>>>>>>> Total Pumps <<<<<<<<<<<<<<<<<<<<<<<<<<< - - !data%State%MPumps%Total_Pump_Gpm = 100.d0 !??????????? - !data%State%MPumps%Total_Pump_SPM = 1000.d0 !????????????? - - !SCR1LED=1 - !SCR2LED=1 - !SCR3LED=1 - !SCR4LED=1 - - - - +subroutine Pumps_Outputs + + use CDataDisplayConsole + use SimulationVariables + ! Use CSimulationVariables + use SimulationVariables + Use MudSystemModule + use SimulationVariables !@ + Use CSounds + + IMPLICIT NONE + + + +!>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + If (data%State%Pump(1)%Open_Close==1) then + Call OpenPump1() + Else if (data%State%Pump(1)%Open_Close==0) then + Call ClosePump1() + End if + + data%EquipmentControl%DrillingConsole%MP1BLWR = data%State%Pump(1)%BLWR + + Call SetSoundBlowerMP1( data%State%Pump(1)%SoundBlower ) !.true. or .false. + Call SetSoundMP1( data%State%Pump(1)%SoundSPM ) ![spm] , integer + + if ((data%State%Pump(1)%Switch==-1) .or. (data%State%Pump(1)%Switch==0)) then + Call Set_MP1SPMGauge( sngl(1-data%State%Pump(1)%SPMGaugeMalf)*real((data%State%Pump(1)%Speed/data%State%Pump(1)%Trans_Ratio),8) ) ![spm] , real + data%EquipmentControl%DrillingWatch%SPM1 = data%EquipmentControl%DataDisplayConsole%MP1SPMGauge + end if + + !data%State%Pump(1)%Flow_Rate !to other modules , [gpm] + + + + + + + +!>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + If (data%State%Pump(2)%Open_Close==1) then + Call OpenPump2() + Else if (data%State%Pump(2)%Open_Close==0) then + Call ClosePump2() + End if + + data%EquipmentControl%DrillingConsole%MP2BLWR = data%State%Pump(2)%BLWR + + Call SetSoundBlowerMP2( data%State%Pump(2)%SoundBlower ) + Call SetSoundMP2( data%State%Pump(2)%SoundSPM ) + + Call Set_MP2SPMGauge( sngl(1-data%State%Pump(2)%SPMGaugeMalf)*real((data%State%Pump(2)%Speed/data%State%Pump(2)%Trans_Ratio),8) ) + data%EquipmentControl%DrillingWatch%SPM2 = data%EquipmentControl%DataDisplayConsole%MP2SPMGauge + + !data%State%Pump(2)%Flow_Rate !to other modules + + + + + + +!!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< + + If (data%State%Pump(3)%Open_Close==1) then + Call OpenCementPump() + Else if (data%State%Pump(3)%Open_Close==0) then + Call CloseCementPump() + End if + + Call SetSoundMP3( data%State%Pump(3)%SoundSPM ) + + if (data%State%Pump(3)%Switch==1) then + Call Set_MP1SPMGauge( real((data%State%Pump(3)%Speed/data%State%Pump(3)%Trans_Ratio),8) ) + data%EquipmentControl%DrillingWatch%SPM1 = data%EquipmentControl%DataDisplayConsole%MP1SPMGauge + end if + + !data%State%Pump(3)%Flow_Rate !to other modules + + + +!>>>>>>>>>>>>>>>>>>>>>>> Total Pumps <<<<<<<<<<<<<<<<<<<<<<<<<<< + + !data%State%MPumps%Total_Pump_Gpm = 100.d0 !??????????? + !data%State%MPumps%Total_Pump_SPM = 1000.d0 !????????????? + + !SCR1LED=1 + !SCR2LED=1 + !SCR3LED=1 + !SCR4LED=1 + + + + end subroutine Pumps_Outputs \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_StartUp.f90 b/Equipments/Pumps/Pumps_StartUp.f90 index 3aefbc6..05fd27f 100644 --- a/Equipments/Pumps/Pumps_StartUp.f90 +++ b/Equipments/Pumps/Pumps_StartUp.f90 @@ -1,49 +1,49 @@ -subroutine Pumps_StartUp - use CPumpsVariables - use CPumps - use SimulationVariables - IMPLICIT NONE - !>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< - data%State%Pump(1)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi - !data%State%Pump(1)%FlowRatePerSTK = data%State%Pump(1)%FlowRatePerSTK*0.0292d0 ![gpm] - data%State%Pump(1)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi - data%State%Pump(1)%Mech_Efficiency = data%Configuration%Pumps%MudPump1MechanicalEfficiency ![dimensionless] - !data%State%Pump(1)%Vol_Efficiency = MudPump1VolumetricEfficiency !bayad hazf beshe ? - data%State%Pump(1)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi - data%State%Pump(1)%MaxSPM = data%Configuration%Pumps%MudPump1Maximum ![spm] - data%State%Pump(1)%Trans_Ratio = 965.d0/data%State%Pump(1)%MaxSPM - data%State%Pump(1)%time_step = 0.1d0 !?????? niaz hast ya na?? - - data%State%Pump(1)%RateChange = 193.d0!data%State%Pump(1)%RateChange*data%State%Pump(1)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s - data%State%Pump(1)%K_throttle = 0 - data%State%Pump(1)%N_old = 0.d0 - Call Pump_OffMode_Solver(1) - !>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< - data%State%Pump(2)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi - !data%State%Pump(2)%FlowRatePerSTK = data%State%Pump(2)%FlowRatePerSTK*0.0292d0 ![gpm] - data%State%Pump(2)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi - data%State%Pump(2)%Mech_Efficiency = data%Configuration%Pumps%MudPump2MechanicalEfficiency ![dimensionless] - !data%State%Pump(2)%Vol_Efficiency = MudPump2VolumetricEfficiency !bayad hazf beshe ? - data%State%Pump(2)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi - data%State%Pump(2)%MaxSPM = data%Configuration%Pumps%MudPump2Maximum ![spm] - data%State%Pump(2)%Trans_Ratio = 965.d0/data%State%Pump(2)%MaxSPM - data%State%Pump(2)%time_step = 0.1d0 !?????? niaz hast ya na?? - data%State%Pump(2)%RateChange = 193.d0!data%State%Pump(2)%RateChange*data%State%Pump(2)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s - data%State%Pump(2)%K_throttle = 0 - data%State%Pump(2)%N_old = 0.d0 - Call Pump_OffMode_Solver(2) - !!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< - data%State%Pump(3)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi - !data%State%Pump(3)%FlowRatePerSTK = data%State%Pump(3)%FlowRatePerSTK*0.0292d0 ![gpm] - data%State%Pump(3)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi - data%State%Pump(3)%Mech_Efficiency = data%Configuration%Pumps%CementPumpMechanicalEfficiency ![dimensionless] - !data%State%Pump(3)%Vol_Efficiency = CementPumpVolumetricEfficiency !bayad hazf beshe ? - data%State%Pump(3)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi - data%State%Pump(3)%MaxSPM = data%Configuration%Pumps%CementPumpMaximum ![spm] - data%State%Pump(3)%Trans_Ratio = 965.d0/data%State%Pump(3)%MaxSPM - data%State%Pump(3)%time_step = 0.1d0 !?????? niaz hast ya na?? - data%State%Pump(3)%RateChange = 193.d0!data%State%Pump(3)%RateChange*data%State%Pump(3)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s - data%State%Pump(3)%K_throttle = 0 - data%State%Pump(3)%N_old = 0.d0 - Call Pump_OffMode_Solver(3) +subroutine Pumps_StartUp + use CPumpsVariables + use CPumps + use SimulationVariables + IMPLICIT NONE + !>>>>>>>>>>>>>>>>>>>>>>> PUMP 1 <<<<<<<<<<<<<<<<<<<<<<<<<<< + data%State%Pump(1)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi + !data%State%Pump(1)%FlowRatePerSTK = data%State%Pump(1)%FlowRatePerSTK*0.0292d0 ![gpm] + data%State%Pump(1)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi + data%State%Pump(1)%Mech_Efficiency = data%Configuration%Pumps%MudPump1MechanicalEfficiency ![dimensionless] + !data%State%Pump(1)%Vol_Efficiency = MudPump1VolumetricEfficiency !bayad hazf beshe ? + data%State%Pump(1)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi + data%State%Pump(1)%MaxSPM = data%Configuration%Pumps%MudPump1Maximum ![spm] + data%State%Pump(1)%Trans_Ratio = 965.d0/data%State%Pump(1)%MaxSPM + data%State%Pump(1)%time_step = 0.1d0 !?????? niaz hast ya na?? + + data%State%Pump(1)%RateChange = 193.d0!data%State%Pump(1)%RateChange*data%State%Pump(1)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s + data%State%Pump(1)%K_throttle = 0 + data%State%Pump(1)%N_old = 0.d0 + Call Pump_OffMode_Solver(1) + !>>>>>>>>>>>>>>>>>>>>>>> PUMP 2 <<<<<<<<<<<<<<<<<<<<<<<<<<< + data%State%Pump(2)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi + !data%State%Pump(2)%FlowRatePerSTK = data%State%Pump(2)%FlowRatePerSTK*0.0292d0 ![gpm] + data%State%Pump(2)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi + data%State%Pump(2)%Mech_Efficiency = data%Configuration%Pumps%MudPump2MechanicalEfficiency ![dimensionless] + !data%State%Pump(2)%Vol_Efficiency = MudPump2VolumetricEfficiency !bayad hazf beshe ? + data%State%Pump(2)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi + data%State%Pump(2)%MaxSPM = data%Configuration%Pumps%MudPump2Maximum ![spm] + data%State%Pump(2)%Trans_Ratio = 965.d0/data%State%Pump(2)%MaxSPM + data%State%Pump(2)%time_step = 0.1d0 !?????? niaz hast ya na?? + data%State%Pump(2)%RateChange = 193.d0!data%State%Pump(2)%RateChange*data%State%Pump(2)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s + data%State%Pump(2)%K_throttle = 0 + data%State%Pump(2)%N_old = 0.d0 + Call Pump_OffMode_Solver(2) + !!>>>>>>>>>>>>>>>>>>>>>>> PUMP 3 <<<<<<<<<<<<<<<<<<<<<<<<<<< + data%State%Pump(3)%FlowRatePerSTK = .04d0 ![bbl] !??????? motaghayere voroudi + !data%State%Pump(3)%FlowRatePerSTK = data%State%Pump(3)%FlowRatePerSTK*0.0292d0 ![gpm] + data%State%Pump(3)%RateChange = 4.d0 ![stk/min2 ??] !??????? motaghayere voroudi + data%State%Pump(3)%Mech_Efficiency = data%Configuration%Pumps%CementPumpMechanicalEfficiency ![dimensionless] + !data%State%Pump(3)%Vol_Efficiency = CementPumpVolumetricEfficiency !bayad hazf beshe ? + data%State%Pump(3)%Max_Pressure = 6000.d0 ![psi] !??????? motaghayere voroudi + data%State%Pump(3)%MaxSPM = data%Configuration%Pumps%CementPumpMaximum ![spm] + data%State%Pump(3)%Trans_Ratio = 965.d0/data%State%Pump(3)%MaxSPM + data%State%Pump(3)%time_step = 0.1d0 !?????? niaz hast ya na?? + data%State%Pump(3)%RateChange = 193.d0!data%State%Pump(3)%RateChange*data%State%Pump(3)%Trans_Ratio ! [rpm/min ??] ??????????????? rpm/s + data%State%Pump(3)%K_throttle = 0 + data%State%Pump(3)%N_old = 0.d0 + Call Pump_OffMode_Solver(3) end subroutine Pumps_StartUp \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_TotalSolver.f90 b/Equipments/Pumps/Pumps_TotalSolver.f90 index becd64b..8df7821 100644 --- a/Equipments/Pumps/Pumps_TotalSolver.f90 +++ b/Equipments/Pumps/Pumps_TotalSolver.f90 @@ -1,14 +1,14 @@ -subroutine Pumps_TotalSolver - - use SimulationVariables - - Implicit none - - - - data%State%MPumps%Total_Pump_Gpm = data%State%Pump(1)%Flow_Rate+data%State%Pump(2)%Flow_Rate+data%State%Pump(3)%Flow_Rate ![gpm] - data%State%MPumps%Total_Pump_SPM = (data%State%Pump(1)%Speed/data%State%Pump(1)%Trans_Ratio)+(data%State%Pump(2)%Speed/data%State%Pump(2)%Trans_Ratio)+(data%State%Pump(3)%Speed/data%State%Pump(3)%Trans_Ratio) ![stk/min] - - - +subroutine Pumps_TotalSolver + + use SimulationVariables + + Implicit none + + + + data%State%MPumps%Total_Pump_Gpm = data%State%Pump(1)%Flow_Rate+data%State%Pump(2)%Flow_Rate+data%State%Pump(3)%Flow_Rate ![gpm] + data%State%MPumps%Total_Pump_SPM = (data%State%Pump(1)%Speed/data%State%Pump(1)%Trans_Ratio)+(data%State%Pump(2)%Speed/data%State%Pump(2)%Trans_Ratio)+(data%State%Pump(3)%Speed/data%State%Pump(3)%Trans_Ratio) ![stk/min] + + + end subroutine Pumps_TotalSolver \ No newline at end of file diff --git a/Equipments/Pumps/Pumps_VARIABLES.f90 b/Equipments/Pumps/Pumps_VARIABLES.f90 index 5ae10b5..0ac06c4 100644 --- a/Equipments/Pumps/Pumps_VARIABLES.f90 +++ b/Equipments/Pumps/Pumps_VARIABLES.f90 @@ -1,48 +1,48 @@ -MODULE Pumps_VARIABLES - - IMPLICIT NONE - PUBLIC - - - - - ! REAL , PARAMETER :: pi=3.14159265d0 - - - Type, public:: Pumps_Var - REAL :: Total_Pump_GPM, Total_Pump_SPM, Total_Stroke_Counter_For_Plot - end Type Pumps_Var - Type(Pumps_Var) :: MPumps - - - -!**************************************************************************************************** -!**************** Define PUMP Array ************************************************************ - TYPE, PUBLIC :: Pump_Var - -!***** Pump_VARIABLES *************************** - INTEGER :: AssignmentSwitchh, Switch, K_throttle - INTEGER :: PowerFailMalf , BlowPopOffMalf , SPMGaugeMalf , Failure - - REAL :: Throttle, RateChange - REAL :: Mech_Efficiency, Vol_Efficiency, Trans_Ratio - REAL :: StandPipe_Pressure , Max_Pressure - REAL :: Speed, N_new, N_old, MaxSPM - REAL :: Flow_Rate, Hydraulic_HorsePower, Max_Horsepower, FlowRatePerSTK, Max_FlowRate, HorsePower - REAL :: time_step - - - - INTEGER :: BLWR ! 1=On , 0=Off - INTEGER :: Open_Close ! 1=Open , 0=Close - -!************* Sound_VARIABLES ********************** - INTEGER :: SoundSPM - Logical :: SoundBlower - - END TYPE Pump_Var - -!*********************************************************************************************** -!*********************************************************************************************** - +MODULE Pumps_VARIABLES + + IMPLICIT NONE + PUBLIC + + + + + ! REAL , PARAMETER :: pi=3.14159265d0 + + + Type, public:: Pumps_Var + REAL :: Total_Pump_GPM, Total_Pump_SPM, Total_Stroke_Counter_For_Plot + end Type Pumps_Var + Type(Pumps_Var) :: MPumps + + + +!**************************************************************************************************** +!**************** Define PUMP Array ************************************************************ + TYPE, PUBLIC :: Pump_Var + +!***** Pump_VARIABLES *************************** + INTEGER :: AssignmentSwitchh, Switch, K_throttle + INTEGER :: PowerFailMalf , BlowPopOffMalf , SPMGaugeMalf , Failure + + REAL :: Throttle, RateChange + REAL :: Mech_Efficiency, Vol_Efficiency, Trans_Ratio + REAL :: StandPipe_Pressure , Max_Pressure + REAL :: Speed, N_new, N_old, MaxSPM + REAL :: Flow_Rate, Hydraulic_HorsePower, Max_Horsepower, FlowRatePerSTK, Max_FlowRate, HorsePower + REAL :: time_step + + + + INTEGER :: BLWR ! 1=On , 0=Off + INTEGER :: Open_Close ! 1=Open , 0=Close + +!************* Sound_VARIABLES ********************** + INTEGER :: SoundSPM + Logical :: SoundBlower + + END TYPE Pump_Var + +!*********************************************************************************************** +!*********************************************************************************************** + END MODULE Pumps_VARIABLES \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_INPUTS.f90 b/Equipments/RotaryTable/RTable_INPUTS.f90 index 9125d15..7bf5086 100644 --- a/Equipments/RotaryTable/RTable_INPUTS.f90 +++ b/Equipments/RotaryTable/RTable_INPUTS.f90 @@ -1,80 +1,80 @@ -subroutine RTable_INPUTS - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - ! use CSimulationVariables - use UnitySignalsModule - ! use CTdsElevatorModesEnumVariables - use CHoistingVariables - use SimulationVariables - use SimulationVariables !@ - use TD_DrillStemComponents - use CUnityInputs - use CWarnings - use UnitySignalVariables - use UnitySignalsModule - - IMPLICIT NONE - integer :: i - - - - data%State%RTable%AssignmentSwitch = data%EquipmentControl%DrillingConsole%AssignmentSwitch - data%State%RTable%Switch = data%EquipmentControl%DrillingConsole%RTSwitch - !data%State%RTable%GearsAbuse = RotaryGearsAbuse - data%State%RTable%Throttle = data%EquipmentControl%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%State%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%State%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 - - - +subroutine RTable_INPUTS + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + ! use CSimulationVariables + use UnitySignalsModule + ! use CTdsElevatorModesEnumVariables + use CHoistingVariables + use SimulationVariables + use SimulationVariables !@ + use TD_DrillStemComponents + use CUnityInputs + use CWarnings + use UnitySignalVariables + use UnitySignalsModule + + IMPLICIT NONE + integer :: i + + + + data%State%RTable%AssignmentSwitch = data%EquipmentControl%DrillingConsole%AssignmentSwitch + data%State%RTable%Switch = data%EquipmentControl%DrillingConsole%RTSwitch + !data%State%RTable%GearsAbuse = RotaryGearsAbuse + data%State%RTable%Throttle = data%EquipmentControl%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_OffModeSolver.f90 b/Equipments/RotaryTable/RTable_OffModeSolver.f90 index 25b196e..e51404b 100644 --- a/Equipments/RotaryTable/RTable_OffModeSolver.f90 +++ b/Equipments/RotaryTable/RTable_OffModeSolver.f90 @@ -1,62 +1,62 @@ -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 - - - - +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 \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_OnModeSolver.f90 b/Equipments/RotaryTable/RTable_OnModeSolver.f90 index ccae972..9369a37 100644 --- a/Equipments/RotaryTable/RTable_OnModeSolver.f90 +++ b/Equipments/RotaryTable/RTable_OnModeSolver.f90 @@ -1,51 +1,51 @@ -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 - - - +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 \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_Outputs.f90 b/Equipments/RotaryTable/RTable_Outputs.f90 index b937fa6..e950444 100644 --- a/Equipments/RotaryTable/RTable_Outputs.f90 +++ b/Equipments/RotaryTable/RTable_Outputs.f90 @@ -1,32 +1,32 @@ -subroutine RTable_Outputs - - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use CDataDisplayConsole - use SimulationVariables - use SimulationVariables !@ - use SimulationVariables !@ - Use CSounds - - IMPLICIT NONE - - - - data%EquipmentControl%DrillingConsole%RTBLWR = data%State%RTable%BLWR - - Call SetSoundBlowerRT(data%State%RTable%SoundBlower) !.true. or .false. - Call SetSoundRT( data%State%RTable%SoundRPM ) ![RPM] , integer - - !data%State%RTable%Speed !to other modules - Call Set_RotaryRPMGauge( sngl(1-data%State%RTable%RpmGaugeMalf)*real(data%State%RTable%RpmGaugeOutput,8) ) ![RPM] - - data%EquipmentControl%DataDisplayConsole%RotaryTorqueGauge = data%State%RTable%TorqueGaugeOutput ![ft.lbf] - data%EquipmentControl%DrillingWatch%Torque = data%State%RTable%TorqueGaugeOutput - Call Set_RotaryTorque(sngl(1-data%State%RTable%TorqueGaugeMalf)*real(data%State%RTable%TorqueGaugeOutput,8)) ![ft.lbf] - - !RT_RPMUnityOutput = sngl(data%State%RTable%Switch)*-1.d0*RotaryRPMGauge - - - +subroutine RTable_Outputs + + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CDataDisplayConsole + use SimulationVariables + use SimulationVariables !@ + use SimulationVariables !@ + Use CSounds + + IMPLICIT NONE + + + + data%EquipmentControl%DrillingConsole%RTBLWR = data%State%RTable%BLWR + + Call SetSoundBlowerRT(data%State%RTable%SoundBlower) !.true. or .false. + Call SetSoundRT( data%State%RTable%SoundRPM ) ![RPM] , integer + + !data%State%RTable%Speed !to other modules + Call Set_RotaryRPMGauge( sngl(1-data%State%RTable%RpmGaugeMalf)*real(data%State%RTable%RpmGaugeOutput,8) ) ![RPM] + + data%EquipmentControl%DataDisplayConsole%RotaryTorqueGauge = data%State%RTable%TorqueGaugeOutput ![ft.lbf] + data%EquipmentControl%DrillingWatch%Torque = data%State%RTable%TorqueGaugeOutput + Call Set_RotaryTorque(sngl(1-data%State%RTable%TorqueGaugeMalf)*real(data%State%RTable%TorqueGaugeOutput,8)) ![ft.lbf] + + !RT_RPMUnityOutput = sngl(data%State%RTable%Switch)*-1.d0*RotaryRPMGauge + + + end subroutine RTable_Outputs \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_StartUp.f90 b/Equipments/RotaryTable/RTable_StartUp.f90 index 4887fbf..34ffe2c 100644 --- a/Equipments/RotaryTable/RTable_StartUp.f90 +++ b/Equipments/RotaryTable/RTable_StartUp.f90 @@ -1,32 +1,32 @@ -subroutine RTable_StartUp - - Use SimulationVariables - - IMPLICIT NONE - - - - data%State%RTable%Inertia_Moment = 23.261341d0 ! 23.261341[kg.m^2] = 552[lb.ft^2] - data%State%RTable%Mech_Efficiency = 0.93d0 - data%State%RTable%RateChange = 1.d0 ![Hz/s] !??????? motaghayere voroudi - data%State%RTable%High_Conv_Ratio = 4.825d0 - data%State%RTable%Low_Conv_Ratio = 7.31d0 - data%State%RTable%time_step = 0.1d0 ![s] - data%State%RTable%MaxRPM = 200.d0 ![RPM] !??????? motaghayere voroudi - data%State%RTable%MaxTorque = 1500.d0 ![ft.lbf] !??????? motaghayere voroudi - - - - data%State%RTable%RateChange = data%State%RTable%RateChange*60.d0 ![RPM/s] ![cycle/min]=[RPM] !1[Hz]=60[RPM] - data%State%RTable%J_coef = data%State%RTable%Inertia_Moment+(1.d0*(data%State%RTable%Inertia_Moment)) - data%State%RTable%Conv_Ratio = data%State%RTable%Low_Conv_Ratio - data%State%RTable%String_JCoef = 0.d0 - data%State%RTable%Torque = 0.d0 - data%State%RTable%K_throttle = 0 - data%State%RTable%Speed = 0.d0 - data%State%RTable%TorqueGaugeOutput = 0.d0 - call RTable_OffMode - - - +subroutine RTable_StartUp + + Use SimulationVariables + + IMPLICIT NONE + + + + data%State%RTable%Inertia_Moment = 23.261341d0 ! 23.261341[kg.m^2] = 552[lb.ft^2] + data%State%RTable%Mech_Efficiency = 0.93d0 + data%State%RTable%RateChange = 1.d0 ![Hz/s] !??????? motaghayere voroudi + data%State%RTable%High_Conv_Ratio = 4.825d0 + data%State%RTable%Low_Conv_Ratio = 7.31d0 + data%State%RTable%time_step = 0.1d0 ![s] + data%State%RTable%MaxRPM = 200.d0 ![RPM] !??????? motaghayere voroudi + data%State%RTable%MaxTorque = 1500.d0 ![ft.lbf] !??????? motaghayere voroudi + + + + data%State%RTable%RateChange = data%State%RTable%RateChange*60.d0 ![RPM/s] ![cycle/min]=[RPM] !1[Hz]=60[RPM] + data%State%RTable%J_coef = data%State%RTable%Inertia_Moment+(1.d0*(data%State%RTable%Inertia_Moment)) + data%State%RTable%Conv_Ratio = data%State%RTable%Low_Conv_Ratio + data%State%RTable%String_JCoef = 0.d0 + data%State%RTable%Torque = 0.d0 + data%State%RTable%K_throttle = 0 + data%State%RTable%Speed = 0.d0 + data%State%RTable%TorqueGaugeOutput = 0.d0 + call RTable_OffMode + + + end subroutine RTable_StartUp \ No newline at end of file diff --git a/Equipments/RotaryTable/RTable_VARIABLES.f90 b/Equipments/RotaryTable/RTable_VARIABLES.f90 index 85717bf..fc902ce 100644 --- a/Equipments/RotaryTable/RTable_VARIABLES.f90 +++ b/Equipments/RotaryTable/RTable_VARIABLES.f90 @@ -1,40 +1,40 @@ -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 - -!*********************************************************************************************** -!**************************************************************************************************** - +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 \ No newline at end of file diff --git a/Equipments/RotaryTable/RotaryTableMain.f90 b/Equipments/RotaryTable/RotaryTableMain.f90 index 10a8207..5b601d3 100644 --- a/Equipments/RotaryTable/RotaryTableMain.f90 +++ b/Equipments/RotaryTable/RotaryTableMain.f90 @@ -1,48 +1,48 @@ -module RotaryTableMain - implicit none - public - contains - - subroutine RotaryTable_Setup() - !use CSimulationVariables - !call OnSimulationInitialization%Add(RotaryTable_Init) - !call OnSimulationStop%Add(RotaryTable_Init) - !call OnRotaryTableStep%Add(RotaryTable_Step) - !call OnRotaryTableOutput%Add(RotaryTable_Output) - !call OnRotaryTableMain%Add(RotaryTableMainBody) - end subroutine - - subroutine RotaryTable_Init - Call RTable_StartUp - end subroutine RotaryTable_Init - - subroutine RotaryTable_Step - Call Rtable_MainSolver - end subroutine RotaryTable_Step - - subroutine RotaryTable_Output - implicit none - end subroutine RotaryTable_Output - - - subroutine RotaryTableMainBody - - use SimulationVariables !@ - - implicit none - - - Call RTable_StartUp - - loopRtablestart : do - - Call RTable_MainSolver - - end do loopRtablestart - - - end subroutine RotaryTableMainBody - - - +module RotaryTableMain + implicit none + public + contains + + subroutine RotaryTable_Setup() + !use CSimulationVariables + !call OnSimulationInitialization%Add(RotaryTable_Init) + !call OnSimulationStop%Add(RotaryTable_Init) + !call OnRotaryTableStep%Add(RotaryTable_Step) + !call OnRotaryTableOutput%Add(RotaryTable_Output) + !call OnRotaryTableMain%Add(RotaryTableMainBody) + end subroutine + + subroutine RotaryTable_Init + Call RTable_StartUp + end subroutine RotaryTable_Init + + subroutine RotaryTable_Step + Call Rtable_MainSolver + end subroutine RotaryTable_Step + + subroutine RotaryTable_Output + implicit none + end subroutine RotaryTable_Output + + + subroutine RotaryTableMainBody + + use SimulationVariables !@ + + implicit none + + + Call RTable_StartUp + + loopRtablestart : do + + Call RTable_MainSolver + + end do loopRtablestart + + + end subroutine RotaryTableMainBody + + + end module RotaryTableMain \ No newline at end of file diff --git a/Equipments/RotaryTable/Rtable_MainSolver.f90 b/Equipments/RotaryTable/Rtable_MainSolver.f90 index fa271d3..11267a5 100644 --- a/Equipments/RotaryTable/Rtable_MainSolver.f90 +++ b/Equipments/RotaryTable/Rtable_MainSolver.f90 @@ -1,67 +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 - - - +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/TopDrive/TopDriveMain.f90 b/Equipments/TopDrive/TopDriveMain.f90 index 857df55..d2e3bbb 100644 --- a/Equipments/TopDrive/TopDriveMain.f90 +++ b/Equipments/TopDrive/TopDriveMain.f90 @@ -1,65 +1,65 @@ -module TopDriveMain - use CLog4 - implicit none - public - contains - - subroutine TopDrive_Init() - !use CSimulationVariables - !implicit none - !call OnSimulationStop%Add(TopDrive_Stop) - !call OnTopDriveStart%Add(TopDrive_Start) - !call OnTopDriveStep%Add(TopDrive_Step) - !call OnTopDriveMain%Add(TopDriveMainBody) - Call TopDrive_StartUp - end subroutine - - subroutine TopDrive_Stop - implicit none - call Log_4('TopDrive_Stop') - ! this is a comment - ! this is a comment - end subroutine TopDrive_Stop - - subroutine TopDrive_Start - implicit none - ! call Log_4('TopDrive_Start') - end subroutine TopDrive_Start - - subroutine TopDrive_Step - implicit none - ! call Log_4('TopDrive_Step') - Call Rtable_MainSolver - end subroutine TopDrive_Step - - - subroutine TopDriveMainBody - ! use CSimulationVariables - use SimulationVariables - use SimulationVariables !@ - use CWarnings - use CSounds - use CTopDrivePanelVariables - use SimulationVariables - - implicit none - - - call Log_4('TopDriveMainBody') - - - Call TopDrive_StartUp - - - loopTopDrivestart : do - - Call TopDrive_MainSolver - - end do loopTopDrivestart - - - end subroutine TopDriveMainBody - - - +module TopDriveMain + use CLog4 + implicit none + public + contains + + subroutine TopDrive_Init() + !use CSimulationVariables + !implicit none + !call OnSimulationStop%Add(TopDrive_Stop) + !call OnTopDriveStart%Add(TopDrive_Start) + !call OnTopDriveStep%Add(TopDrive_Step) + !call OnTopDriveMain%Add(TopDriveMainBody) + Call TopDrive_StartUp + end subroutine + + subroutine TopDrive_Stop + implicit none + call Log_4('TopDrive_Stop') + ! this is a comment + ! this is a comment + end subroutine TopDrive_Stop + + subroutine TopDrive_Start + implicit none + ! call Log_4('TopDrive_Start') + end subroutine TopDrive_Start + + subroutine TopDrive_Step + implicit none + ! call Log_4('TopDrive_Step') + Call Rtable_MainSolver + end subroutine TopDrive_Step + + + subroutine TopDriveMainBody + ! use CSimulationVariables + use SimulationVariables + use SimulationVariables !@ + use CWarnings + use CSounds + use CTopDrivePanelVariables + use SimulationVariables + + implicit none + + + call Log_4('TopDriveMainBody') + + + Call TopDrive_StartUp + + + loopTopDrivestart : do + + Call TopDrive_MainSolver + + end do loopTopDrivestart + + + end subroutine TopDriveMainBody + + + end module TopDriveMain \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_INPUTS.f90 b/Equipments/TopDrive/TopDrive_INPUTS.f90 index cb34bc4..3c5bd7e 100644 --- a/Equipments/TopDrive/TopDrive_INPUTS.f90 +++ b/Equipments/TopDrive/TopDrive_INPUTS.f90 @@ -1,45 +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%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState - data%State%TDS%RpmKnob = data%EquipmentControl%TopDrivePanel%RpmKnob - !data%State%TDS%MotorFaileMalf ! jayi meghdardehi nashode ?????????????????? - data%State%TDS%RateChange = 193.d0 ![RPM/s] motaghayere voroudi ??? - data%State%TDS%DrillTorqueState = data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState - data%State%TDS%TorqueLimitKnob = data%EquipmentControl%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 - - - - - +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%EquipmentControl%TopDrivePanel%TopDriveTdsPowerState + data%State%TDS%RpmKnob = data%EquipmentControl%TopDrivePanel%RpmKnob + !data%State%TDS%MotorFaileMalf ! jayi meghdardehi nashode ?????????????????? + data%State%TDS%RateChange = 193.d0 ![RPM/s] motaghayere voroudi ??? + data%State%TDS%DrillTorqueState = data%EquipmentControl%TopDrivePanel%TopDriveDrillTorqueState + data%State%TDS%TorqueLimitKnob = data%EquipmentControl%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/Equipments/TopDrive/TopDrive_MainSolver.f90 b/Equipments/TopDrive/TopDrive_MainSolver.f90 index 670b53a..fc8ee0e 100644 --- a/Equipments/TopDrive/TopDrive_MainSolver.f90 +++ b/Equipments/TopDrive/TopDrive_MainSolver.f90 @@ -1,83 +1,83 @@ -subroutine TopDrive_MainSolver - - - use SimulationVariables - - IMPLICIT NONE - - - - CALL TopDrive_Inputs - - - if ( (data%State%TDS%PowerState==-1) ) then !FWD - - data%State%TDS%SoundBlower = .true. - data%State%TDS%PowerLed = 1 - - data%State%TDS%N_new = (data%State%TDS%RpmKnob/250.d0)*965.d0 ! 0 Top Drive Malfunction ----> Drive Motor Failure - if ( data%State%TDS%MotorFaileMalf==1 ) then - data%State%TDS%N_new = 0.d0 - end if - - !========================== Top Drive Rate limit ========================== - if (((data%State%TDS%N_new-data%State%TDS%N_old)/data%State%TDS%time_step)>data%State%TDS%RateChange) then - data%State%TDS%N_ref = (data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old - else if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>data%State%TDS%RateChange) then - data%State%TDS%N_ref = (-data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old - else - data%State%TDS%N_ref = data%State%TDS%N_new - end if - !========================================================================== - - CALL TopDrive_Solver - - else if ( (data%State%TDS%PowerState==1) ) then !REV - - data%State%TDS%SoundBlower = .true. - data%State%TDS%PowerLed = 1 - - data%State%TDS%N_new = (data%State%TDS%RpmKnob/250.d0)*965.d0 - - !===> Top Drive Malfunction ----> Drive Motor Failure - if ( data%State%TDS%MotorFaileMalf==1 ) then - data%State%TDS%N_new = 0.d0 - end if - - !========================== Top Drive Rate limit ========================== - if (((data%State%TDS%N_new-data%State%TDS%N_old)/data%State%TDS%time_step)>data%State%TDS%RateChange) then - data%State%TDS%N_ref =(data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old - else if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>data%State%TDS%RateChange) then - data%State%TDS%N_ref = (-data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old - else - data%State%TDS%N_ref = data%State%TDS%N_new - end if - !========================================================================== - - CALL TopDrive_Solver - - else - - if( (data%State%TDS%PowerState /= 0) ) then - data%State%TDS%SoundBlower = .true. - data%State%TDS%PowerLed = 1 - else - data%State%TDS%SoundBlower = .false. - data%State%TDS%PowerLed = 0 - end if - - Call TopDrive_OffMode - - end if - - - Call TopDrive_Outputs - - data%State%TDS%N_old = data%State%TDS%N_ref - - - - +subroutine TopDrive_MainSolver + + + use SimulationVariables + + IMPLICIT NONE + + + + CALL TopDrive_Inputs + + + if ( (data%State%TDS%PowerState==-1) ) then !FWD + + data%State%TDS%SoundBlower = .true. + data%State%TDS%PowerLed = 1 + + data%State%TDS%N_new = (data%State%TDS%RpmKnob/250.d0)*965.d0 ! 0 Top Drive Malfunction ----> Drive Motor Failure + if ( data%State%TDS%MotorFaileMalf==1 ) then + data%State%TDS%N_new = 0.d0 + end if + + !========================== Top Drive Rate limit ========================== + if (((data%State%TDS%N_new-data%State%TDS%N_old)/data%State%TDS%time_step)>data%State%TDS%RateChange) then + data%State%TDS%N_ref = (data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old + else if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>data%State%TDS%RateChange) then + data%State%TDS%N_ref = (-data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old + else + data%State%TDS%N_ref = data%State%TDS%N_new + end if + !========================================================================== + + CALL TopDrive_Solver + + else if ( (data%State%TDS%PowerState==1) ) then !REV + + data%State%TDS%SoundBlower = .true. + data%State%TDS%PowerLed = 1 + + data%State%TDS%N_new = (data%State%TDS%RpmKnob/250.d0)*965.d0 + + !===> Top Drive Malfunction ----> Drive Motor Failure + if ( data%State%TDS%MotorFaileMalf==1 ) then + data%State%TDS%N_new = 0.d0 + end if + + !========================== Top Drive Rate limit ========================== + if (((data%State%TDS%N_new-data%State%TDS%N_old)/data%State%TDS%time_step)>data%State%TDS%RateChange) then + data%State%TDS%N_ref =(data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old + else if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>data%State%TDS%RateChange) then + data%State%TDS%N_ref = (-data%State%TDS%RateChange*data%State%TDS%time_step)+data%State%TDS%N_old + else + data%State%TDS%N_ref = data%State%TDS%N_new + end if + !========================================================================== + + CALL TopDrive_Solver + + else + + if( (data%State%TDS%PowerState /= 0) ) then + data%State%TDS%SoundBlower = .true. + data%State%TDS%PowerLed = 1 + else + data%State%TDS%SoundBlower = .false. + data%State%TDS%PowerLed = 0 + end if + + Call TopDrive_OffMode + + end if + + + Call TopDrive_Outputs + + data%State%TDS%N_old = data%State%TDS%N_ref + + + + end subroutine TopDrive_MainSolver \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_OffMode.f90 b/Equipments/TopDrive/TopDrive_OffMode.f90 index ba9d234..ffebf47 100644 --- a/Equipments/TopDrive/TopDrive_OffMode.f90 +++ b/Equipments/TopDrive/TopDrive_OffMode.f90 @@ -1,39 +1,39 @@ -subroutine TopDrive_OffMode - - use SimulationVariables - - IMPLICIT NONE - - - data%State%TDS%N_new = 0.d0 - - !================================================================== - ! Rate limit for off Mode - if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>(2.d0*data%State%TDS%RateChange)) then ! baraye 0 shodan RateChange ro *2 karde ??? - data%State%TDS%N_ref = (-(2.d0*data%State%TDS%RateChange)*data%State%TDS%time_step)+data%State%TDS%N_old - Call TopDrive_Solver - !================================================================== - else - - data%State%TDS%N_ref = 0.d0 - data%State%TDS%N_new = 0.d0 - data%State%TDS%N_old = 0.d0 - data%State%TDS%Speed = 0.d0 - data%State%TDS%TDS_wOld = 0.d0 - - - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - - data%State%TDS%OldPowerMode = 0 - - End if - - +subroutine TopDrive_OffMode + + use SimulationVariables + + IMPLICIT NONE + + + data%State%TDS%N_new = 0.d0 + + !================================================================== + ! Rate limit for off Mode + if (((data%State%TDS%N_old-data%State%TDS%N_new)/data%State%TDS%time_step)>(2.d0*data%State%TDS%RateChange)) then ! baraye 0 shodan RateChange ro *2 karde ??? + data%State%TDS%N_ref = (-(2.d0*data%State%TDS%RateChange)*data%State%TDS%time_step)+data%State%TDS%N_old + Call TopDrive_Solver + !================================================================== + else + + data%State%TDS%N_ref = 0.d0 + data%State%TDS%N_new = 0.d0 + data%State%TDS%N_old = 0.d0 + data%State%TDS%Speed = 0.d0 + data%State%TDS%TDS_wOld = 0.d0 + + + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + + data%State%TDS%OldPowerMode = 0 + + End if + + end subroutine \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_Outputs.f90 b/Equipments/TopDrive/TopDrive_Outputs.f90 index 5955ae5..a745805 100644 --- a/Equipments/TopDrive/TopDrive_Outputs.f90 +++ b/Equipments/TopDrive/TopDrive_Outputs.f90 @@ -1,24 +1,24 @@ -Subroutine TopDrive_Outputs - - use SimulationVariables - use CTopDrivePanelVariables - use SimulationVariables - - IMPLICIT NONE - - - - data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = data%State%TDS%PowerLed - data%EquipmentControl%TopDrivePanel%TopDriveOperationFaultLed = data%State%TDS%OperationFaultLed - - !data%State%TDS%Speed ! to other modules ![RPM] - data%EquipmentControl%TopDrivePanel%TopDriveRpmGauge = data%State%TDS%RpmGaugeOutput ![RPM] - - data%EquipmentControl%TopDrivePanel%TopDriveTorqueGauge = data%State%TDS%TorqueGaugeOutput ![ft.lbf] - - !data%State%TDS%SoundBlower - !data%State%TDS%RPMUnityOutput - - - +Subroutine TopDrive_Outputs + + use SimulationVariables + use CTopDrivePanelVariables + use SimulationVariables + + IMPLICIT NONE + + + + data%EquipmentControl%TopDrivePanel%TopDriveTdsPowerLed = data%State%TDS%PowerLed + data%EquipmentControl%TopDrivePanel%TopDriveOperationFaultLed = data%State%TDS%OperationFaultLed + + !data%State%TDS%Speed ! to other modules ![RPM] + data%EquipmentControl%TopDrivePanel%TopDriveRpmGauge = data%State%TDS%RpmGaugeOutput ![RPM] + + data%EquipmentControl%TopDrivePanel%TopDriveTorqueGauge = data%State%TDS%TorqueGaugeOutput ![ft.lbf] + + !data%State%TDS%SoundBlower + !data%State%TDS%RPMUnityOutput + + + End Subroutine TopDrive_Outputs \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_Solver.f90 b/Equipments/TopDrive/TopDrive_Solver.f90 index 90dc387..e7f7ee9 100644 --- a/Equipments/TopDrive/TopDrive_Solver.f90 +++ b/Equipments/TopDrive/TopDrive_Solver.f90 @@ -1,248 +1,248 @@ -subroutine TopDrive_Solver - - - use SimulationVariables - use UnitySignalsModule - - IMPLICIT NONE - - - - data%State%TDS%TDS_wOld = ((pi*data%State%TDS%Speed)/30.d0) ![rad/s] - - -!****************************************************************** - - - if ( data%State%TDS%PowerState==-1 .or. data%State%TDS%OldPowerMode==-1 ) then !FWD - - if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then ! TdsMu_SPINE - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = 30.d0 - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 30 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 - data%State%TDS%OldPowerMode = -1 - else if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then ! TdsMu_SPINE - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 1000.d0 - data%State%TDS%OldPowerMode = -1 - else if ( data%State%TDS%DrillTorqueState==1 ) then ! TdsMu_Torque - if ( data%State%TDS%RpmKnob>0. ) then - data%State%TDS%OperationFaultLed = 1 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - else - data%State%TDS%OperationFaultLed = 0 - if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = max( 1000.d0,((data%State%TDS%TorqueLimitKnob/10.d0)*60000.d0) ) ![ft.lbf] ???? - data%State%TDS%OldPowerMode = -1 - else if ( Get_TdsConnectionModes()==Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 1000.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - end if - end if - else if ( data%State%TDS%DrillTorqueState==-1 ) then ! TdsMu_DRILL - if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] - data%State%TDS%Speed = min(data%State%TDS%Speed,data%State%TDS%MaxRPM) - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = INT(data%State%TDS%Speed) - data%State%TDS%Torque = ( ((data%State%TDS%J_coef+data%State%TDS%String_JCoef)*(((((pi*data%State%TDS%N_ref)/30.d0)/data%State%TDS%Conv_Ratio)-data%State%TDS%TDS_wOld)/data%State%TDS%time_step))+(data%State%TDS%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] - data%State%TDS%Torque = min(data%State%TDS%Torque,data%State%TDS%MaxTorque) ! [ft.lbf] - data%State%TDS%TorqueGaugeOutput = data%State%TDS%Torque - data%State%TDS%OldPowerMode = -1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.0d0 - data%State%TDS%RpmGaugeOutput = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = INT(data%State%TDS%N_ref/data%State%TDS%Conv_Ratio) - data%State%TDS%Torque = 0.0d0 - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - if ( data%State%TDS%RpmKnob>0. ) then - data%State%TDS%OperationFaultLed = 1 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - else - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - end if - end if - else - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - end if - - else if ( data%State%TDS%PowerState==1 .or. data%State%TDS%OldPowerMode==1 ) then !REV - - if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then ! TdsMu_SPINE - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = 30.d0 - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 30 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 - data%State%TDS%OldPowerMode = 1 - else if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then ! TdsMu_SPINE - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = 30.d0 - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 1000.d0 - data%State%TDS%OldPowerMode = 1 - else if ( data%State%TDS%DrillTorqueState==1 ) then ! TdsMu_Torque - if ( data%State%TDS%RpmKnob>0.d0 ) then - data%State%TDS%OperationFaultLed = 1 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - else - data%State%TDS%OperationFaultLed = 0 - if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 2000.d0 - data%State%TDS%OldPowerMode = 1 - else if ( Get_TdsConnectionModes()==Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 1000.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = -1 - end if - end if - else if ( data%State%TDS%DrillTorqueState==-1 ) then ! TdsMu_DRILL - if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] - data%State%TDS%Speed = min(data%State%TDS%Speed,data%State%TDS%MaxRPM) - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = INT(data%State%TDS%Speed) - data%State%TDS%Torque = ( ((data%State%TDS%J_coef+data%State%TDS%String_JCoef)*(((((pi*data%State%TDS%N_ref)/30.d0)/data%State%TDS%Conv_Ratio)-data%State%TDS%TDS_wOld)/data%State%TDS%time_step))+(data%State%TDS%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] - data%State%TDS%Torque = min(data%State%TDS%Torque,data%State%TDS%MaxTorque) ! [ft.lbf] - data%State%TDS%TorqueGaugeOutput = data%State%TDS%Torque - data%State%TDS%OldPowerMode = 1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.0d0 - data%State%TDS%RpmGaugeOutput = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = INT(data%State%TDS%N_ref/data%State%TDS%Conv_Ratio) - data%State%TDS%Torque = 0.0d0 - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - if ( data%State%TDS%RpmKnob>0. ) then - data%State%TDS%OperationFaultLed = 1 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - else - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - end if - end if - else - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%Speed = 0.d0 !Speed [RPM] - data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed - data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput - data%State%TDS%SoundRPM = 0 - data%State%TDS%Torque = 0.d0 ![ft.lbf] - data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] - data%State%TDS%OldPowerMode = 1 - end if - - end if - - - -!****************************************************************** - - - - +subroutine TopDrive_Solver + + + use SimulationVariables + use UnitySignalsModule + + IMPLICIT NONE + + + + data%State%TDS%TDS_wOld = ((pi*data%State%TDS%Speed)/30.d0) ![rad/s] + + +!****************************************************************** + + + if ( data%State%TDS%PowerState==-1 .or. data%State%TDS%OldPowerMode==-1 ) then !FWD + + if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then ! TdsMu_SPINE + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = 30.d0 + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 30 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 + data%State%TDS%OldPowerMode = -1 + else if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then ! TdsMu_SPINE + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 1000.d0 + data%State%TDS%OldPowerMode = -1 + else if ( data%State%TDS%DrillTorqueState==1 ) then ! TdsMu_Torque + if ( data%State%TDS%RpmKnob>0. ) then + data%State%TDS%OperationFaultLed = 1 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + else + data%State%TDS%OperationFaultLed = 0 + if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = max( 1000.d0,((data%State%TDS%TorqueLimitKnob/10.d0)*60000.d0) ) ![ft.lbf] ???? + data%State%TDS%OldPowerMode = -1 + else if ( Get_TdsConnectionModes()==Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 1000.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + end if + end if + else if ( data%State%TDS%DrillTorqueState==-1 ) then ! TdsMu_DRILL + if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] + data%State%TDS%Speed = min(data%State%TDS%Speed,data%State%TDS%MaxRPM) + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = INT(data%State%TDS%Speed) + data%State%TDS%Torque = ( ((data%State%TDS%J_coef+data%State%TDS%String_JCoef)*(((((pi*data%State%TDS%N_ref)/30.d0)/data%State%TDS%Conv_Ratio)-data%State%TDS%TDS_wOld)/data%State%TDS%time_step))+(data%State%TDS%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] + data%State%TDS%Torque = min(data%State%TDS%Torque,data%State%TDS%MaxTorque) ! [ft.lbf] + data%State%TDS%TorqueGaugeOutput = data%State%TDS%Torque + data%State%TDS%OldPowerMode = -1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.0d0 + data%State%TDS%RpmGaugeOutput = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = INT(data%State%TDS%N_ref/data%State%TDS%Conv_Ratio) + data%State%TDS%Torque = 0.0d0 + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + if ( data%State%TDS%RpmKnob>0. ) then + data%State%TDS%OperationFaultLed = 1 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + else + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + end if + end if + else + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + end if + + else if ( data%State%TDS%PowerState==1 .or. data%State%TDS%OldPowerMode==1 ) then !REV + + if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then ! TdsMu_SPINE + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = 30.d0 + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 30 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 + data%State%TDS%OldPowerMode = 1 + else if ( data%State%TDS%DrillTorqueState==0 .and. Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then ! TdsMu_SPINE + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = 30.d0 + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 1000.d0 + data%State%TDS%OldPowerMode = 1 + else if ( data%State%TDS%DrillTorqueState==1 ) then ! TdsMu_Torque + if ( data%State%TDS%RpmKnob>0.d0 ) then + data%State%TDS%OperationFaultLed = 1 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + else + data%State%TDS%OperationFaultLed = 0 + if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 2000.d0 + data%State%TDS%OldPowerMode = 1 + else if ( Get_TdsConnectionModes()==Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 1000.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = -1 + end if + end if + else if ( data%State%TDS%DrillTorqueState==-1 ) then ! TdsMu_DRILL + if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] + data%State%TDS%Speed = min(data%State%TDS%Speed,data%State%TDS%MaxRPM) + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = INT(data%State%TDS%Speed) + data%State%TDS%Torque = ( ((data%State%TDS%J_coef+data%State%TDS%String_JCoef)*(((((pi*data%State%TDS%N_ref)/30.d0)/data%State%TDS%Conv_Ratio)-data%State%TDS%TDS_wOld)/data%State%TDS%time_step))+(data%State%TDS%String_Torque) )*0.73756215d0 ![N.m]*0.73756215 = [ft.lbf] + data%State%TDS%Torque = min(data%State%TDS%Torque,data%State%TDS%MaxTorque) ! [ft.lbf] + data%State%TDS%TorqueGaugeOutput = data%State%TDS%Torque + data%State%TDS%OldPowerMode = 1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING ) then + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.0d0 + data%State%TDS%RpmGaugeOutput = data%State%TDS%N_ref/data%State%TDS%Conv_Ratio !Speed [RPM] + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = INT(data%State%TDS%N_ref/data%State%TDS%Conv_Ratio) + data%State%TDS%Torque = 0.0d0 + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + if ( data%State%TDS%RpmKnob>0. ) then + data%State%TDS%OperationFaultLed = 1 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + else + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + end if + end if + else + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%Speed = 0.d0 !Speed [RPM] + data%State%TDS%RpmGaugeOutput = data%State%TDS%Speed + data%State%TDS%RPMUnityOutput = -data%State%TDS%RpmGaugeOutput + data%State%TDS%SoundRPM = 0 + data%State%TDS%Torque = 0.d0 ![ft.lbf] + data%State%TDS%TorqueGaugeOutput = 0.d0 ![ft.lbf] + data%State%TDS%OldPowerMode = 1 + end if + + end if + + + +!****************************************************************** + + + + END subroutine \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_StartUp.f90 b/Equipments/TopDrive/TopDrive_StartUp.f90 index 309db24..7edbd5d 100644 --- a/Equipments/TopDrive/TopDrive_StartUp.f90 +++ b/Equipments/TopDrive/TopDrive_StartUp.f90 @@ -1,32 +1,32 @@ -subroutine TopDrive_StartUp - - use SimulationVariables - - IMPLICIT NONE - - - - data%State%TDS%MaxRPM = 200.d0 ![RPM] !??????? motaghayere voroudi - data%State%TDS%MaxTorque = 1500.d0 ![ft.lbf] !??????? motaghayere voroudi - data%State%TDS%time_step = 0.10d0 ![s] - - data%State%TDS%Inertia_Moment = 23.261341d0 ! 23.261341 [kg.m^2] = 552 [lb.ft^2] - data%State%TDS%J_coef = data%State%TDS%Inertia_Moment+(1.d0*(data%State%TDS%Inertia_Moment)) ! [kg.m^2]??????????? - data%State%TDS%String_JCoef = 0.d0 - !data%State%TDS%Mech_Efficiency = 0.930d0 - data%State%TDS%Torque = 0.d0 - data%State%TDS%Speed = 0.d0 - data%State%TDS%OperationFaultLed = 0 - data%State%TDS%OldPowerMode = 0 - data%State%TDS%MotorFaileMalf = 0 - - data%State%TDS%High_Conv_Ratio = 4.825d0 - data%State%TDS%Low_Conv_Ratio = 7.310d0 - data%State%TDS%Conv_Ratio = data%State%TDS%High_Conv_Ratio - - Call TopDrive_OffMode - - - - +subroutine TopDrive_StartUp + + use SimulationVariables + + IMPLICIT NONE + + + + data%State%TDS%MaxRPM = 200.d0 ![RPM] !??????? motaghayere voroudi + data%State%TDS%MaxTorque = 1500.d0 ![ft.lbf] !??????? motaghayere voroudi + data%State%TDS%time_step = 0.10d0 ![s] + + data%State%TDS%Inertia_Moment = 23.261341d0 ! 23.261341 [kg.m^2] = 552 [lb.ft^2] + data%State%TDS%J_coef = data%State%TDS%Inertia_Moment+(1.d0*(data%State%TDS%Inertia_Moment)) ! [kg.m^2]??????????? + data%State%TDS%String_JCoef = 0.d0 + !data%State%TDS%Mech_Efficiency = 0.930d0 + data%State%TDS%Torque = 0.d0 + data%State%TDS%Speed = 0.d0 + data%State%TDS%OperationFaultLed = 0 + data%State%TDS%OldPowerMode = 0 + data%State%TDS%MotorFaileMalf = 0 + + data%State%TDS%High_Conv_Ratio = 4.825d0 + data%State%TDS%Low_Conv_Ratio = 7.310d0 + data%State%TDS%Conv_Ratio = data%State%TDS%High_Conv_Ratio + + Call TopDrive_OffMode + + + + end subroutine \ No newline at end of file diff --git a/Equipments/TopDrive/TopDrive_VARIABLES.f90 b/Equipments/TopDrive/TopDrive_VARIABLES.f90 index 6539c58..f91c39a 100644 --- a/Equipments/TopDrive/TopDrive_VARIABLES.f90 +++ b/Equipments/TopDrive/TopDrive_VARIABLES.f90 @@ -1,41 +1,41 @@ -MODULE TopDrive_VARIABLES - - IMPLICIT NONE - PUBLIC - - - ! REAL, PARAMETER :: pi=3.14159265d0 - - -!**************************************************************************************************** -!**************** Define Top Drive Array **************************************************** - TYPE, PUBLIC :: TDS_Var - -!***** TopDrive_VARIABLES ************************* - INTEGER :: MotorFaileMalf , OverideTorqueLimitMalf , PowerState , OldPowerMode , DrillTorqueState - - REAL :: Speed, Inertia_Moment, Torque, RpmKnob, TorqueLimitKnob - REAL :: Conv_Ratio, High_Conv_Ratio, Low_Conv_Ratio, RateChange, N_new, N_old, N_ref, TDS_wOld ! N[rpm] , w[rad/s] - REAL :: RpmGaugeOutput, RPMUnityOutput, TorqueGaugeOutput, MaxRPM, MaxTorque - REAL :: String_Torque, String_JCoef, J_coef - REAL :: time_step - - - - INTEGER :: PowerLed ! 1=On , 0=Off - INTEGER :: OperationFaultLed - -!************* Sound_VARIABLES ********************** - INTEGER :: SoundRPM - Logical :: SoundBlower - - - - END TYPE TDS_Var -!*********************************************************************************************** -!**************************************************************************************************** - - - - +MODULE TopDrive_VARIABLES + + IMPLICIT NONE + PUBLIC + + + ! REAL, PARAMETER :: pi=3.14159265d0 + + +!**************************************************************************************************** +!**************** Define Top Drive Array **************************************************** + TYPE, PUBLIC :: TDS_Var + +!***** TopDrive_VARIABLES ************************* + INTEGER :: MotorFaileMalf , OverideTorqueLimitMalf , PowerState , OldPowerMode , DrillTorqueState + + REAL :: Speed, Inertia_Moment, Torque, RpmKnob, TorqueLimitKnob + REAL :: Conv_Ratio, High_Conv_Ratio, Low_Conv_Ratio, RateChange, N_new, N_old, N_ref, TDS_wOld ! N[rpm] , w[rad/s] + REAL :: RpmGaugeOutput, RPMUnityOutput, TorqueGaugeOutput, MaxRPM, MaxTorque + REAL :: String_Torque, String_JCoef, J_coef + REAL :: time_step + + + + INTEGER :: PowerLed ! 1=On , 0=Off + INTEGER :: OperationFaultLed + +!************* Sound_VARIABLES ********************** + INTEGER :: SoundRPM + Logical :: SoundBlower + + + + END TYPE TDS_Var +!*********************************************************************************************** +!**************************************************************************************************** + + + + END MODULE \ No newline at end of file diff --git a/FluidFlow/Pressure_Distribution_VARIABLES.f90 b/FluidFlow/Pressure_Distribution_VARIABLES.f90 index 607ab66..07ab767 100644 --- a/FluidFlow/Pressure_Distribution_VARIABLES.f90 +++ b/FluidFlow/Pressure_Distribution_VARIABLES.f90 @@ -1,183 +1,183 @@ -MODULE FricPressDropVarsModule - !! Record of revisions - !! Date Programmer Discription of change - !! ------ ------------ ----------------------- - !! 1396/07/26 Sheikh Original code - !! - - IMPLICIT NONE - - TYPE :: FricPressDropVarsTYPE - - REAL :: TotFricPressLoss ! Total Frictional Pressure Loss [psi] - REAL :: FlowrateNearShoe - INTEGER :: NoHorizontalEl ! number of elements in horizontal pump to string line - INTEGER :: NoStringEl ! number of elements in string - INTEGER :: NoAnnulusEl ! number of elements in annulus space - INTEGER :: NoWellToChokeEl ! number of elements in well head to choke manifold - INTEGER :: NoOpenHoleEl ! number of elements in openhole - INTEGER :: NumbEl ! number of flow elements in horizontal line, string, annulus and openhole - INTEGER :: StringFirstEl ! number of first string element - INTEGER :: StringLastEl ! number of last string element - INTEGER :: AnnulusFirstEl ! number of first annulus element - INTEGER :: AnnulusLastEl ! number of last annulus element - INTEGER :: ChokeFirstEl ! number of first choke element - INTEGER :: ChokeLastEl ! number of last choke element - INTEGER :: OpenholeFirstEl ! number of first openhole element - REAL :: KBOP ! DeltaPBOP = KBOP * Q**2 [psi * min^2 / gal^2] - REAL :: KBit ! DeltaPBit = KBit * Q**2 [psi * min^2 / gal^2] - - !!!! Choke Variables - REAL :: BackPressure , NewBackPressure ! back pressure at riser or choke line [psi] - REAL :: Kchoke ! DeltaPchoke = Kchoke * Q**2 [psi * min^2 / gal^2] - REAL :: TotalOpenChokeArea , OldTotalOpenChokeArea , ChokeBypassArea , NewTotalOpenChokeArea , AreaChange - REAL :: BHPSafetyMargin , AChBHPTol ! BHP safety margin and BHP Tolerance in Auto Choke mode [psi] - REAL(8) :: OnShakerDensity ! Outlet Density of well for displaying in drillwatch and data [ppg] - - LOGICAL :: FloatValveIn - LOGICAL :: FloatValveOpen , FloatValveWasOpen - LOGICAL :: BitTotallyPluged - - REAL :: StMudVol ! Total mud volume of Horizontal and String that may be compressed [gal] - REAL :: AnnMudVol ! Total mud volume of Bottom hole, Annulus and Choke line that may be compressed [gal] - REAL :: PumpToManifoldMudVol - REAL :: StCompressedMudVol ! Compressed mud volume in Horizontal and String [gal] - REAL :: AnnCompressedMudVol ! Compressed mud volume in Bottom hole, Annulus and Choke line [gal] - REAL :: PumpToManifoldCompressedMudVol - REAL :: StDeltaPDueToCompressibility ! Pressure increase due to mud compressibility in Horizontal and String [psi] - REAL :: AnnDeltaPDueToCompressibility ! Pressure increase due to mud compressibility in Bottom hole, Annulus and Choke line [psi] (usually when wellhead is closed) - REAL :: PumpToManifoldDeltaPDueToCompressibility - REAL :: StDeltaPtoDeltaVCompressibility ! string pressure change due to compressibility [psi/gal] - REAL :: AnnDeltaPtoDeltaVCompressibility ! annulus and openhole pressure change due to compressibility [psi/gal] - - - !!!! Problem Variables (Choke and Bit) - - INTEGER :: ManChoke1Plug , ManChoke2Plug ! = 1 if choke is plugged , = 0 else - INTEGER :: ManChoke1Washout , ManChoke2Washout ! = 1 if choke is washed out , = 0 else - INTEGER :: BitJetsPlugged , BitJetsWashedOut - INTEGER :: CasingPressure_DataDisplayMalF, CasingPressure_ChokeMalF - - !!!!!! Note that bit is not an element in these calculations - END TYPE FricPressDropVarsTYPE - - - INTEGER :: ShoeFlowElNo ! the flow element that starts from shoe, in other word the number of upper element adjacent to shoe - - REAL :: ClingingFactor = 0.45 ! in calculating surge and swab pressure changes - REAL :: MudCompressibility = 2.7E-6 ! Volumne change relative to Volume/1psi, for example for change of 1000 psi in pressure, volume changes 0.27% [1/psi] - REAL :: FloatValveMinOpenPressure = 1.0 ! minimum pressure that opens the float valve [psi] - - - TYPE, PUBLIC :: PressDropCalcElemInfo - - !! Geometrical variables - REAL(8) :: Length ! Length of a Flow element [ft] - REAL(8) :: DepthDiff ! Difference between depth of start and end of element [ft] - REAL(8) :: StartX , EndX ! start and end point (measured depth) of flow element [ft] - REAL(8) :: StartTVD , EndTVD ! Start and End point True Vertical Depth of flow element [ft] - REAL :: Od , Id , Dhyd ! Outer, Inner and hydraulic diameter of flow element [in] - REAL :: Area ! area of element [ft^2] - INTEGER :: alpha ! geometry factor: 0 = pipe (ID=0) , 1 = annulus - INTEGER :: FrictionDirection ! = 1 if flowrate is positive, so frictional pressure gradient is in direction of preassumed - ! flowrate, = -1 if not above condition usually in Swab conditions - !! Flow variables - INTEGER :: MaterialType ! = 0 for mud , = 2 for gas - REAL :: volume , vel , density , FlowRate ! volume [ft^3], velocity [ft/s], density of fluid flow [ppg], flow rate [gpm] - REAL :: Gf ! geometry shear rate correction [-] - !! Rheological and frictional variables - REAL :: Theta600 , Theta300 ! Fann data at 600 and 300 rpm as rheological data - ! REAL(8) :: VelCritBing , VelCritPow ! critical velocity in Bingham Plastic and Power law model [ft/min] - REAL :: muPlastic , YieldP ! plastic viscosity [cp] and yield point [lbf/(100*ft^2)] - REAL :: mueff ! Effective or apparent viscosity which is used in calculation of generalized Reynolds number - REAL :: nIndex , kIndex ! n: flow behaivior index [-] and k: consistency factor [lbf*s^n/(100*ft^2)] - REAL :: gammaW , tauW ! shear rate at the wall [1/s] and wall shear stress [lbf/(100*ft^2)] - REAL :: GenRe ! generalized Reynolds number in power law model [-] - REAL :: ReCrit = 2100.0 ! Critical Reynolds number for Newtonian model and Bingham plastic model - REAL :: ReCritLam , ReCritTurb ! laminar and turbulent critical Reynolds - REAL :: f ! Fanning friction factor [-] - REAL :: a , b ! parameters for calculationg friction factor in turbulent regime for power law model [-] - LOGICAL :: LaminarRegime ! = .TRUE. if flow regime is laminar and = .FALSE. if flowregime is not - LOGICAL :: TurbulentRegime ! = .TRUE. if flow regime is turbulent and = .FALSE. if flowregime is not - !! Pressure change variables - REAL :: StartPress , EndPress ! Pressure at start and end of an element [psi] - REAL :: dPdLFric ! frictional pressure drop gradient in each element [psi/ft] - REAL :: dPdLGrav ! gravitional pressure gradient = 0.052 * Density [psi/ft] - REAL :: FricPressLoss ! frictional pressure loss in each element [psi] - REAL :: StaticPressDiff ! static pressure difference between top and bottom of a pocket [psi] always positive - REAL :: FricToQPartialDiff ! partial differentiation of friction relative to volume flow rate - - - - END TYPE PressDropCalcElemInfo - - TYPE (PressDropCalcElemInfo) , ALLOCATABLE :: FlowEl(:) ! FlowEl: Pressure Drop Calculation Elements The dimension is equal to the number of flow elements - - - TYPE, PUBLIC :: FinalPressDropCalcElemInfo - - !!! for use in calculationg properties of a point in 'downhole view' page - - REAL(8) :: StartX , EndX , StartTVD , EndTVD , Length , DepthDiff ! start and end point of flow element [ft] - REAL :: density ! density of fluid flow [ppg], flow rate [gpm] - REAL :: StartPress ! Pressure at start of an element [psi] - REAL :: EndPress ! Pressure at end of an element [psi] - REAL :: dPdLFric ! frictional pressure drop gradient in each element [psi/ft] - REAL :: dPdLGrav ! gravitional pressure gradient = 0.052 * Density [psi/ft] - - END TYPE FinalPressDropCalcElemInfo - - TYPE (FinalPressDropCalcElemInfo) , ALLOCATABLE :: FinalFlowEl(:) ! FlowEl: Pressure Drop Calculation Elements The dimension is equal to the number of flow elements - - - - -END MODULE FricPressDropVarsModule - -MODULE UTUBEVARSModule - - TYPE :: UTUBEVARSTYPE - - REAL :: QUTubeInput ! flow rate from string to annulus which caused by head difference at two sides of U-tube [gpm] - REAL :: QUtubeOutput ! flow rate from annulus to string which caused by head difference at two sides of U-tube [gpm] - REAL :: PressureDp ! pressure at bit or end of drill string from drill string path [psi] - REAL :: PressureAnn ! pressure at bit or end of drill string from annular path [psi] - - END TYPE UTUBEVARSTYPE - TYPE(UTUBEVARSTYPE) :: UTUBEVARS - -END MODULE UTUBEVARSModule - -SUBROUTINE DeallocateFlowTypes - - USE FricPressDropVarsModule - use PressureDisplayVARIABLESModule - use KickVARIABLESModule - - IMPLICIT NONE - - - IF (ALLOCATED(FlowEl)) DEALLOCATE(FlowEl) - IF (ALLOCATED(FinalFlowEl)) DEALLOCATE(FinalFlowEl) - IF (ALLOCATED(GasPocketWeight%Array)) CALL GasPocketWeight%Empty() - IF (ALLOCATED(GasPocketNewPress%Array)) CALL GasPocketNewPress%Empty() - IF (ALLOCATED(GasPocketOldPress%Array)) CALL GasPocketOldPress%Empty() - IF (ALLOCATED(GasPocketNewTemp%Array)) CALL GasPocketNewTemp%Empty() - IF (ALLOCATED(GasPocketOldTemp%Array)) CALL GasPocketOldTemp%Empty() - IF (ALLOCATED(GasPocketNewVol%Array)) CALL GasPocketNewVol%Empty() - IF (ALLOCATED(GasPocketOldVol%Array)) CALL GasPocketOldVol%Empty() - IF (ALLOCATED(GasPocketdeltaVol%Array)) CALL GasPocketdeltaVol%Empty() - IF (ALLOCATED(GasPocketModifiedVol%Array)) CALL GasPocketModifiedVol%Empty() - IF (ALLOCATED(GasPocketFlowInduced%Array)) CALL GasPocketFlowInduced%Empty() - IF (ALLOCATED(GasPocketDensity%Array)) CALL GasPocketDensity%Empty() - IF (ALLOCATED(GasPocketCompressibility%Array)) CALL GasPocketCompressibility%Empty() - IF (ALLOCATED(KickVARIABLES%GasPocketFlowEl)) DEALLOCATE(KickVARIABLES%GasPocketFlowEl) - IF (ALLOCATED(KickVARIABLES%KickJacobian)) DEALLOCATE(KickVARIABLES%KickJacobian) - IF (ALLOCATED(KickVARIABLES%OldKickJacobian)) DEALLOCATE(KickVARIABLES%OldKickJacobian) - IF (ALLOCATED(KickVARIABLES%KickVandPFunction)) DEALLOCATE(KickVARIABLES%KickVandPFunction) - IF (ALLOCATED(KickVARIABLES%KickUnknownVector)) DEALLOCATE(KickVARIABLES%KickUnknownVector) - IF (ALLOCATED(KickVARIABLES%KickCorrectionVector)) DEALLOCATE(KickVARIABLES%KickCorrectionVector) - - -END SUBROUTINE DeallocateFlowTypes +MODULE FricPressDropVarsModule + !! Record of revisions + !! Date Programmer Discription of change + !! ------ ------------ ----------------------- + !! 1396/07/26 Sheikh Original code + !! + + IMPLICIT NONE + + TYPE :: FricPressDropVarsTYPE + + REAL :: TotFricPressLoss ! Total Frictional Pressure Loss [psi] + REAL :: FlowrateNearShoe + INTEGER :: NoHorizontalEl ! number of elements in horizontal pump to string line + INTEGER :: NoStringEl ! number of elements in string + INTEGER :: NoAnnulusEl ! number of elements in annulus space + INTEGER :: NoWellToChokeEl ! number of elements in well head to choke manifold + INTEGER :: NoOpenHoleEl ! number of elements in openhole + INTEGER :: NumbEl ! number of flow elements in horizontal line, string, annulus and openhole + INTEGER :: StringFirstEl ! number of first string element + INTEGER :: StringLastEl ! number of last string element + INTEGER :: AnnulusFirstEl ! number of first annulus element + INTEGER :: AnnulusLastEl ! number of last annulus element + INTEGER :: ChokeFirstEl ! number of first choke element + INTEGER :: ChokeLastEl ! number of last choke element + INTEGER :: OpenholeFirstEl ! number of first openhole element + REAL :: KBOP ! DeltaPBOP = KBOP * Q**2 [psi * min^2 / gal^2] + REAL :: KBit ! DeltaPBit = KBit * Q**2 [psi * min^2 / gal^2] + + !!!! Choke Variables + REAL :: BackPressure , NewBackPressure ! back pressure at riser or choke line [psi] + REAL :: Kchoke ! DeltaPchoke = Kchoke * Q**2 [psi * min^2 / gal^2] + REAL :: TotalOpenChokeArea , OldTotalOpenChokeArea , ChokeBypassArea , NewTotalOpenChokeArea , AreaChange + REAL :: BHPSafetyMargin , AChBHPTol ! BHP safety margin and BHP Tolerance in Auto Choke mode [psi] + REAL(8) :: OnShakerDensity ! Outlet Density of well for displaying in drillwatch and data [ppg] + + LOGICAL :: FloatValveIn + LOGICAL :: FloatValveOpen , FloatValveWasOpen + LOGICAL :: BitTotallyPluged + + REAL :: StMudVol ! Total mud volume of Horizontal and String that may be compressed [gal] + REAL :: AnnMudVol ! Total mud volume of Bottom hole, Annulus and Choke line that may be compressed [gal] + REAL :: PumpToManifoldMudVol + REAL :: StCompressedMudVol ! Compressed mud volume in Horizontal and String [gal] + REAL :: AnnCompressedMudVol ! Compressed mud volume in Bottom hole, Annulus and Choke line [gal] + REAL :: PumpToManifoldCompressedMudVol + REAL :: StDeltaPDueToCompressibility ! Pressure increase due to mud compressibility in Horizontal and String [psi] + REAL :: AnnDeltaPDueToCompressibility ! Pressure increase due to mud compressibility in Bottom hole, Annulus and Choke line [psi] (usually when wellhead is closed) + REAL :: PumpToManifoldDeltaPDueToCompressibility + REAL :: StDeltaPtoDeltaVCompressibility ! string pressure change due to compressibility [psi/gal] + REAL :: AnnDeltaPtoDeltaVCompressibility ! annulus and openhole pressure change due to compressibility [psi/gal] + + + !!!! Problem Variables (Choke and Bit) + + INTEGER :: ManChoke1Plug , ManChoke2Plug ! = 1 if choke is plugged , = 0 else + INTEGER :: ManChoke1Washout , ManChoke2Washout ! = 1 if choke is washed out , = 0 else + INTEGER :: BitJetsPlugged , BitJetsWashedOut + INTEGER :: CasingPressure_DataDisplayMalF, CasingPressure_ChokeMalF + + !!!!!! Note that bit is not an element in these calculations + END TYPE FricPressDropVarsTYPE + + + INTEGER :: ShoeFlowElNo ! the flow element that starts from shoe, in other word the number of upper element adjacent to shoe + + REAL :: ClingingFactor = 0.45 ! in calculating surge and swab pressure changes + REAL :: MudCompressibility = 2.7E-6 ! Volumne change relative to Volume/1psi, for example for change of 1000 psi in pressure, volume changes 0.27% [1/psi] + REAL :: FloatValveMinOpenPressure = 1.0 ! minimum pressure that opens the float valve [psi] + + + TYPE, PUBLIC :: PressDropCalcElemInfo + + !! Geometrical variables + REAL(8) :: Length ! Length of a Flow element [ft] + REAL(8) :: DepthDiff ! Difference between depth of start and end of element [ft] + REAL(8) :: StartX , EndX ! start and end point (measured depth) of flow element [ft] + REAL(8) :: StartTVD , EndTVD ! Start and End point True Vertical Depth of flow element [ft] + REAL :: Od , Id , Dhyd ! Outer, Inner and hydraulic diameter of flow element [in] + REAL :: Area ! area of element [ft^2] + INTEGER :: alpha ! geometry factor: 0 = pipe (ID=0) , 1 = annulus + INTEGER :: FrictionDirection ! = 1 if flowrate is positive, so frictional pressure gradient is in direction of preassumed + ! flowrate, = -1 if not above condition usually in Swab conditions + !! Flow variables + INTEGER :: MaterialType ! = 0 for mud , = 2 for gas + REAL :: volume , vel , density , FlowRate ! volume [ft^3], velocity [ft/s], density of fluid flow [ppg], flow rate [gpm] + REAL :: Gf ! geometry shear rate correction [-] + !! Rheological and frictional variables + REAL :: Theta600 , Theta300 ! Fann data at 600 and 300 rpm as rheological data + ! REAL(8) :: VelCritBing , VelCritPow ! critical velocity in Bingham Plastic and Power law model [ft/min] + REAL :: muPlastic , YieldP ! plastic viscosity [cp] and yield point [lbf/(100*ft^2)] + REAL :: mueff ! Effective or apparent viscosity which is used in calculation of generalized Reynolds number + REAL :: nIndex , kIndex ! n: flow behaivior index [-] and k: consistency factor [lbf*s^n/(100*ft^2)] + REAL :: gammaW , tauW ! shear rate at the wall [1/s] and wall shear stress [lbf/(100*ft^2)] + REAL :: GenRe ! generalized Reynolds number in power law model [-] + REAL :: ReCrit = 2100.0 ! Critical Reynolds number for Newtonian model and Bingham plastic model + REAL :: ReCritLam , ReCritTurb ! laminar and turbulent critical Reynolds + REAL :: f ! Fanning friction factor [-] + REAL :: a , b ! parameters for calculationg friction factor in turbulent regime for power law model [-] + LOGICAL :: LaminarRegime ! = .TRUE. if flow regime is laminar and = .FALSE. if flowregime is not + LOGICAL :: TurbulentRegime ! = .TRUE. if flow regime is turbulent and = .FALSE. if flowregime is not + !! Pressure change variables + REAL :: StartPress , EndPress ! Pressure at start and end of an element [psi] + REAL :: dPdLFric ! frictional pressure drop gradient in each element [psi/ft] + REAL :: dPdLGrav ! gravitional pressure gradient = 0.052 * Density [psi/ft] + REAL :: FricPressLoss ! frictional pressure loss in each element [psi] + REAL :: StaticPressDiff ! static pressure difference between top and bottom of a pocket [psi] always positive + REAL :: FricToQPartialDiff ! partial differentiation of friction relative to volume flow rate + + + + END TYPE PressDropCalcElemInfo + + TYPE (PressDropCalcElemInfo) , ALLOCATABLE :: FlowEl(:) ! FlowEl: Pressure Drop Calculation Elements The dimension is equal to the number of flow elements + + + TYPE, PUBLIC :: FinalPressDropCalcElemInfo + + !!! for use in calculationg properties of a point in 'downhole view' page + + REAL(8) :: StartX , EndX , StartTVD , EndTVD , Length , DepthDiff ! start and end point of flow element [ft] + REAL :: density ! density of fluid flow [ppg], flow rate [gpm] + REAL :: StartPress ! Pressure at start of an element [psi] + REAL :: EndPress ! Pressure at end of an element [psi] + REAL :: dPdLFric ! frictional pressure drop gradient in each element [psi/ft] + REAL :: dPdLGrav ! gravitional pressure gradient = 0.052 * Density [psi/ft] + + END TYPE FinalPressDropCalcElemInfo + + TYPE (FinalPressDropCalcElemInfo) , ALLOCATABLE :: FinalFlowEl(:) ! FlowEl: Pressure Drop Calculation Elements The dimension is equal to the number of flow elements + + + + +END MODULE FricPressDropVarsModule + +MODULE UTUBEVARSModule + + TYPE :: UTUBEVARSTYPE + + REAL :: QUTubeInput ! flow rate from string to annulus which caused by head difference at two sides of U-tube [gpm] + REAL :: QUtubeOutput ! flow rate from annulus to string which caused by head difference at two sides of U-tube [gpm] + REAL :: PressureDp ! pressure at bit or end of drill string from drill string path [psi] + REAL :: PressureAnn ! pressure at bit or end of drill string from annular path [psi] + + END TYPE UTUBEVARSTYPE + TYPE(UTUBEVARSTYPE) :: UTUBEVARS + +END MODULE UTUBEVARSModule + +SUBROUTINE DeallocateFlowTypes + + USE FricPressDropVarsModule + use PressureDisplayVARIABLESModule + use KickVARIABLESModule + + IMPLICIT NONE + + + IF (ALLOCATED(FlowEl)) DEALLOCATE(FlowEl) + IF (ALLOCATED(FinalFlowEl)) DEALLOCATE(FinalFlowEl) + IF (ALLOCATED(GasPocketWeight%Array)) CALL GasPocketWeight%Empty() + IF (ALLOCATED(GasPocketNewPress%Array)) CALL GasPocketNewPress%Empty() + IF (ALLOCATED(GasPocketOldPress%Array)) CALL GasPocketOldPress%Empty() + IF (ALLOCATED(GasPocketNewTemp%Array)) CALL GasPocketNewTemp%Empty() + IF (ALLOCATED(GasPocketOldTemp%Array)) CALL GasPocketOldTemp%Empty() + IF (ALLOCATED(GasPocketNewVol%Array)) CALL GasPocketNewVol%Empty() + IF (ALLOCATED(GasPocketOldVol%Array)) CALL GasPocketOldVol%Empty() + IF (ALLOCATED(GasPocketdeltaVol%Array)) CALL GasPocketdeltaVol%Empty() + IF (ALLOCATED(GasPocketModifiedVol%Array)) CALL GasPocketModifiedVol%Empty() + IF (ALLOCATED(GasPocketFlowInduced%Array)) CALL GasPocketFlowInduced%Empty() + IF (ALLOCATED(GasPocketDensity%Array)) CALL GasPocketDensity%Empty() + IF (ALLOCATED(GasPocketCompressibility%Array)) CALL GasPocketCompressibility%Empty() + IF (ALLOCATED(KickVARIABLES%GasPocketFlowEl)) DEALLOCATE(KickVARIABLES%GasPocketFlowEl) + IF (ALLOCATED(KickVARIABLES%KickJacobian)) DEALLOCATE(KickVARIABLES%KickJacobian) + IF (ALLOCATED(KickVARIABLES%OldKickJacobian)) DEALLOCATE(KickVARIABLES%OldKickJacobian) + IF (ALLOCATED(KickVARIABLES%KickVandPFunction)) DEALLOCATE(KickVARIABLES%KickVandPFunction) + IF (ALLOCATED(KickVARIABLES%KickUnknownVector)) DEALLOCATE(KickVARIABLES%KickUnknownVector) + IF (ALLOCATED(KickVARIABLES%KickCorrectionVector)) DEALLOCATE(KickVARIABLES%KickCorrectionVector) + + +END SUBROUTINE DeallocateFlowTypes \ No newline at end of file diff --git a/Geo/GeoMain.f90 b/Geo/GeoMain.f90 index a72b5bb..ffa7975 100644 --- a/Geo/GeoMain.f90 +++ b/Geo/GeoMain.f90 @@ -1,75 +1,75 @@ -module GeoMain - use CLog4 - implicit none - - public - - integer :: SampleValue, TestValue - - contains - ! subroutine Setup() - ! use CPathChangeEvents - ! implicit none - - ! call BeforeTraverse%Add(InitialVarsBeforePathsChanges) - ! call OnPathOpen%Add(WhenPathOpen) - ! !call OnPathClose%Add(WhenPathClose) - - ! end subroutine - -! subroutine InitialVarsBeforePathsChanges() -! implicit none - -! #ifdef deb -! print*, "ValveOne: FALSE (init)" -! #endif - -! end subroutine - -! subroutine WhenPathOpen(valves) -! implicit none -! integer, allocatable, intent (in) :: valves(:) - -! ! if ( any(valves == 1)) then -! !#ifdef deb -! ! print*, "ValveOne: TRUE" -! !#endif -! ! endif - -! end subroutine - -! subroutine Geo_Setup() -! ! use CSimulationVariables -! implicit none -! !call OnSimulationInitialization%Add(Geo_Init) -! call OnSimulationStop%Add(Geo_Stop) -! call OnGeoStart%Add(Geo_Start) -! call OnGeoStep%Add(Geo_Step) -! !call OnGeoOutput%Add(Geo_Output) -! call OnGeoMain%Add(GeoMainBody) -! end subroutine - - subroutine Geo_Stop - implicit none - !print*, 'Geo_Stop' - end subroutine Geo_Stop - - ! subroutine Geo_Start - ! implicit none - ! !print*, '****************Geo_Start****************' - ! end subroutine Geo_Start - - subroutine Geo_Step - implicit none - end subroutine Geo_Step - - ! !subroutine Geo_Output - ! ! implicit none - ! ! !print*, 'Geo_Output' - ! !end subroutine Geo_Output - - ! subroutine GeoMainBody - ! implicit none - ! end subroutine GeoMainBody - +module GeoMain + use CLog4 + implicit none + + public + + integer :: SampleValue, TestValue + + contains + ! subroutine Setup() + ! use CPathChangeEvents + ! implicit none + + ! call BeforeTraverse%Add(InitialVarsBeforePathsChanges) + ! call OnPathOpen%Add(WhenPathOpen) + ! !call OnPathClose%Add(WhenPathClose) + + ! end subroutine + +! subroutine InitialVarsBeforePathsChanges() +! implicit none + +! #ifdef deb +! print*, "ValveOne: FALSE (init)" +! #endif + +! end subroutine + +! subroutine WhenPathOpen(valves) +! implicit none +! integer, allocatable, intent (in) :: valves(:) + +! ! if ( any(valves == 1)) then +! !#ifdef deb +! ! print*, "ValveOne: TRUE" +! !#endif +! ! endif + +! end subroutine + +! subroutine Geo_Setup() +! ! use CSimulationVariables +! implicit none +! !call OnSimulationInitialization%Add(Geo_Init) +! call OnSimulationStop%Add(Geo_Stop) +! call OnGeoStart%Add(Geo_Start) +! call OnGeoStep%Add(Geo_Step) +! !call OnGeoOutput%Add(Geo_Output) +! call OnGeoMain%Add(GeoMainBody) +! end subroutine + + subroutine Geo_Stop + implicit none + !print*, 'Geo_Stop' + end subroutine Geo_Stop + + ! subroutine Geo_Start + ! implicit none + ! !print*, '****************Geo_Start****************' + ! end subroutine Geo_Start + + subroutine Geo_Step + implicit none + end subroutine Geo_Step + + ! !subroutine Geo_Output + ! ! implicit none + ! ! !print*, 'Geo_Output' + ! !end subroutine Geo_Output + + ! subroutine GeoMainBody + ! implicit none + ! end subroutine GeoMainBody + end module GeoMain \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9b7a9f4 --- /dev/null +++ b/Makefile @@ -0,0 +1,419 @@ +VPATH = \ + CSharp/OperationScenarios/Common/ \ + Rop/ \ + Geo/ \ + Warnings/ \ + TorqueDrag \ + Equipments \ + CSharp/Problems/ \ + Equipments/Pumps/ \ + CSharp/BasicInputs/ \ + Equipments/ChokeControl/ \ + CSharp/StudentStation/ \ + Equipments/RotaryTable \ + Equipments/Drawworks/ \ + Equipments/TopDrive/ \ + CSharp/BasicInputs/WellProfile/ \ + CSharp/OperationScenarios/Unity/ \ + CSharp/OperationScenarios/SoftwareOutputs \ + CSharp/OperationScenarios/SoftwareInputs/ \ + CSharp/OperationScenarios/Permissions \ + CSharp/OperationScenarios/Enums/ \ + CSharp/OperationScenarios/UnitySignals \ + CSharp/OperationScenarios/Notifications/ \ + CSharp/BasicInputs/RigSpecifications/ \ + Equipments/MudSystem/ \ + CSharp/BasicInputs/Geology/ \ + CSharp/Equipments/Tanks/ \ + CSharp/Equipments/DrillWatch/ \ + CSharp/Equipments/ControlPanels/ \ + CSharp/Common/EventHandlers/ \ + CSharp/ErrorLog/ \ + CSharp/Equipments/MudPathFinding/ \ + CSharp/BasicInputs/Bha/ \ + CSharp/DownHole/ \ + TorqueDrag/TD_Modules/ \ + FluidFlow/kick \ + FluidFlow \ + Common \ + CSharp \ + CSharp/Common \ + CSharp/Common/EventHandlers \ + Equipments/BopStack \ + CSharp/Warnings \ + CSharp/OperationScenarios \ + Simulation \ + TorqueDrag/ \ + TorqueDrag/TD_ReadDataSubroutines \ + TorqueDrag/TD_Forces/TD_DropArea \ + TorqueDrag/TD_DrillingSubs \ + TorqueDrag/TD_Forces \ + TorqueDrag/TD_DrillingSubs \ + TorqueDrag/TD_Forces/TD_StraightArea \ + TorqueDrag/TD_Forces/TD_BuildArea \ + TorqueDrag/TD_Forces/TD_ViscousDragForce \ + TorqueDrag/TD_Modules \ + TorqueDrag/TD_StartUp \ + Redis + +FC = ifort +TOP_DIR = . +MOD_DIR = $(TOP_DIR)/mod +OBJ_DIR = $(TOP_DIR)/obj +# MOD_DIR = mod +# OBJ_DIR = obj + +# FCFLAGS = -g -J$(MOD_DIR) -fimplicit-none -Wall -cpp -ffree-line-length-256 +# FCFLAGS = /module:$(MOD_DIR) /fpp +FCFLAGS = -module $(MOD_DIR) -fpp + +TARGET = SimulationCore2 + +SRCS_F =\ + CSharp/OperationScenarios/Common/COperationScenariosVariables.f90 \ + TorqueDrag/TD_Modules/TD_WellGeometry.f90 \ + TorqueDrag/TD_Modules/TD_WellElements.f90 \ + TorqueDrag/TD_Modules/TD_StringConnectionData.f90 \ + TorqueDrag/TD_Modules/GeoElements_FluidModule.f90 \ + Rop/sROP_Variables.f90 \ + Rop/sROP_Other_Variables.f90 \ + FluidFlow/Flow_Startup_VARIABLES.f90 \ + CSharp/DownHole/CDownHoleTypes.f90 \ + Equipments/Drawworks/Drawworks_VARIABLES.f90 \ + Equipments/ChokeControl/CHOKE_VARIABLES.f90 \ + Equipments/TopDrive/TopDrive_VARIABLES.f90 \ + Equipments/RotaryTable/RTable_VARIABLES.f90 \ + Equipments/Pumps/Pumps_VARIABLES.f90 \ + CSharp/Warnings/CWarningsVariables.f90 \ + CSharp/StudentStation/CStudentStationVariables.f90 \ + CSharp/OperationScenarios/SoftwareInputsVariables.f90 \ + CSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 \ + CSharp/OperationScenarios/Permissions/PermissionsVariables.f90 \ + CSharp/OperationScenarios/Notifications/NotificationVariables.f90 \ + CSharp/Equipments/Tanks/CTanksVariables.f90 \ + CSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 \ + CSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 \ + CSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 \ + CSharp/Equipments/ControlPanels/CHookVariables.f90 \ + CSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 \ + CSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 \ + CSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 \ + CSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 \ + CSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 \ + CSharp/BasicInputs/WellProfile/CPathGenerationVariables.f90 \ + CSharp/BasicInputs/WellProfile/CCasingLinerChokeVariables.f90 \ + CSharp/BasicInputs/RigSpecifications/CRigSizeVariables.f90 \ + CSharp/Common/CIActionReference.f90 \ + CSharp/BasicInputs/RigSpecifications/CPowerVariables.f90 \ + CSharp/BasicInputs/RigSpecifications/CHoistingVariables.f90 \ + CSharp/BasicInputs/RigSpecifications/CBopStackVariables.f90 \ + CSharp/BasicInputs/RigSpecifications/CAccumulatorVariables.f90 \ + CSharp/BasicInputs/Geology/CShoeVariables.f90 \ + CSharp/BasicInputs/Geology/CReservoirVariables.f90 \ + CSharp/BasicInputs/Geology/CFormationVariables.f90 \ + CSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 \ + Simulation/Constants.f90 \ + CSharp/Equipments/MudPathFinding/CArrangement.f90 \ + CSharp/OperationScenarios/Unity/CUnityInputs.f90 \ + CSharp/Common/CCommonVariables.f90 \ + Common/DynamicIntegerArray.f90 \ + Rop/RopMain.f90 \ + CSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 \ + Common/DynamicRealArray.f90 \ + Common/DynamicDoubleArray.f90 \ + CSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 \ + Common/DynamicLogicalArray.f90 \ + CSharp/Common/CScaleRange.f90 \ + FluidFlow/FluidFlowMain.f90 \ + TorqueDrag/TD_Modules/TD_GeneralData.f90 \ + CSharp/BasicInputs/WellProfile/CWellSurveyData.f90 \ + CSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 \ + CSharp/ErrorLog/CLog4.f90 \ + CSharp/BasicInputs/RigSpecifications/CPumpsVariables.f90 \ + CSharp/ErrorLog/CLog1.f90 \ + CSharp/BasicInputs/CMudPropertiesVariables.f90 \ + CSharp/ErrorLog/CLog5.f90 \ + CSharp/ErrorLog/CError.f90 \ + CSharp/ErrorLog/CLog2.f90 \ + CSharp/ErrorLog/CLog3.f90 \ + Simulation/CSounds.f90 \ + CSharp/Common/CCommon.f90 \ + FluidFlow/Pressure_Display_VARIABLES.f90 \ + Equipments/BopStack/VARIABLES.f90 \ + FluidFlow/kick/Kick_VARIABLES.f90 \ + CSharp/OperationScenarios/Unity/CUnityOutputs.f90 \ + CSharp/DownHole/CDownHoleVariables.f90 \ + Geo/GeoMain.f90 \ + CSharp/Equipments/MudPathFinding/CPath.f90 \ + CSharp/Problems/CProblemDifinition.f90 \ + FluidFlow/Pressure_Distribution_VARIABLES.f90 \ + Equipments/MudSystem/MudSystem_Variables.f90 \ + TorqueDrag/TD_Modules/TD_DrillStem.f90 \ + CSharp/Equipments/MudPathFinding/CStack.f90 \ + CSharp/Problems/CDrillStemProblemsVariables.f90 \ + CSharp/Problems/COtherProblemsVariables.f90 \ + CSharp/Problems/CLostProblemsVariables.f90 \ + CSharp/Problems/CGaugesProblemsVariables.f90 \ + CSharp/Problems/CBitProblemsVariables.f90 \ + CSharp/Problems/CKickProblemsVariables.f90 \ + CSharp/Problems/CHoistingProblemsVariables.f90 \ + CSharp/Problems/CChokeProblemsVariables.f90 \ + CSharp/Problems/CPumpProblemsVariables.f90 \ + CSharp/Problems/CRotaryProblemsVariables.f90 \ + CSharp/Problems/CMudTreatmentProblemsVariables.f90 \ + CSharp/Problems/CBopProblemsVariables.f90 \ + Simulation/SimulationVariables.f90 \ + CSharp/Problems/CMudTreatmentProblems.f90 \ + CSharp/Problems/CChokeProblems.f90 \ + CSharp/Equipments/ControlPanels/CHook.f90 \ + CSharp/BasicInputs/RigSpecifications/CRigSize.f90 \ + Equipments/BopStack/PipeRams1Main.f90 \ + CSharp/Problems/COtherProblems.f90 \ + CSharp/BasicInputs/RigSpecifications/CAccumulator.f90 \ + CSharp/Problems/CRotaryProblems.f90 \ + CSharp/Problems/CDrillStemProblems.f90 \ + CSharp/BasicInputs/MudProperties.f90 \ + CSharp/BasicInputs/RigSpecifications/CPower.f90 \ + Equipments/RotaryTable/RotaryTableMain.f90 \ + CSharp/Equipments/MudPathFinding/CManifolds.f90 \ + CSharp/Problems/CBopProblems.f90 \ + CSharp/DownHole/DownHole.f90 \ + CSharp/Problems/CHoistingProblems.f90 \ + CSharp/BasicInputs/RigSpecifications/CHoisting.f90 \ + Equipments/Drawworks/DrawworksMain.f90 \ + CSharp/Problems/CLostProblems.f90 \ + CSharp/Problems/CBitProblems.f90 \ + CSharp/BasicInputs/RigSpecifications/CBopStack.f90 \ + Equipments/BopStack/ChokeLineMain.f90 \ + Equipments/Pumps/PumpsMain.f90 \ + Equipments/BopStack/AnnularMain.f90 \ + CSharp/BasicInputs/WellProfile/CPathGeneration.f90 \ + CSharp/BasicInputs/Geology/CReservoir.f90 \ + CSharp/BasicInputs/Bha/CStringConfiguration.f90 \ + Equipments/BopStack/PipeRams2Main.f90 \ + Equipments/BopStack/BlindRamsMain.f90 \ + CSharp/Problems/CKickProblems.f90 \ + CSharp/OperationScenarios/Permissions/Permissions.f90 \ + CSharp/BasicInputs/Geology/CFormation.f90 \ + Equipments/BopStack/KillLineMain.f90 \ + CSharp/Problems/CGaugesProblems.f90 \ + CSharp/BasicInputs/WellProfile/CCasingLinerChoke.f90 \ + CSharp/BasicInputs/Geology/CShoe.f90 \ + CSharp/Problems/CPumpProblems.f90 \ + CSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 \ + CSharp/OperationScenarios/SoftwareInputs.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 \ + Equipments/Pumps/Pump_OffMode_Solver.f90 \ + TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 \ + TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 \ + FluidFlow/kick/Formation_Information.f90 \ + TorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 \ + Equipments/MudSystem/Elements_Creation.f90 \ + Equipments/Drawworks/Drawworks_StartUp.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 \ + TorqueDrag/TD_Forces/TD_CombinedMotionData.f90 \ + TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 \ + TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 \ + Rop/Bit_Specification.f90 \ + Equipments/Pumps/Pump3_MainSolver.f90 \ + Equipments/MudSystem/Kick_Expansion_and_Contraction.f90 \ + TorqueDrag/TD_Forces/TD_ForceCalculation.f90 \ + TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 \ + Equipments/Pumps/Pumps_TotalSolver.f90 \ + TorqueDrag/TD_Forces/TD_StrainCalculation.f90 \ + FluidFlow/Flow_Startup.f90 \ + Equipments/DrillingConsole_ScrLEDs.f90 \ + TorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 \ + TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 \ + TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 \ + Equipments/RotaryTable/RTable_StartUp.f90 \ + Equipments/MudSystem/Utube2_and_Trip_In.f90 \ + Equipments/MudSystem/Kick_Migration.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 \ + TorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 \ + Equipments/MudSystem/Pump_and_Trip_In.f90 \ + Equipments/MudSystem/Deallocate_Normal_Circulation.f90 \ + Equipments/RotaryTable/RTable_OnModeSolver.f90 \ + Equipments/Pumps/Pump_OnMode_Solver.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 \ + TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 \ + Equipments/TopDrive/TopDrive_StartUp.f90 \ + Equipments/MudSystem/FillingWell_By_BellNipple.f90 \ + TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 \ + TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 \ + TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 \ + Equipments/Drawworks/Drawworks_MainSolver.f90 \ + TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 \ + TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 \ + Equipments/RotaryTable/RTable_OffModeSolver.f90 \ + TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 \ + TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 \ + Rop/JetImpactForce.f90 \ + TorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 \ + TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 \ + FluidFlow/Frictional_Press_Drop_Calc.f90 \ + Equipments/TopDrive/TopDrive_Outputs.f90 \ + Equipments/Drawworks/DWFixModeMotion.f90 \ + CSharp/Equipments/ControlPanels/CBopControlPanel.f90 \ + CSharp/OperationScenarios/UnitySignals/UnitySignals.f90 \ + CSharp/BasicInputs/RigSpecifications/CPumps.f90 \ + CSharp/Equipments/ControlPanels/CChokeManifold.f90 \ + CSharp/Equipments/Tanks/CTanks.f90 \ + CSharp/Warnings/CWarnings.f90 \ + TorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 \ + Equipments/Drawworks/Drawworks_Direction.f90 \ + Equipments/RotaryTable/RTable_Outputs.f90 \ + Equipments/Drawworks/DWMalfunction_MotorFailure.f90 \ + TorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 \ + FluidFlow/String_Property_Calculator.f90 \ + FluidFlow/Annulus_Property_Calculator.f90 \ + Equipments/MudSystem/Trip_Out_andPump.f90 \ + Equipments/MudSystem/Utube1_and_Trip_In.f90 \ + Equipments/Pumps/Pump2_MainSolver.f90 \ + Equipments/Pumps/Pump1_MainSolver.f90 \ + FluidFlow/Utube.f90 \ + Equipments/BopStack/BOP.f90 \ + Equipments/BopStack/SHEAR_RAM.f90 \ + Equipments/BopStack/PIPE_RAM2.f90 \ + Equipments/BopStack/LOSS_INPUTS.f90 \ + Equipments/BopStack/ANNULAR.f90 \ + Equipments/BopStack/CHOKE_LINE.f90 \ + Equipments/BopStack/KILL_LINE.f90 \ + Equipments/BopStack/PIPE_RAM1.f90 \ + Equipments/BopStack/BOPstartup.f90 \ + TorqueDrag/TD_StartUp/TD_StartUp.f90 \ + TorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 \ + Equipments/TopDrive/TopDrive_Inputs.f90 \ + Equipments/TopDrive/TopDrive_Solver.f90 \ + CSharp/OperationScenarios/Notifications/Notifications.f90 \ + TorqueDrag/TorqueDragMain.f90 \ + TorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 \ + Equipments/Pumps/Pumps_StartUp.f90 \ + Equipments/ChokeControl/CHOKE.f90 \ + Equipments/ChokeControl/AirPump_Choke_Subs.f90 \ + Equipments/MudSystem/MudSystemStartup.f90 \ + Equipments/TopDrive/TopDriveMain.f90 \ + Equipments/MudSystem/MudSystem.f90 \ + Rop/ROP_MainCalculation.f90 \ + Equipments/Drawworks/Drawworks_Outputs.f90 \ + Equipments/RotaryTable/RTable_Inputs.f90 \ + Equipments/TopDrive/TopDrive_OffMode.f90 \ + Equipments/TopDrive/TopDrive_MainSolver.f90 \ + CSharp/OperationScenarios/Common/OperationScenarios.f90 \ + Equipments/ChokeControl/ChokeControlMain.f90 \ + Equipments/ChokeControl/ChokeStartup.f90 \ + Equipments/MudSystem/MudSystemMain.f90 \ + Equipments/Pumps/Pumps_Inputs.f90 \ + Equipments/Pumps/Pumps_Outputs.f90 \ + FluidFlow/Annulus_and_Openhole_Pressure_Distribution.f90 \ + TorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 \ + Equipments/RotaryTable/RTable_MainSolver.f90 \ + CSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 \ + CSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 \ + CSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 \ + CSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 \ + CSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 \ + CSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 \ + CSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 \ + CSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 \ + CSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 \ + CSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 \ + CSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 \ + CSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 \ + CSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 \ + CSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 \ + CSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 \ + CSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 \ + CSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 \ + CSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 \ + CSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 \ + CSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 \ + CSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 \ + CSharp/OperationScenarios/Notifications/CTongNotification.f90 \ + CSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 \ + CSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 \ + CSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 \ + CSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 \ + CSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 \ + CSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 \ + CSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 \ + CSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 \ + CSharp/OperationScenarios/Common/COperationScenariosSettings.f90 \ + CSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 \ + CSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 \ + CSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 \ + CSharp/OperationScenarios/UnitySignals/CTongEnum.f90 \ + CSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 \ + CSharp/OperationScenarios/Notifications/CSlipsNotification.f90 \ + TorqueDrag/TD_DrillingSubs/TD_DrillStemConfiguration.f90 \ + Equipments/MudSystem/Kick_Influx.f90 \ + Equipments/MudSystem/Disconnecting_Pipe.f90 \ + Equipments/Drawworks/Drawworks_Solver_OffMode.f90 \ + TorqueDrag/TD_DrillingSubs/TD_RemoveComponents.f90 \ + FluidFlow/Horizontal_and_String_Pressure_Distribution.f90 \ + Equipments/Drawworks/Drawworks_INPUTS.f90 \ + TorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 \ + Equipments/Drawworks/Drawworks_Solver.f90 \ + Equipments/Pumps/Pumps_MainSolver.f90 \ + CSharp/OperationScenarios/Common/COperationScenariosMain.f90 \ + Equipments/MudSystem/Circulation_Code_Select.f90 \ + TorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 \ + FluidFlow/kick/Gas_Kick_Calculator.f90 \ + Simulator.f90 \ + TorqueDrag/TD_MainCalculations.f90 \ + FluidFlow/Well_Pressure_Data_Transfer.f90 \ + Equipments/MudSystem/Plot_Final_Mud_Elements.f90 \ + FluidFlow/Fluid_Flow_Solver.f90\ + Redis/Redis_Interface.f90 \ + # SimulationCore2.f90 \ + + +OBJS_T1 = $(patsubst %.f90,%.o,$(SRCS_F)) + +OBJS_T2 = $(notdir $(OBJS_T1)) +# The object files are all to be obj\.o +OBJS_F = $(patsubst %.o,$(OBJ_DIR)/%.o,$(OBJS_T2)) + +all: $(TARGET) + +$(TARGET): $(OBJS_F) + @echo "make TARGET" + cc Redis/redis_io.c -c -o obj/redis_io.o + $(FC) -o $@ $(FCFLAGS) $(OBJS_F) obj/redis_io.o lib/libjsonfortran.a lib/libhiredis.a $@.f90 + ./$@ + +# $(OBJS_F): $(SRCS_F) +# $(FC) $(FCFLAGS) -c -o $@ $< + + +$(OBJ_DIR)/%.o: %.f90 + $(FC) $(FCFLAGS) -c -o $@ $< + +testredis: + @echo "make test redis" + cc Redis/redis_io.c -c -o obj/redis_io.o + $(FC) $(FCFLAGS) -c -o obj/Redis_Interface.o Redis/Redis_Interface.f90 + $(FC) $(FCFLAGS) -o Test_Redis obj/redis_io.o obj/Redis_Interface.o lib/libhiredis.a Test/test_redis.f90 + ./Test_Redis + +clean: + rm $(OBJ_DIR)/*.o SimulationCore2 + +list:; @echo " " + @echo " " + @echo "Source files:" + @echo $(SRCS_F) + @echo " " + @echo "Object files:" + @echo $(OBJS_F) + @echo " " + @echo "Compiler : $(FC)" + @echo "Modules directory : $(MOD_DIR)" + @echo "Object directory : $(OBJ_DIR)" + @echo " " \ No newline at end of file diff --git a/README.md b/README.md index abbba72..1afcc61 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ -# SimulationCore2 - -This project is own by `Eng Farokhain` & `Eng Abolfazl` is working on too. +# SimulationCore2 + +This project is own by `Eng Farokhain` & `Eng Abolfazl` is working on too. diff --git a/ReadMe.txt b/ReadMe.txt index f8a8e78..cabc379 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,25 +1,25 @@ -======================================================================== - Fortran Console Application : "SimulationCore2" Project Overview -======================================================================== - -Intel(R) Fortran Console Application Wizard has created this -"SimulationCore2" project for you as a starting point. - -This file contains a summary of what you will find in each of the files -that make up your project. - -SimulationCore2.vfproj - This is the main project file for Fortran projects generated using an - Application Wizard. It contains information about the version of - Intel(R) Fortran that generated the file, and information about the - platforms, configurations, and project features selected with the - Application Wizard. - -SimulationCore2.f90 - This is the main source file for the Fortran Console application. - It contains the program entry point. - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -///////////////////////////////////////////////////////////////////////////// +======================================================================== + Fortran Console Application : "SimulationCore2" Project Overview +======================================================================== + +Intel(R) Fortran Console Application Wizard has created this +"SimulationCore2" project for you as a starting point. + +This file contains a summary of what you will find in each of the files +that make up your project. + +SimulationCore2.vfproj + This is the main project file for Fortran projects generated using an + Application Wizard. It contains information about the version of + Intel(R) Fortran that generated the file, and information about the + platforms, configurations, and project features selected with the + Application Wizard. + +SimulationCore2.f90 + This is the main source file for the Fortran Console application. + It contains the program entry point. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +///////////////////////////////////////////////////////////////////////////// diff --git a/Redis/Redis_Interface.f90 b/Redis/Redis_Interface.f90 new file mode 100644 index 0000000..2032dd6 --- /dev/null +++ b/Redis/Redis_Interface.f90 @@ -0,0 +1,58 @@ +Module RedisInterface + ! use iso_c_binding, only: c_char + Interface + SUBROUTINE addnums(a, b) BIND(C,name='addnums') + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT + IMPLICIT NONE + INTEGER(C_INT) :: a, b + END SUBROUTINE addnums + + SUBROUTINE initConnection() BIND(C, name='initConnection') + END SUBROUTINE initConnection + + SUBROUTINE setData_C(str) BIND(C,name='setData') + use iso_c_binding, only: c_char + character(kind=c_char) :: str(*) + END SUBROUTINE setData_C + + FUNCTION getData_C(len) BIND(C,name='getData') + use iso_c_binding, only: c_ptr,c_int + integer(kind=c_int)::len + type(c_ptr) :: getData_C + END FUNCTION getData_C + + SUBROUTINE deallocateData() BIND(C, name='deallocData') + END SUBROUTINE deallocateData + + End Interface + + contains + + SUBROUTINE setData(str) + use iso_c_binding, only: c_null_char + character(len=*):: str + character(len=len_trim(str)+1)::c_str + c_str = str//c_null_char + call setData_C(c_str) + END SUBROUTINE setData + + SUBROUTINE getData(string) !result(string) + use iso_c_binding, only: c_char,c_ptr,c_f_pointer + ! 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) = int(l,kind=kind(integer)) + if(.not. allocated(string)) allocate(character(l) :: string) + call c_f_pointer(c_string, string, string_shape) + ! print *,len_trim(string), "chars read." + ! print *,string(1:l) + ! getData2=string + END SUBROUTINE getData + +END Module RedisInterface \ No newline at end of file diff --git a/Redis/example_redis.c b/Redis/example_redis.c new file mode 100644 index 0000000..fde5061 --- /dev/null +++ b/Redis/example_redis.c @@ -0,0 +1,145 @@ +#include +#include +#include +#include "hiredis.h" + +#ifdef _MSC_VER +#include /* For struct timeval */ +#endif + +static void example_argv_command(redisContext *c, size_t n) { + char **argv, tmp[42]; + size_t *argvlen; + redisReply *reply; + + /* We're allocating two additional elements for command and key */ + argv = malloc(sizeof(*argv) * (2 + n)); + argvlen = malloc(sizeof(*argvlen) * (2 + n)); + + /* First the command */ + argv[0] = (char*)"RPUSH"; + argvlen[0] = sizeof("RPUSH") - 1; + + /* Now our key */ + argv[1] = (char*)"argvlist"; + argvlen[1] = sizeof("argvlist") - 1; + + /* Now add the entries we wish to add to the list */ + for (size_t i = 2; i < (n + 2); i++) { + argvlen[i] = snprintf(tmp, sizeof(tmp), "argv-element-%zu", i - 2); + argv[i] = strdup(tmp); + } + + /* Execute the command using redisCommandArgv. We're sending the arguments with + * two explicit arrays. One for each argument's string, and the other for its + * length. */ + reply = redisCommandArgv(c, n + 2, (const char **)argv, (const size_t*)argvlen); + + if (reply == NULL || c->err) { + fprintf(stderr, "Error: Couldn't execute redisCommandArgv\n"); + exit(1); + } + + if (reply->type == REDIS_REPLY_INTEGER) { + printf("%s reply: %lld\n", argv[0], reply->integer); + } + + freeReplyObject(reply); + + /* Clean up */ + for (size_t i = 2; i < (n + 2); i++) { + free(argv[i]); + } + + free(argv); + free(argvlen); +} + +int main(int argc, char **argv) { + unsigned int j, isunix = 0; + redisContext *c; + redisReply *reply; + const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1"; + + if (argc > 2) { + if (*argv[2] == 'u' || *argv[2] == 'U') { + isunix = 1; + /* in this case, host is the path to the unix socket */ + printf("Will connect to unix socket @%s\n", hostname); + } + } + + int port = (argc > 2) ? atoi(argv[2]) : 6379; + + struct timeval timeout = { 1, 500000 }; // 1.5 seconds + if (isunix) { + c = redisConnectUnixWithTimeout(hostname, timeout); + } else { + c = redisConnectWithTimeout(hostname, port, timeout); + } + if (c == NULL || c->err) { + if (c) { + printf("Connection error: %s\n", c->errstr); + redisFree(c); + } else { + printf("Connection error: can't allocate redis context\n"); + } + exit(1); + } + + /* PING server */ + reply = redisCommand(c,"PING"); + printf("PING: %s\n", reply->str); + freeReplyObject(reply); + + /* Set a key */ + reply = redisCommand(c,"SET %s %s", "foo", "hello world"); + printf("SET: %s\n", reply->str); + freeReplyObject(reply); + + /* Set a key using binary safe API */ + reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5); + printf("SET (binary API): %s\n", reply->str); + freeReplyObject(reply); + + /* Try a GET and two INCR */ + reply = redisCommand(c,"GET foo"); + printf("GET foo: %s\n", reply->str); + freeReplyObject(reply); + + reply = redisCommand(c,"INCR counter"); + printf("INCR counter: %lld\n", reply->integer); + freeReplyObject(reply); + /* again ... */ + reply = redisCommand(c,"INCR counter"); + printf("INCR counter: %lld\n", reply->integer); + freeReplyObject(reply); + + /* Create a list of numbers, from 0 to 9 */ + reply = redisCommand(c,"DEL mylist"); + freeReplyObject(reply); + for (j = 0; j < 10; j++) { + char buf[64]; + + snprintf(buf,64,"%u",j); + reply = redisCommand(c,"LPUSH mylist element-%s", buf); + freeReplyObject(reply); + } + + /* Let's check what we have inside the list */ + reply = redisCommand(c,"LRANGE mylist 0 -1"); + if (reply->type == REDIS_REPLY_ARRAY) { + for (j = 0; j < reply->elements; j++) { + printf("%u) %s\n", j, reply->element[j]->str); + } + } + freeReplyObject(reply); + + /* See function for an example of redisCommandArgv */ + example_argv_command(c, 10); + + /* Disconnects and frees the context */ + redisFree(c); + + return 0; +} diff --git a/Redis/redis_io.c b/Redis/redis_io.c new file mode 100644 index 0000000..53680d7 --- /dev/null +++ b/Redis/redis_io.c @@ -0,0 +1,57 @@ +#include +#include +#include +#include "../include/hiredis.h" + +redisContext *context; +char *result; +void addnums( int* a, int* b ) +{ + int c = (*a) + (*b); /* convert pointers to values, then add them */ + printf("sum of %i and %i is %i\n", (*a), (*b), c ); +} + +void initConnection() +{ + context = redisConnect("127.0.0.1", 6379); + if (context == NULL || context->err) { + if (context) { + printf("Error: %s\n", context->errstr); + // handle error + } else { + printf("Can't allocate redis context\n"); + } + } +} + +void setData(char *data) +{ + redisReply *reply; + // printf("Writing data to redis\n"); + // printf("First char =%c \n",data[0]); + printf("%zu chars written\n",strlen(data)); + reply = redisCommand(context, "SET data %s",data); + // printf("data written to redis: %s\n",reply->str); + freeReplyObject(reply); +} + +char *getData(int *len) +{ + redisReply *reply; + // printf("reading data from redis(c function)\n"); + reply = redisCommand(context, "GET data"); + // printf("data read from redis: %s\n",reply->str); + + // printf("reply->str: %s\n",reply->str); + result = (char*) malloc(strlen(reply->str)); + strcpy(result,reply->str); + *len = strlen(result); + freeReplyObject(reply); + return result; +} + +void deallocData() +{ + free(result); + free(context); +} \ No newline at end of file diff --git a/Redis_Interface.o b/Redis_Interface.o new file mode 100644 index 0000000000000000000000000000000000000000..f1cb382a619317431cc67c6568f572a8526f7ca1 GIT binary patch literal 1120 zcmb`F%}N7741lv;wMB&%e?U;EUc`eAdlf|XVnq-SLeI;zozkMMvO9-*(t{7+BMDx7 z3}3+~&}5t04(awHW?_?jGf8HWdA_)ARe~S{mH^HnaE_Xw2@9`R`B9F=jnN6+kfGYIUDEE8XYEYdl17*#`f*LlbtrtxDm| zi~*bPtSOGB;U>God>1vX$uk_uLcHI_vkM1k;4A%eJl&5<$rluH{bH`TheZ0v$mU-e zK)m4m5}#o_G1)^GAK{uWbXQ*}R`!n8AGuK5-;B1b-$EvPN+F-T(anj@NB4B~9sdOt Czc||f literal 0 HcmV?d00001 diff --git a/Rop/Bit_Database.txt b/Rop/Bit_Database.txt index 426a9e0..0820a8d 100644 --- a/Rop/Bit_Database.txt +++ b/Rop/Bit_Database.txt @@ -1,15 +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. +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.f90 b/Rop/Bit_Specification.f90 index 49d37f2..06cf0c1 100644 --- a/Rop/Bit_Specification.f90 +++ b/Rop/Bit_Specification.f90 @@ -1,77 +1,77 @@ -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 - +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 \ No newline at end of file diff --git a/Rop/JetImpactForce.f90 b/Rop/JetImpactForce.f90 index 923f6b6..081ee10 100644 --- a/Rop/JetImpactForce.f90 +++ b/Rop/JetImpactForce.f90 @@ -1,32 +1,32 @@ -subroutine JetImpactForce - - use sROP_Other_Variables - use sROP_Variables - use CStringConfigurationVariables - use CformationVariables - ! use CSimulationVariables - use CmudPropertiesVariables - USE MudSystemVARIABLES -use SimulationVariables !@@@ - - implicit none - - Real(8) :: DeltaPb , NozzleTotalArea , Cd=0.95d0 - - - - - data%State%ROP_Bit%BitFlowrate = data%State%MudSystem%StringFlowRateFinal ![gpm] - !print*, 'data%State%ROP_Bit%BitFlowrate=' , data%State%ROP_Bit%BitFlowrate - !check :: data%State%ROP_Bit%MudDensity [ppg] ?????????? - - NozzleTotalArea = data%State%ROP_Spec%NumberOfBitNozzles*(data%State%ROP_Spec%DiameterOfBitNozzle**2)*(PI/4.d0) - - DeltaPb = (8.311d-5*data%State%ROP_Bit%MudDensity*(data%State%ROP_Bit%BitFlowrate**2))/((Cd**2)*(NozzleTotalArea**2)) - - data%State%ROP_Bit%JetImpactForce = 0.01823d0*Cd*data%State%ROP_Bit%BitFlowrate*sqrt(data%State%ROP_Bit%MudDensity*DeltaPb) - - - - +subroutine JetImpactForce + + use sROP_Other_Variables + use sROP_Variables + use CStringConfigurationVariables + use CformationVariables + ! use CSimulationVariables + use CmudPropertiesVariables + USE MudSystemVARIABLES +use SimulationVariables !@@@ + + implicit none + + Real(8) :: DeltaPb , NozzleTotalArea , Cd=0.95d0 + + + + + data%State%ROP_Bit%BitFlowrate = data%State%MudSystem%StringFlowRateFinal ![gpm] + !print*, 'data%State%ROP_Bit%BitFlowrate=' , data%State%ROP_Bit%BitFlowrate + !check :: data%State%ROP_Bit%MudDensity [ppg] ?????????? + + NozzleTotalArea = data%State%ROP_Spec%NumberOfBitNozzles*(data%State%ROP_Spec%DiameterOfBitNozzle**2)*(PI/4.d0) + + DeltaPb = (8.311d-5*data%State%ROP_Bit%MudDensity*(data%State%ROP_Bit%BitFlowrate**2))/((Cd**2)*(NozzleTotalArea**2)) + + data%State%ROP_Bit%JetImpactForce = 0.01823d0*Cd*data%State%ROP_Bit%BitFlowrate*sqrt(data%State%ROP_Bit%MudDensity*DeltaPb) + + + + end subroutine \ No newline at end of file diff --git a/Rop/ROP_MainCalculation.f90 b/Rop/ROP_MainCalculation.f90 index f826d3b..ec2bda0 100644 --- a/Rop/ROP_MainCalculation.f90 +++ b/Rop/ROP_MainCalculation.f90 @@ -1,244 +1,244 @@ -subroutine ROP_MainCalculation - use SimulationVariables - use sROP_Other_Variables - use sROP_Variables - use CStringConfigurationVariables - use CformationVariables - ! use CSimulationVariables - use CDataDisplayConsole - use SimulationVariables - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use CmudPropertiesVariables - use CHoistingVariables - use SimulationVariables - ! use CDrillingConsole - use SimulationVariables !@ - use SimulationVariables !@, only: RTable - use TD_DrillStemComponents - use SimulationVariables !@ - use PressureDisplayVARIABLESModule - USE MudSystemVARIABLES -use SimulationVariables !@@@ - USE FricPressDropVarsModule - use CReservoirVariables - use CWarnings - ! use ConfigurationVariables, only: TDS - use SimulationVariables !@ - - implicit none - - Integer :: i , zero_ROPcount - !Real(8) :: data%State%ROP_Bit%SetROPGauge - - zero_ROPcount = 0 - data%State%ROP_Bit%NoOfFormations = data%Configuration%Formation%Count - data%State%ROP_Bit%DrillingVerticalDepth = data%State%TD_WellGeneral%WellTotalVerticalLength - - - - !===> MaximumWellDepthExceeded Warning - if ( data%State%ROP_Bit%DrillingVerticalDepth>=(data%Configuration%Formation%Formations(data%Configuration%Formation%Count)%Top+data%Configuration%Formation%Formations(data%Configuration%Formation%Count)%Thickness) ) then - data%State%ROP_Bit%RateOfPenetration = 0.0d0 - Call Set_ROP(data%State%ROP_Bit%RateOfPenetration) - Call Activate_MaximumWellDepthExceeded() - return - end if - !===================================== - - - - if ( data%State%ROP_Spec%FormationNumber/=0 .and. data%EquipmentControl%DrillingConsole%HideDrillingBrake==1 ) then ! Hide Drilling Brake Mode - data%State%ROP_Spec%FormationNumber = data%State%ROP_Spec%FormationNumber - else - do i= 1,data%State%ROP_Bit%NoOfFormations - data%State%ROP_Spec%FormationTopDepth = data%Configuration%Formation%Formations(i)%Top - if (data%State%ROP_Bit%DrillingVerticalDepth>=data%State%ROP_Spec%FormationTopDepth) then - data%State%ROP_Spec%FormationNumber = i - end if - end do - end if - - - - - !!===> Hide Drilling Brake Mode - !if ( data%State%ROP_Spec%FormationNumber==FormationNo .and. HideDrillingBrake==1 ) then !???????????? - ! data%State%ROP_Spec%FormationNumber = FormationNo-1 - !end if - !!============================= - - - - - !data%State%ROP_Spec%BitClass = BitDefinition%BitCode !???????????? - call Bit_Specification - - - - - ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$$** Variables Initialization: *$$$$$**$$$$$**$$$$$**$$$$$**$$$$$ - data%State%ROP_Spec%DiameterOfBit = data%Configuration%StringConfiguration%BitDefinition%BitSize ! unit : [in.] (Typical Range: 3.0 to 30.0) - data%State%ROP_Spec%NumberOfBitNozzles = data%Configuration%StringConfiguration%BitDefinition%BitNozzleNo ! (Typical Values: 1 to 10) - data%State%ROP_Spec%DiameterOfBitNozzle = data%Configuration%StringConfiguration%BitDefinition%BitNozzleSize ! unit : [inch] *** basic input: [1/32 in.] (Typical Range: 8.0 to 32.0) - data%State%ROP_Spec%CriticalMudDensity = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%PorePressureGradient/.465d0*9.d0 ! ????????? delete ,unit : [ppg] or [lb/gal] (Typical Range: 0 to 10.0) - data%State%ROP_Bit%FormationMudDensity = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%PorePressureGradient/0.052d0 - data%State%ROP_Bit%BottomHolePressure = data%State%PressureDisplay%PressureGauges(3) !5200 [psi] - data%State%ROP_Bit%ECD = data%State%ROP_Bit%BottomHolePressure/(0.052*data%State%ROP_Bit%DrillingVerticalDepth) - data%State%ROP_Spec%CriticalWeightOnBit = (data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%ThresholdWeight/5.d0)-(.06d0*(data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%ThresholdWeight-10.d0)) ! unit : [klb/in] (Typical Range: 0 to 10 ----> 0.6 to 2) - !IF (ALLOCATED(FlowEl)) THEN - ! data%State%ROP_Bit%MudViscosity = FlowEl(NoHorizontalEl + NoStringEl)%mueff !13.5 [cP] - data%State%ROP_Bit%MudDensity = data%State%MudSystem%BitMudDensity ! [ppg] - !ELSE - data%State%ROP_Bit%MudViscosity = 13.5 ! [cP] - !data%State%ROP_Bit%MudDensity = 9.2 ! [ppg] - !END IF - data%State%ROP_Bit%MudFlowrate = data%State%MudSystem%StringFlowRateFinal ! [gpm] - data%State%ROP_Spec%ReynoldsNumber = data%State%ROP_Bit%MudFlowrate*data%State%ROP_Bit%MudDensity/(data%State%ROP_Bit%MudViscosity*data%State%ROP_Spec%NumberOfBitNozzles*data%State%ROP_Spec%DiameterOfBitNozzle) ! unit : [dimensionless] (Typical Range: 0.1 to 1000.0) - ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$ End of Variable Initialization $$$$$**$$$$$**$$$$$**$$$$$**$$$$$ - - - - - - ! -----**-----**-----**-----**-----* data%State%ROP_Bit%RateofPenetration Model Coefficients: *-----**-----**-----**-----**----- - data%State%ROP_Spec%a1 = log(data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%Drillablity) - data%State%ROP_Spec%a2 = 1.2799d-04 - data%State%ROP_Spec%a3 = 1.7952d-04 - data%State%ROP_Spec%a4 = 4.0656d-05 - data%State%ROP_Spec%a5 = 2.9021d-01 - data%State%ROP_Spec%a6 = 9.4882d-02 - data%State%ROP_Spec%a7 = 2.1837d-01 - data%State%ROP_Spec%a8 = 4.4915d-01 - data%State%ROP_Spec%dt = 0.1d0 ![s] - data%State%ROP_Spec%TouH = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%Abrasiveness*3600.d0 ! [hr]--->[s] ( Typical Range: 1=0.d0 ) then - data%State%ROP_Spec%f4 = exp(2.303d0*data%State%ROP_Spec%a4*data%State%ROP_Bit%DrillingVerticalDepth*(data%State%ROP_Bit%FormationMudDensity-data%State%ROP_Bit%ECD)) ! Underbalance Drilling Variable - else - data%State%ROP_Spec%f4 = 1.0d0 - end if - - - if (data%State%TD_String%WeightOnBit>0.d0) then - data%State%ROP_Bit%WeightOnBit = data%State%TD_String%WeightOnBit/1000.d0 ![klb] - else - data%State%ROP_Bit%WeightOnBit = 0.d0 - end if - - if ( (data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)0.d0) then - data%State%ROP_Bit%RotarySpeed = data%State%RTable%Speed ![rpm] - else if (data%State%Hoisting%DriveType==0 .and. (data%State%TDS%Speed>0. .or. data%State%RTable%Speed>0.)) then - data%State%ROP_Bit%RotarySpeed = data%State%TDS%Speed+data%State%RTable%Speed ![rpm] - else - data%State%ROP_Bit%RotarySpeed = 0.0d0 - end if - data%State%ROP_Spec%f6 = (data%State%ROP_Bit%RotarySpeed/100.d0)**data%State%ROP_Spec%a6 - - - data%State%ROP_Spec%f7 = exp(-data%State%ROP_Spec%a7*data%State%ROP_Bit%BitWearing) - - - Call JetImpactForce - data%State%ROP_Spec%f8 = data%State%ROP_Bit%JetImpactForce/1000.d0 - - - - - data%State%ROP_Bit%RateOfPenetration = (data%State%ROP_Spec%f1*data%State%ROP_Spec%f2*data%State%ROP_Spec%f3*data%State%ROP_Spec%f4*data%State%ROP_Spec%f5*data%State%ROP_Spec%f6*data%State%ROP_Spec%f7*data%State%ROP_Spec%f8) ![ft/h] - data%State%ROP_Bit%RateOfPenetration = (DINT(data%State%ROP_Bit%RateOfPenetration*10.d0))/10.d0 - - if ( (data%State%TD_WellGeneral%WellTotalLength==data%Configuration%Path%Items(data%Configuration%Path%ItemCount)%MeasuredDepth) ) then - data%State%ROP_Bit%SetROPGauge = data%State%ROP_Bit%RateOfPenetration - Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] - data%State%ROP_Bit%OldROPValue(4) = data%State%ROP_Bit%RateOfPenetration - !print* , 'first rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& - ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth - else if ( ((data%State%TD_WellGeneral%WellTotalLength+(data%State%ROP_Bit%RateOfPenetration*data%State%TD_General%TimeStep/3600.d0))-data%State%ROP_Bit%OldROPDepth)>=0.1 ) then - do i= 1,4 - if ( data%State%ROP_Bit%OldROPValue(i)==0. ) then - zero_ROPcount = zero_ROPcount+1 - end if - end do - data%State%ROP_Bit%SetROPGauge = (data%State%ROP_Bit%RateOfPenetration+data%State%ROP_Bit%OldROPValue(1)+data%State%ROP_Bit%OldROPValue(2)+data%State%ROP_Bit%OldROPValue(3)+data%State%ROP_Bit%OldROPValue(4))/sngl(5-zero_ROPcount) - Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] - do i= 2,4 - data%State%ROP_Bit%OldROPValue(i-1) = data%State%ROP_Bit%OldROPValue(i) - end do - data%State%ROP_Bit%OldROPValue(4) = data%State%ROP_Bit%RateOfPenetration - data%State%ROP_Bit%OldROPDepth = data%State%TD_WellGeneral%WellTotalLength+(data%State%ROP_Bit%RateOfPenetration*data%State%TD_General%TimeStep/3600.d0) - !print* , 'new rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& - ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth - else - Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] - !print* , 'old rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& - ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth - end if - - - - - - - if (data%State%ROP_Bit%RotarySpeed > 0.d0) THEN - data%State%ROP_Bit%BitTorque = ( 3.79d0 + 19.17d0*sqrt( data%State%ROP_Bit%RateOfPenetration / (data%State%ROP_Bit%RotarySpeed*data%State%ROP_Spec%DiameterOfBit)) ) * data%State%ROP_Spec%DiameterOfBit * data%State%ROP_Bit%WeightOnBit * ( 1.d0 / ( 1.d0 + 0.00021d0*data%State%ROP_Bit%DrillingVerticalDepth) ) - !data%State%ROP_Bit%BitTorque = data%State%ROP_Bit%BitTorque/3. !bi dalil taghsim bar 3 shode(chon adad bozorg bude), baadan az rabete check shavad (seyyed gofte) - else - data%State%ROP_Bit%BitTorque = 0.d0 - end if - - - - if ( (data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)<(data%State%ROP_Spec%wdmax) ) then - data%State%ROP_Bit%BitWearing = data%State%ROP_Bit%BitWearing +( (data%State%ROP_Spec%dt*data%State%ROP_Spec%H3/data%State%ROP_Spec%TouH)*((data%State%ROP_Bit%RotarySpeed/100.d0)**data%State%ROP_Spec%H1)*((data%State%ROP_Spec%wdmax-4.d0)/(data%State%ROP_Spec%wdmax-(data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)))*((1.d0+(data%State%ROP_Spec%H2/2.d0))/(1.d0+(data%State%ROP_Spec%H2*data%State%ROP_Bit%BitWearing))) ) - else - data%State%ROP_Bit%BitWearing = 1.0d0 !( Typical Range: 0<=data%State%ROP_Bit%BitWearing<=1 ) - end if - - - - data%State%ROP_Bit%BearingWear = data%State%ROP_Bit%BearingWear+(data%State%ROP_Spec%dt/3600.d0)*(data%State%ROP_Bit%RotarySpeed/100.d0/data%State%ROP_Spec%BrCoef)*((data%State%ROP_Bit%WeightOnBit/4.d0/data%State%ROP_Spec%DiameterOfBit)**1.5d0) - - - !print*, 'data%State%ROP_Bit%RateOfPenetration=', data%State%ROP_Bit%RateOfPenetration - !!print*, 'data%State%ROP_Bit%FormationMudDensity=', data%State%ROP_Bit%FormationMudDensity - !!print*, 'data%State%ROP_Bit%ECD=', data%State%ROP_Bit%ECD - !!print*, 'data%State%ROP_Bit%DrillingVerticalDepth=', data%State%ROP_Bit%DrillingVerticalDepth - !!print*, 'power=', (2.303*data%State%ROP_Spec%a4*data%State%ROP_Bit%DrillingVerticalDepth*(data%State%ROP_Bit%FormationMudDensity-data%State%ROP_Bit%ECD)) - !print*, 'data%State%ROP_Bit%RotarySpeed=', data%State%ROP_Bit%RotarySpeed - !! - !print*, 'data%State%ROP_Spec%f1=', data%State%ROP_Spec%f1 - !print*, 'data%State%ROP_Spec%f2=', data%State%ROP_Spec%f2 - !print*, 'data%State%ROP_Spec%f3=', data%State%ROP_Spec%f3 - !print*, 'data%State%ROP_Spec%f4=', data%State%ROP_Spec%f4 - !print*, 'data%State%ROP_Spec%f5=', data%State%ROP_Spec%f5 - !print*, 'data%State%ROP_Spec%f6=', data%State%ROP_Spec%f6 - !print*, 'data%State%ROP_Spec%f7=', data%State%ROP_Spec%f7 - !print*, 'data%State%ROP_Spec%f8=', data%State%ROP_Spec%f8 - !print*, '***********************' - - - - - +subroutine ROP_MainCalculation + use SimulationVariables + use sROP_Other_Variables + use sROP_Variables + use CStringConfigurationVariables + use CformationVariables + ! use CSimulationVariables + use CDataDisplayConsole + use SimulationVariables + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CmudPropertiesVariables + use CHoistingVariables + use SimulationVariables + ! use CDrillingConsole + use SimulationVariables !@ + use SimulationVariables !@, only: RTable + use TD_DrillStemComponents + use SimulationVariables !@ + use PressureDisplayVARIABLESModule + USE MudSystemVARIABLES +use SimulationVariables !@@@ + USE FricPressDropVarsModule + use CReservoirVariables + use CWarnings + ! use ConfigurationVariables, only: TDS + use SimulationVariables !@ + + implicit none + + Integer :: i , zero_ROPcount + !Real(8) :: data%State%ROP_Bit%SetROPGauge + + zero_ROPcount = 0 + data%State%ROP_Bit%NoOfFormations = data%Configuration%Formation%Count + data%State%ROP_Bit%DrillingVerticalDepth = data%State%TD_WellGeneral%WellTotalVerticalLength + + + + !===> MaximumWellDepthExceeded Warning + if ( data%State%ROP_Bit%DrillingVerticalDepth>=(data%Configuration%Formation%Formations(data%Configuration%Formation%Count)%Top+data%Configuration%Formation%Formations(data%Configuration%Formation%Count)%Thickness) ) then + data%State%ROP_Bit%RateOfPenetration = 0.0d0 + Call Set_ROP(data%State%ROP_Bit%RateOfPenetration) + Call Activate_MaximumWellDepthExceeded() + return + end if + !===================================== + + + + if ( data%State%ROP_Spec%FormationNumber/=0 .and. data%EquipmentControl%DrillingConsole%HideDrillingBrake==1 ) then ! Hide Drilling Brake Mode + data%State%ROP_Spec%FormationNumber = data%State%ROP_Spec%FormationNumber + else + do i= 1,data%State%ROP_Bit%NoOfFormations + data%State%ROP_Spec%FormationTopDepth = data%Configuration%Formation%Formations(i)%Top + if (data%State%ROP_Bit%DrillingVerticalDepth>=data%State%ROP_Spec%FormationTopDepth) then + data%State%ROP_Spec%FormationNumber = i + end if + end do + end if + + + + + !!===> Hide Drilling Brake Mode + !if ( data%State%ROP_Spec%FormationNumber==FormationNo .and. HideDrillingBrake==1 ) then !???????????? + ! data%State%ROP_Spec%FormationNumber = FormationNo-1 + !end if + !!============================= + + + + + !data%State%ROP_Spec%BitClass = BitDefinition%BitCode !???????????? + call Bit_Specification + + + + + ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$$** Variables Initialization: *$$$$$**$$$$$**$$$$$**$$$$$**$$$$$ + data%State%ROP_Spec%DiameterOfBit = data%Configuration%StringConfiguration%BitDefinition%BitSize ! unit : [in.] (Typical Range: 3.0 to 30.0) + data%State%ROP_Spec%NumberOfBitNozzles = data%Configuration%StringConfiguration%BitDefinition%BitNozzleNo ! (Typical Values: 1 to 10) + data%State%ROP_Spec%DiameterOfBitNozzle = data%Configuration%StringConfiguration%BitDefinition%BitNozzleSize ! unit : [inch] *** basic input: [1/32 in.] (Typical Range: 8.0 to 32.0) + data%State%ROP_Spec%CriticalMudDensity = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%PorePressureGradient/.465d0*9.d0 ! ????????? delete ,unit : [ppg] or [lb/gal] (Typical Range: 0 to 10.0) + data%State%ROP_Bit%FormationMudDensity = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%PorePressureGradient/0.052d0 + data%State%ROP_Bit%BottomHolePressure = data%State%PressureDisplay%PressureGauges(3) !5200 [psi] + data%State%ROP_Bit%ECD = data%State%ROP_Bit%BottomHolePressure/(0.052*data%State%ROP_Bit%DrillingVerticalDepth) + data%State%ROP_Spec%CriticalWeightOnBit = (data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%ThresholdWeight/5.d0)-(.06d0*(data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%ThresholdWeight-10.d0)) ! unit : [klb/in] (Typical Range: 0 to 10 ----> 0.6 to 2) + !IF (ALLOCATED(FlowEl)) THEN + ! data%State%ROP_Bit%MudViscosity = FlowEl(NoHorizontalEl + NoStringEl)%mueff !13.5 [cP] + data%State%ROP_Bit%MudDensity = data%State%MudSystem%BitMudDensity ! [ppg] + !ELSE + data%State%ROP_Bit%MudViscosity = 13.5 ! [cP] + !data%State%ROP_Bit%MudDensity = 9.2 ! [ppg] + !END IF + data%State%ROP_Bit%MudFlowrate = data%State%MudSystem%StringFlowRateFinal ! [gpm] + data%State%ROP_Spec%ReynoldsNumber = data%State%ROP_Bit%MudFlowrate*data%State%ROP_Bit%MudDensity/(data%State%ROP_Bit%MudViscosity*data%State%ROP_Spec%NumberOfBitNozzles*data%State%ROP_Spec%DiameterOfBitNozzle) ! unit : [dimensionless] (Typical Range: 0.1 to 1000.0) + ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$ End of Variable Initialization $$$$$**$$$$$**$$$$$**$$$$$**$$$$$ + + + + + + ! -----**-----**-----**-----**-----* data%State%ROP_Bit%RateofPenetration Model Coefficients: *-----**-----**-----**-----**----- + data%State%ROP_Spec%a1 = log(data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%Drillablity) + data%State%ROP_Spec%a2 = 1.2799d-04 + data%State%ROP_Spec%a3 = 1.7952d-04 + data%State%ROP_Spec%a4 = 4.0656d-05 + data%State%ROP_Spec%a5 = 2.9021d-01 + data%State%ROP_Spec%a6 = 9.4882d-02 + data%State%ROP_Spec%a7 = 2.1837d-01 + data%State%ROP_Spec%a8 = 4.4915d-01 + data%State%ROP_Spec%dt = 0.1d0 ![s] + data%State%ROP_Spec%TouH = data%Configuration%Formation%Formations(data%State%ROP_Spec%FormationNumber)%Abrasiveness*3600.d0 ! [hr]--->[s] ( Typical Range: 1=0.d0 ) then + data%State%ROP_Spec%f4 = exp(2.303d0*data%State%ROP_Spec%a4*data%State%ROP_Bit%DrillingVerticalDepth*(data%State%ROP_Bit%FormationMudDensity-data%State%ROP_Bit%ECD)) ! Underbalance Drilling Variable + else + data%State%ROP_Spec%f4 = 1.0d0 + end if + + + if (data%State%TD_String%WeightOnBit>0.d0) then + data%State%ROP_Bit%WeightOnBit = data%State%TD_String%WeightOnBit/1000.d0 ![klb] + else + data%State%ROP_Bit%WeightOnBit = 0.d0 + end if + + if ( (data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)0.d0) then + data%State%ROP_Bit%RotarySpeed = data%State%RTable%Speed ![rpm] + else if (data%Configuration%Hoisting%DriveType==0 .and. (data%State%TDS%Speed>0. .or. data%State%RTable%Speed>0.)) then + data%State%ROP_Bit%RotarySpeed = data%State%TDS%Speed+data%State%RTable%Speed ![rpm] + else + data%State%ROP_Bit%RotarySpeed = 0.0d0 + end if + data%State%ROP_Spec%f6 = (data%State%ROP_Bit%RotarySpeed/100.d0)**data%State%ROP_Spec%a6 + + + data%State%ROP_Spec%f7 = exp(-data%State%ROP_Spec%a7*data%State%ROP_Bit%BitWearing) + + + Call JetImpactForce + data%State%ROP_Spec%f8 = data%State%ROP_Bit%JetImpactForce/1000.d0 + + + + + data%State%ROP_Bit%RateOfPenetration = (data%State%ROP_Spec%f1*data%State%ROP_Spec%f2*data%State%ROP_Spec%f3*data%State%ROP_Spec%f4*data%State%ROP_Spec%f5*data%State%ROP_Spec%f6*data%State%ROP_Spec%f7*data%State%ROP_Spec%f8) ![ft/h] + data%State%ROP_Bit%RateOfPenetration = (DINT(data%State%ROP_Bit%RateOfPenetration*10.d0))/10.d0 + + if ( (data%State%TD_WellGeneral%WellTotalLength==data%Configuration%Path%Items(data%Configuration%Path%ItemCount)%MeasuredDepth) ) then + data%State%ROP_Bit%SetROPGauge = data%State%ROP_Bit%RateOfPenetration + Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] + data%State%ROP_Bit%OldROPValue(4) = data%State%ROP_Bit%RateOfPenetration + !print* , 'first rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& + ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth + else if ( ((data%State%TD_WellGeneral%WellTotalLength+(data%State%ROP_Bit%RateOfPenetration*data%State%TD_General%TimeStep/3600.d0))-data%State%ROP_Bit%OldROPDepth)>=0.1 ) then + do i= 1,4 + if ( data%State%ROP_Bit%OldROPValue(i)==0. ) then + zero_ROPcount = zero_ROPcount+1 + end if + end do + data%State%ROP_Bit%SetROPGauge = (data%State%ROP_Bit%RateOfPenetration+data%State%ROP_Bit%OldROPValue(1)+data%State%ROP_Bit%OldROPValue(2)+data%State%ROP_Bit%OldROPValue(3)+data%State%ROP_Bit%OldROPValue(4))/sngl(5-zero_ROPcount) + Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] + do i= 2,4 + data%State%ROP_Bit%OldROPValue(i-1) = data%State%ROP_Bit%OldROPValue(i) + end do + data%State%ROP_Bit%OldROPValue(4) = data%State%ROP_Bit%RateOfPenetration + data%State%ROP_Bit%OldROPDepth = data%State%TD_WellGeneral%WellTotalLength+(data%State%ROP_Bit%RateOfPenetration*data%State%TD_General%TimeStep/3600.d0) + !print* , 'new rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& + ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth + else + Call Set_ROP(data%State%ROP_Bit%SetROPGauge) ![ft/h] + !print* , 'old rop=' , data%State%ROP_Bit%OldROPValue , data%State%ROP_Bit%RateOfPenetration ,& + ! zero_ROPcount , data%State%ROP_Bit%SetROPGauge , data%State%ROP_Bit%OldROPDepth , data%State%TD_WellGeneral%WellTotalLength , PathGenerations(PathGenerationCount)%MeasuredDepth + end if + + + + + + + if (data%State%ROP_Bit%RotarySpeed > 0.d0) THEN + data%State%ROP_Bit%BitTorque = ( 3.79d0 + 19.17d0*sqrt( data%State%ROP_Bit%RateOfPenetration / (data%State%ROP_Bit%RotarySpeed*data%State%ROP_Spec%DiameterOfBit)) ) * data%State%ROP_Spec%DiameterOfBit * data%State%ROP_Bit%WeightOnBit * ( 1.d0 / ( 1.d0 + 0.00021d0*data%State%ROP_Bit%DrillingVerticalDepth) ) + !data%State%ROP_Bit%BitTorque = data%State%ROP_Bit%BitTorque/3. !bi dalil taghsim bar 3 shode(chon adad bozorg bude), baadan az rabete check shavad (seyyed gofte) + else + data%State%ROP_Bit%BitTorque = 0.d0 + end if + + + + if ( (data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)<(data%State%ROP_Spec%wdmax) ) then + data%State%ROP_Bit%BitWearing = data%State%ROP_Bit%BitWearing +( (data%State%ROP_Spec%dt*data%State%ROP_Spec%H3/data%State%ROP_Spec%TouH)*((data%State%ROP_Bit%RotarySpeed/100.d0)**data%State%ROP_Spec%H1)*((data%State%ROP_Spec%wdmax-4.d0)/(data%State%ROP_Spec%wdmax-(data%State%ROP_Bit%WeightOnBit/data%State%ROP_Spec%DiameterOfBit)))*((1.d0+(data%State%ROP_Spec%H2/2.d0))/(1.d0+(data%State%ROP_Spec%H2*data%State%ROP_Bit%BitWearing))) ) + else + data%State%ROP_Bit%BitWearing = 1.0d0 !( Typical Range: 0<=data%State%ROP_Bit%BitWearing<=1 ) + end if + + + + data%State%ROP_Bit%BearingWear = data%State%ROP_Bit%BearingWear+(data%State%ROP_Spec%dt/3600.d0)*(data%State%ROP_Bit%RotarySpeed/100.d0/data%State%ROP_Spec%BrCoef)*((data%State%ROP_Bit%WeightOnBit/4.d0/data%State%ROP_Spec%DiameterOfBit)**1.5d0) + + + !print*, 'data%State%ROP_Bit%RateOfPenetration=', data%State%ROP_Bit%RateOfPenetration + !!print*, 'data%State%ROP_Bit%FormationMudDensity=', data%State%ROP_Bit%FormationMudDensity + !!print*, 'data%State%ROP_Bit%ECD=', data%State%ROP_Bit%ECD + !!print*, 'data%State%ROP_Bit%DrillingVerticalDepth=', data%State%ROP_Bit%DrillingVerticalDepth + !!print*, 'power=', (2.303*data%State%ROP_Spec%a4*data%State%ROP_Bit%DrillingVerticalDepth*(data%State%ROP_Bit%FormationMudDensity-data%State%ROP_Bit%ECD)) + !print*, 'data%State%ROP_Bit%RotarySpeed=', data%State%ROP_Bit%RotarySpeed + !! + !print*, 'data%State%ROP_Spec%f1=', data%State%ROP_Spec%f1 + !print*, 'data%State%ROP_Spec%f2=', data%State%ROP_Spec%f2 + !print*, 'data%State%ROP_Spec%f3=', data%State%ROP_Spec%f3 + !print*, 'data%State%ROP_Spec%f4=', data%State%ROP_Spec%f4 + !print*, 'data%State%ROP_Spec%f5=', data%State%ROP_Spec%f5 + !print*, 'data%State%ROP_Spec%f6=', data%State%ROP_Spec%f6 + !print*, 'data%State%ROP_Spec%f7=', data%State%ROP_Spec%f7 + !print*, 'data%State%ROP_Spec%f8=', data%State%ROP_Spec%f8 + !print*, '***********************' + + + + + end subroutine \ No newline at end of file diff --git a/Rop/RopMain.f90 b/Rop/RopMain.f90 index ebe1a72..dcd3c8e 100644 --- a/Rop/RopMain.f90 +++ b/Rop/RopMain.f90 @@ -1,20 +1,20 @@ -module RopMain - implicit none - public - contains - - ! subroutine Rop_Setup() - ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(Rop_Init) - ! call OnSimulationStop%Add(Rop_Init) - ! call OnRopStep%Add(Rop_Step) - ! call OnRopOutput%Add(Rop_Output) - ! call OnRopMain%Add(RopMainBody) - ! end subroutine - - subroutine Rop_Step - implicit none - end subroutine Rop_Step - +module RopMain + implicit none + public + contains + + ! subroutine Rop_Setup() + ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(Rop_Init) + ! call OnSimulationStop%Add(Rop_Init) + ! call OnRopStep%Add(Rop_Step) + ! call OnRopOutput%Add(Rop_Output) + ! call OnRopMain%Add(RopMainBody) + ! end subroutine + + subroutine Rop_Step + implicit none + end subroutine Rop_Step + end module RopMain \ No newline at end of file diff --git a/Rop/sROP_Other_Variables.f90 b/Rop/sROP_Other_Variables.f90 index dac3eb6..c5084ad 100644 --- a/Rop/sROP_Other_Variables.f90 +++ b/Rop/sROP_Other_Variables.f90 @@ -1,41 +1,41 @@ -module sROP_Other_Variables - - implicit none - - - ! real(8), parameter :: PI = 3.1415926 ! PI Number - - - - TYPE, PUBLIC :: ROPSpecificationInfo - - integer :: FormationNumber - real(8) :: FormationTopDepth - !CHARACTER(len=20) :: filename ! Name of file to open ??????????????????????????????????tuye type bemune ya bere biroon??? - INTEGER :: name , status ! I/O status - REAL(8) :: H1, H2, H3, wdmax ! The real value read in - ! $$$$$**$$$$$**$$$$$**$$$$$**$$ End of Introduction of Module Inputs $$**$$$$$**$$$$$**$$$$$**$$$$$ - !character(len = 20) :: Formation_Type = 'Shale' ! Default = Shale - ! -----**-----**-----**-----**-----** Bit Type: *-----**-----**-----**-----**----- - Integer :: BitClass ! Default = Rollar Cone - real(8) :: DiameterOfBit ! unit : [in.] (Typical Range: 3.0 to 30.0) - Integer :: NumberOfBitNozzles ! (Typical Range: 1 to 10) - real(8) :: DiameterOfBitNozzle ! unit : [1/32 in.] (Typical Values: 8.0 to 32.0) - ! -----**-----**-----**-----**-----** End of Bit Type: *-----**-----**-----**-----**----- - real(8) :: CriticalMudDensity ! unit : [ppg] or [lb/gal] (Typical Range: 0 to 10.0) - real(8) :: CriticalWeightOnBit ! unit : [klb] (Typical Range: 0 to 10) - real(8) :: ReynoldsNumber ! unit : [klb] (Typical Range: 0.1 to 1000.0) - ! -----**-----**-----**-----**-----** Other data%State%ROP_Bit%RateofPenetration Model Variables: *-----**-----**-----**-----**----- - real(8) :: f1, f2, f3, f4, f5, f6, f7, f8 - real(8) :: a1, a2, a3, a4, a5, a6, a7, a8 - real(8) :: BrCoef - real(8) :: dt , TouH - ! -----**-----**-----**-----**--- End of Other data%State%ROP_Bit%RateofPenetration Model Variables ---**-----**-----**-----**----- - ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$$** End of Variable Definition *$$$$$**$$$$$**$$$$$**$$$$$**$$$$$ - - END TYPE ROPSpecificationInfo - - - - +module sROP_Other_Variables + + implicit none + + + ! real(8), parameter :: PI = 3.1415926 ! PI Number + + + + TYPE, PUBLIC :: ROPSpecificationInfo + + integer :: FormationNumber + real(8) :: FormationTopDepth + !CHARACTER(len=20) :: filename ! Name of file to open ??????????????????????????????????tuye type bemune ya bere biroon??? + INTEGER :: name , status ! I/O status + REAL(8) :: H1, H2, H3, wdmax ! The real value read in + ! $$$$$**$$$$$**$$$$$**$$$$$**$$ End of Introduction of Module Inputs $$**$$$$$**$$$$$**$$$$$**$$$$$ + !character(len = 20) :: Formation_Type = 'Shale' ! Default = Shale + ! -----**-----**-----**-----**-----** Bit Type: *-----**-----**-----**-----**----- + Integer :: BitClass ! Default = Rollar Cone + real(8) :: DiameterOfBit ! unit : [in.] (Typical Range: 3.0 to 30.0) + Integer :: NumberOfBitNozzles ! (Typical Range: 1 to 10) + real(8) :: DiameterOfBitNozzle ! unit : [1/32 in.] (Typical Values: 8.0 to 32.0) + ! -----**-----**-----**-----**-----** End of Bit Type: *-----**-----**-----**-----**----- + real(8) :: CriticalMudDensity ! unit : [ppg] or [lb/gal] (Typical Range: 0 to 10.0) + real(8) :: CriticalWeightOnBit ! unit : [klb] (Typical Range: 0 to 10) + real(8) :: ReynoldsNumber ! unit : [klb] (Typical Range: 0.1 to 1000.0) + ! -----**-----**-----**-----**-----** Other data%State%ROP_Bit%RateofPenetration Model Variables: *-----**-----**-----**-----**----- + real(8) :: f1, f2, f3, f4, f5, f6, f7, f8 + real(8) :: a1, a2, a3, a4, a5, a6, a7, a8 + real(8) :: BrCoef + real(8) :: dt , TouH + ! -----**-----**-----**-----**--- End of Other data%State%ROP_Bit%RateofPenetration Model Variables ---**-----**-----**-----**----- + ! $$$$$**$$$$$**$$$$$**$$$$$**$$$$$** End of Variable Definition *$$$$$**$$$$$**$$$$$**$$$$$**$$$$$ + + END TYPE ROPSpecificationInfo + + + + end module sROP_Other_Variables \ No newline at end of file diff --git a/Rop/sROP_Variables.f90 b/Rop/sROP_Variables.f90 index 70ecc74..8149806 100644 --- a/Rop/sROP_Variables.f90 +++ b/Rop/sROP_Variables.f90 @@ -1,15 +1,15 @@ -module sROP_Variables - -implicit none - - - TYPE, PUBLIC :: ROPInfo - - real(8) :: WeightOnBit , RotarySpeed , MudDensity , FormationMudDensity , MudViscosity , MudFlowrate, BitFlowrate , DrillingVerticalDepth - real(8) :: BitWearing , RateOfPenetration, BitTorque , ECD , BottomHolePressure - real(8) :: BearingWear , JetImpactForce - real(8) :: OldROPDepth , OldROPValue(4) , SetROPGauge - integer :: NoOfFormations - - END TYPE ROPInfo +module sROP_Variables + +implicit none + + + TYPE, PUBLIC :: ROPInfo + + real(8) :: WeightOnBit , RotarySpeed , MudDensity , FormationMudDensity , MudViscosity , MudFlowrate, BitFlowrate , DrillingVerticalDepth + real(8) :: BitWearing , RateOfPenetration, BitTorque , ECD , BottomHolePressure + real(8) :: BearingWear , JetImpactForce + real(8) :: OldROPDepth , OldROPValue(4) , SetROPGauge + integer :: NoOfFormations + + END TYPE ROPInfo end module sROP_Variables \ No newline at end of file diff --git a/Simulation/CSounds.f90 b/Simulation/CSounds.f90 index c911ed9..fd710f1 100644 --- a/Simulation/CSounds.f90 +++ b/Simulation/CSounds.f90 @@ -1,685 +1,685 @@ -module CSounds - use CIActionReference - implicit none - public - - ! Input vars - - ! Output vars - Type ::SoundsType - integer :: MP1s - integer :: MP2s - integer :: MP3s - integer :: RTs - integer :: DwFws - integer :: DwRevs - integer :: DwBrakes - integer :: ChokePumps - integer :: GasThroughChokes - integer :: KoomeyAirPumps - integer :: KoomeyElectricPumps - logical :: RtGearCrashs - logical :: DwGearCrashs - logical :: FloorCollisions - logical :: CrownCollisions - logical :: DwClutchs - logical :: Blowers - logical :: BlowerMp1s - logical :: BlowerMp2s - logical :: BlowerMp3s - logical :: BlowerRts - logical :: BlowerDws - logical :: BlowerStarts - logical :: BlowerShutdowns - logical :: ElectricPumps - end Type SoundsType - Type(SoundsType)::Sounds - - ! procedure (ActionInteger), pointer :: SoundMP1Ptr - ! procedure (ActionInteger), pointer :: SoundMP2Ptr - ! procedure (ActionInteger), pointer :: SoundMP3Ptr - ! procedure (ActionInteger), pointer :: SoundRTPtr - ! procedure (ActionInteger), pointer :: SoundDwFwPtr - ! procedure (ActionInteger), pointer :: SoundDwRevPtr - ! procedure (ActionInteger), pointer :: SoundDwBrakePtr - ! procedure (ActionInteger), pointer :: SoundChokePumpPtr - ! procedure (ActionInteger), pointer :: SoundGasThroughChokePtr - ! procedure (ActionInteger), pointer :: SoundKoomeyAirPumpPtr - ! procedure (ActionInteger), pointer :: SoundKoomeyElectricPumpPtr - ! procedure (ActionBool), pointer :: SoundRtGearCrashPtr - ! procedure (ActionBool), pointer :: SoundDwGearCrashPtr - ! procedure (ActionBool), pointer :: SoundFloorCollisionPtr - ! procedure (ActionBool), pointer :: SoundCrownCollisionPtr - ! procedure (ActionBool), pointer :: SoundDwClutchPtr - ! procedure (ActionBool), pointer :: SoundBlowerPtr - ! procedure (ActionBool), pointer :: SoundBlowerMp1Ptr - ! procedure (ActionBool), pointer :: SoundBlowerMp2Ptr - ! procedure (ActionBool), pointer :: SoundBlowerMp3Ptr - ! procedure (ActionBool), pointer :: SoundBlowerRtPtr - ! procedure (ActionBool), pointer :: SoundBlowerDwPtr - ! procedure (ActionBool), pointer :: SoundBlowerStartPtr - ! procedure (ActionBool), pointer :: SoundBlowerShutdownPtr - ! procedure (ActionBool), pointer :: SoundElectricPumpPtr - - ! private :: SoundMP1Ptr, SoundMP2Ptr, SoundMP3Ptr, SoundRTPtr, SoundDwFwPtr, SoundDwRevPtr,SoundDwBrakePtr,SoundChokePumpPtr,SoundGasThroughChokePtr,SoundKoomeyAirPumpPtr, & - ! SoundKoomeyElectricPumpPtr, SoundRtGearCrashPtr,SoundDwGearCrashPtr,SoundFloorCollisionPtr,SoundCrownCollisionPtr,SoundDwClutchPtr,SoundBlowerPtr, & - ! SoundBlowerMp1Ptr, SoundBlowerMp2Ptr,SoundBlowerMp3Ptr,SoundBlowerRtPtr,SoundBlowerDwPtr,SoundBlowerStartPtr,SoundBlowerShutdownPtr,SoundElectricPumpPtr - - contains - - - - - - subroutine SetSoundMP1(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundMP1Ptr)) call SoundMP1Ptr(v) - Sounds%MP1s = v - end subroutine - - subroutine SetSoundMP2(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundMP2Ptr)) call SoundMP2Ptr(v) - Sounds%MP2s = v - end subroutine - - subroutine SetSoundMP3(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundMP3Ptr)) call SoundMP3Ptr(v) - Sounds%MP3s = v - end subroutine - - subroutine SetSoundRT(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundRTPtr)) call SoundRTPtr(v) - Sounds%RTs = v - end subroutine - - subroutine SetSoundDwFw(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundDwFwPtr)) call SoundDwFwPtr(v) - Sounds%DwFws = v - end subroutine - - subroutine SetSoundDwRev(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundDwRevPtr)) call SoundDwRevPtr(v) - Sounds%DwRevs = v - end subroutine - - subroutine SetSoundDwBrake(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundDwBrakePtr)) call SoundDwBrakePtr(v) - Sounds%DwBrakes = v - end subroutine - - subroutine SetSoundChokePump(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundChokePumpPtr)) call SoundChokePumpPtr(v) - Sounds%ChokePumps = v - end subroutine - - subroutine SetSoundGasThroughChoke(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundGasThroughChokePtr)) call SoundGasThroughChokePtr(v) - Sounds%GasThroughChokes = v - end subroutine - - subroutine SetSoundKoomeyAirPump(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundKoomeyAirPumpPtr)) call SoundKoomeyAirPumpPtr(v) - Sounds%KoomeyAirPumps = v - end subroutine - - subroutine SetSoundKoomeyElectricPump(v) - implicit none - integer, intent(inout) :: v - !if(associated(SoundKoomeyElectricPumpPtr)) call SoundKoomeyElectricPumpPtr(v) - Sounds%KoomeyElectricPumps = v - end subroutine - - subroutine SetSoundRtGearCrash(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundRtGearCrashPtr)) call SoundRtGearCrashPtr(v) - Sounds%RtGearCrashs = v - end subroutine - - subroutine SetSoundDwGearCrash(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundDwGearCrashPtr)) call SoundDwGearCrashPtr(v) - Sounds%DwGearCrashs = v - end subroutine - - subroutine SetSoundFloorCollision(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundFloorCollisionPtr)) call SoundFloorCollisionPtr(v) - Sounds%FloorCollisions = v - end subroutine - - subroutine SetSoundCrownCollision(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundCrownCollisionPtr)) call SoundCrownCollisionPtr(v) - Sounds%CrownCollisions = v - end subroutine - - subroutine SetSoundDwClutch(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundDwClutchPtr)) call SoundDwClutchPtr(v) - Sounds%DwClutchs = v - end subroutine - - subroutine SetSoundBlower(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerPtr)) call SoundBlowerPtr(v) - Sounds%Blowers = v - end subroutine - - subroutine SetSoundBlowerMP1(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerMp1Ptr)) call SoundBlowerMp1Ptr(v) - Sounds%BlowerMp1s = v - end subroutine - - subroutine SetSoundBlowerMP2(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerMp2Ptr)) call SoundBlowerMp2Ptr(v) - Sounds%BlowerMp2s = v - end subroutine - - subroutine SetSoundBlowerMP3(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerMp3Ptr)) call SoundBlowerMp3Ptr(v) - Sounds%BlowerMp3s = v - end subroutine - - subroutine SetSoundBlowerRT(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerRtPtr)) call SoundBlowerRtPtr(v) - Sounds%BlowerRts = v - end subroutine - - subroutine SetSoundBlowerDW(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerDwPtr)) call SoundBlowerDwPtr(v) - Sounds%BlowerDws = v - end subroutine - - - subroutine SetSoundBlowerStart(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerStartPtr)) call SoundBlowerStartPtr(v) - Sounds%BlowerStarts = v - end subroutine - - subroutine SetSoundBlowerShutdown(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundBlowerShutdownPtr)) call SoundBlowerShutdownPtr(v) - Sounds%BlowerShutdowns = v - end subroutine - - - subroutine SetSoundElectricPump(v) - implicit none - logical, intent(inout) :: v - !if(associated(SoundElectricPumpPtr)) call SoundElectricPumpPtr(v) - Sounds%ElectricPumps = v - end subroutine - - - - - - - - - - - - - - - - - - - ! subroutine SubscribeSoundMP1(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP1 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP1' :: SubscribeSoundMP1 - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundMP1Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundMP2(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP2 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP2' :: SubscribeSoundMP2 - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundMP2Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundMP3(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP3 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP3' :: SubscribeSoundMP3 - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundMP3Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundRT(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundRT - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundRT' :: SubscribeSoundRT - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundRTPtr => v - ! end subroutine - - ! subroutine SubscribeSoundDwFw(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwFw - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwFw' :: SubscribeSoundDwFw - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundDwFwPtr => v - ! end subroutine - - ! subroutine SubscribeSoundDwRev(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwRev - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwRev' :: SubscribeSoundDwRev - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundDwRevPtr => v - ! end subroutine - - ! subroutine SubscribeSoundDwBrake(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwBrake - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwBrake' :: SubscribeSoundDwBrake - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundDwBrakePtr => v - ! end subroutine - - ! subroutine SubscribeSoundChokePump(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundChokePump - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundChokePump' :: SubscribeSoundChokePump - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundChokePumpPtr => v - ! end subroutine - - ! subroutine SubscribeSoundGasThroughChoke(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundGasThroughChoke - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundGasThroughChoke' :: SubscribeSoundGasThroughChoke - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundGasThroughChokePtr => v - ! end subroutine - - ! subroutine SubscribeSoundKoomeyAirPump(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundKoomeyAirPump - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundKoomeyAirPump' :: SubscribeSoundKoomeyAirPump - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundKoomeyAirPumpPtr => v - ! end subroutine - - ! subroutine SubscribeSoundKoomeyElectricPump(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundKoomeyElectricPump - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundKoomeyElectricPump' :: SubscribeSoundKoomeyElectricPump - ! implicit none - ! procedure (ActionInteger) :: v - ! SoundKoomeyElectricPumpPtr => v - ! end subroutine - - ! subroutine SubscribeSoundRtGearCrash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundRtGearCrash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundRtGearCrash' :: SubscribeSoundRtGearCrash - ! implicit none - ! procedure (ActionBool) :: v - ! SoundRtGearCrashPtr => v - ! end subroutine - - ! subroutine SubscribeSoundDwGearCrash(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwGearCrash - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwGearCrash' :: SubscribeSoundDwGearCrash - ! implicit none - ! procedure (ActionBool) :: v - ! SoundDwGearCrashPtr => v - ! end subroutine - - ! subroutine SubscribeSoundFloorCollision(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundFloorCollision - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundFloorCollision' :: SubscribeSoundFloorCollision - ! implicit none - ! procedure (ActionBool) :: v - ! SoundFloorCollisionPtr => v - ! end subroutine - - ! subroutine SubscribeSoundCrownCollision(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundCrownCollision - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundCrownCollision' :: SubscribeSoundCrownCollision - ! implicit none - ! procedure (ActionBool) :: v - ! SoundCrownCollisionPtr => v - ! end subroutine - - ! subroutine SubscribeSoundDwClutch(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwClutch - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwClutch' :: SubscribeSoundDwClutch - ! implicit none - ! procedure (ActionBool) :: v - ! SoundDwClutchPtr => v - ! end subroutine - - ! subroutine SubscribeSoundBlower(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlower - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlower' :: SubscribeSoundBlower - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerPtr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerMp1(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp1 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp1' :: SubscribeSoundBlowerMp1 - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerMp1Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerMp2(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp2 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp2' :: SubscribeSoundBlowerMp2 - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerMp2Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerMp3(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp3 - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp3' :: SubscribeSoundBlowerMp3 - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerMp3Ptr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerRt(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerRt - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerRt' :: SubscribeSoundBlowerRt - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerRtPtr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerDw(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerDw - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerDw' :: SubscribeSoundBlowerDw - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerDwPtr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerStart(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerStart - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerStart' :: SubscribeSoundBlowerStart - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerStartPtr => v - ! end subroutine - - ! subroutine SubscribeSoundBlowerShutdown(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerShutdown - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerShutdown' :: SubscribeSoundBlowerShutdown - ! implicit none - ! procedure (ActionBool) :: v - ! SoundBlowerShutdownPtr => v - ! end subroutine - - ! subroutine SubscribeSoundElectricPump(v) - ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundElectricPump - ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundElectricPump' :: SubscribeSoundElectricPump - ! implicit none - ! procedure (ActionBool) :: v - ! SoundElectricPumpPtr => v - ! end subroutine - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! ! Input routines - - ! ! Output routines - ! integer function GetSoundMP1() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP1 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP1' :: GetSoundMP1 - ! implicit none - ! GetSoundMP1 = SoundMP1s - ! end function - - ! integer function GetSoundMP2() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP2 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP2' :: GetSoundMP2 - ! implicit none - ! GetSoundMP2 = SoundMP2s - ! end function - - ! integer function GetSoundMP3() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP3 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP3' :: GetSoundMP3 - ! implicit none - ! GetSoundMP3 = SoundMP3s - ! end function - - ! integer function GetSoundRT() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundRT - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundRT' :: GetSoundRT - ! implicit none - ! GetSoundRT = SoundRTs - ! end function - - ! integer function GetSoundDwFw() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwFw - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwFw' :: GetSoundDwFw - ! implicit none - ! GetSoundDwFw = SoundDwFws - ! end function - - ! integer function GetSoundDwRev() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwRev - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwRev' :: GetSoundDwRev - ! implicit none - ! GetSoundDwRev = SoundDwRevs - ! end function - - ! integer function GetSoundDwBrake() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwBrake - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwBrake' :: GetSoundDwBrake - ! implicit none - ! GetSoundDwBrake = SoundDwBrakes - ! end function - - ! integer function GetSoundChokePump() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundChokePump - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundChokePump' :: GetSoundChokePump - ! implicit none - ! GetSoundChokePump = SoundChokePumps - ! end function - - ! integer function GetSoundGasThroughChoke() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundGasThroughChoke - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundGasThroughChoke' :: GetSoundGasThroughChoke - ! implicit none - ! GetSoundGasThroughChoke = SoundGasThroughChokes - ! end function - - ! integer function GetSoundKoomeyAirPump() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundKoomeyAirPump - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundKoomeyAirPump' :: GetSoundKoomeyAirPump - ! implicit none - ! GetSoundKoomeyAirPump = SoundKoomeyAirPumps - ! end function - - ! integer function GetSoundKoomeyElectricPump() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundKoomeyElectricPump - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundKoomeyElectricPump' :: GetSoundKoomeyElectricPump - ! implicit none - ! GetSoundKoomeyElectricPump = SoundKoomeyElectricPumps - ! end function - - ! logical function GetSoundRtGearCrash() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundRtGearCrash - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundRtGearCrash' :: GetSoundRtGearCrash - ! implicit none - ! GetSoundRtGearCrash = SoundRtGearCrashs - ! end function - - ! logical function GetSoundDwGearCrash() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwGearCrash - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwGearCrash' :: GetSoundDwGearCrash - ! implicit none - ! GetSoundDwGearCrash = SoundDwGearCrashs - ! end function - - ! logical function GetSoundFloorCollision() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundFloorCollision - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundFloorCollision' :: GetSoundFloorCollision - ! implicit none - ! GetSoundFloorCollision = SoundFloorCollisions - ! end function - - ! logical function GetSoundCrownCollision() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundCrownCollision - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundCrownCollision' :: GetSoundCrownCollision - ! implicit none - ! GetSoundCrownCollision = SoundCrownCollisions - ! end function - - ! logical function GetSoundDwClutch() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwClutch - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwClutch' :: GetSoundDwClutch - ! implicit none - ! GetSoundDwClutch = SoundDwClutchs - ! end function - - ! logical function GetSoundBlower() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlower - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlower' :: GetSoundBlower - ! implicit none - ! GetSoundBlower = SoundBlowers - ! end function - - ! logical function GetSoundBlowerMp1() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp1 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp1' :: GetSoundBlowerMp1 - ! implicit none - ! GetSoundBlowerMp1 = SoundBlowerMp1s - ! end function - - ! logical function GetSoundBlowerMp2() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp2 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp2' :: GetSoundBlowerMp2 - ! implicit none - ! GetSoundBlowerMp2 = SoundBlowerMp2s - ! end function - - ! logical function GetSoundBlowerMp3() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp3 - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp3' :: GetSoundBlowerMp3 - ! implicit none - ! GetSoundBlowerMp3 = SoundBlowerMp3s - ! end function - - ! logical function GetSoundBlowerRt() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerRt - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerRt' :: GetSoundBlowerRt - ! implicit none - ! GetSoundBlowerRt = SoundBlowerRts - ! end function - - ! logical function GetSoundBlowerDw() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerDw - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerDw' :: GetSoundBlowerDw - ! implicit none - ! GetSoundBlowerDw = SoundBlowerDws - ! end function - - ! logical function GetSoundBlowerStart() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerStart - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerStart' :: GetSoundBlowerStart - ! implicit none - ! GetSoundBlowerStart = SoundBlowerStarts - ! end function - - ! logical function GetSoundBlowerShutdown() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerShutdown - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerShutdown' :: GetSoundBlowerShutdown - ! implicit none - ! GetSoundBlowerShutdown = SoundBlowerShutdowns - ! end function - - ! logical function GetSoundElectricPump() - ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundElectricPump - ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundElectricPump' :: GetSoundElectricPump - ! implicit none - ! GetSoundElectricPump = SoundElectricPumps - ! end function - - - - - - - - - - - +module CSounds + use CIActionReference + implicit none + public + + ! Input vars + + ! Output vars + Type ::SoundsType + integer :: MP1s + integer :: MP2s + integer :: MP3s + integer :: RTs + integer :: DwFws + integer :: DwRevs + integer :: DwBrakes + integer :: ChokePumps + integer :: GasThroughChokes + integer :: KoomeyAirPumps + integer :: KoomeyElectricPumps + logical :: RtGearCrashs + logical :: DwGearCrashs + logical :: FloorCollisions + logical :: CrownCollisions + logical :: DwClutchs + logical :: Blowers + logical :: BlowerMp1s + logical :: BlowerMp2s + logical :: BlowerMp3s + logical :: BlowerRts + logical :: BlowerDws + logical :: BlowerStarts + logical :: BlowerShutdowns + logical :: ElectricPumps + end Type SoundsType + Type(SoundsType)::Sounds + + ! procedure (ActionInteger), pointer :: SoundMP1Ptr + ! procedure (ActionInteger), pointer :: SoundMP2Ptr + ! procedure (ActionInteger), pointer :: SoundMP3Ptr + ! procedure (ActionInteger), pointer :: SoundRTPtr + ! procedure (ActionInteger), pointer :: SoundDwFwPtr + ! procedure (ActionInteger), pointer :: SoundDwRevPtr + ! procedure (ActionInteger), pointer :: SoundDwBrakePtr + ! procedure (ActionInteger), pointer :: SoundChokePumpPtr + ! procedure (ActionInteger), pointer :: SoundGasThroughChokePtr + ! procedure (ActionInteger), pointer :: SoundKoomeyAirPumpPtr + ! procedure (ActionInteger), pointer :: SoundKoomeyElectricPumpPtr + ! procedure (ActionBool), pointer :: SoundRtGearCrashPtr + ! procedure (ActionBool), pointer :: SoundDwGearCrashPtr + ! procedure (ActionBool), pointer :: SoundFloorCollisionPtr + ! procedure (ActionBool), pointer :: SoundCrownCollisionPtr + ! procedure (ActionBool), pointer :: SoundDwClutchPtr + ! procedure (ActionBool), pointer :: SoundBlowerPtr + ! procedure (ActionBool), pointer :: SoundBlowerMp1Ptr + ! procedure (ActionBool), pointer :: SoundBlowerMp2Ptr + ! procedure (ActionBool), pointer :: SoundBlowerMp3Ptr + ! procedure (ActionBool), pointer :: SoundBlowerRtPtr + ! procedure (ActionBool), pointer :: SoundBlowerDwPtr + ! procedure (ActionBool), pointer :: SoundBlowerStartPtr + ! procedure (ActionBool), pointer :: SoundBlowerShutdownPtr + ! procedure (ActionBool), pointer :: SoundElectricPumpPtr + + ! private :: SoundMP1Ptr, SoundMP2Ptr, SoundMP3Ptr, SoundRTPtr, SoundDwFwPtr, SoundDwRevPtr,SoundDwBrakePtr,SoundChokePumpPtr,SoundGasThroughChokePtr,SoundKoomeyAirPumpPtr, & + ! SoundKoomeyElectricPumpPtr, SoundRtGearCrashPtr,SoundDwGearCrashPtr,SoundFloorCollisionPtr,SoundCrownCollisionPtr,SoundDwClutchPtr,SoundBlowerPtr, & + ! SoundBlowerMp1Ptr, SoundBlowerMp2Ptr,SoundBlowerMp3Ptr,SoundBlowerRtPtr,SoundBlowerDwPtr,SoundBlowerStartPtr,SoundBlowerShutdownPtr,SoundElectricPumpPtr + + contains + + + + + + subroutine SetSoundMP1(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundMP1Ptr)) call SoundMP1Ptr(v) + Sounds%MP1s = v + end subroutine + + subroutine SetSoundMP2(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundMP2Ptr)) call SoundMP2Ptr(v) + Sounds%MP2s = v + end subroutine + + subroutine SetSoundMP3(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundMP3Ptr)) call SoundMP3Ptr(v) + Sounds%MP3s = v + end subroutine + + subroutine SetSoundRT(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundRTPtr)) call SoundRTPtr(v) + Sounds%RTs = v + end subroutine + + subroutine SetSoundDwFw(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundDwFwPtr)) call SoundDwFwPtr(v) + Sounds%DwFws = v + end subroutine + + subroutine SetSoundDwRev(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundDwRevPtr)) call SoundDwRevPtr(v) + Sounds%DwRevs = v + end subroutine + + subroutine SetSoundDwBrake(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundDwBrakePtr)) call SoundDwBrakePtr(v) + Sounds%DwBrakes = v + end subroutine + + subroutine SetSoundChokePump(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundChokePumpPtr)) call SoundChokePumpPtr(v) + Sounds%ChokePumps = v + end subroutine + + subroutine SetSoundGasThroughChoke(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundGasThroughChokePtr)) call SoundGasThroughChokePtr(v) + Sounds%GasThroughChokes = v + end subroutine + + subroutine SetSoundKoomeyAirPump(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundKoomeyAirPumpPtr)) call SoundKoomeyAirPumpPtr(v) + Sounds%KoomeyAirPumps = v + end subroutine + + subroutine SetSoundKoomeyElectricPump(v) + implicit none + integer, intent(inout) :: v + !if(associated(SoundKoomeyElectricPumpPtr)) call SoundKoomeyElectricPumpPtr(v) + Sounds%KoomeyElectricPumps = v + end subroutine + + subroutine SetSoundRtGearCrash(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundRtGearCrashPtr)) call SoundRtGearCrashPtr(v) + Sounds%RtGearCrashs = v + end subroutine + + subroutine SetSoundDwGearCrash(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundDwGearCrashPtr)) call SoundDwGearCrashPtr(v) + Sounds%DwGearCrashs = v + end subroutine + + subroutine SetSoundFloorCollision(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundFloorCollisionPtr)) call SoundFloorCollisionPtr(v) + Sounds%FloorCollisions = v + end subroutine + + subroutine SetSoundCrownCollision(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundCrownCollisionPtr)) call SoundCrownCollisionPtr(v) + Sounds%CrownCollisions = v + end subroutine + + subroutine SetSoundDwClutch(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundDwClutchPtr)) call SoundDwClutchPtr(v) + Sounds%DwClutchs = v + end subroutine + + subroutine SetSoundBlower(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerPtr)) call SoundBlowerPtr(v) + Sounds%Blowers = v + end subroutine + + subroutine SetSoundBlowerMP1(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerMp1Ptr)) call SoundBlowerMp1Ptr(v) + Sounds%BlowerMp1s = v + end subroutine + + subroutine SetSoundBlowerMP2(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerMp2Ptr)) call SoundBlowerMp2Ptr(v) + Sounds%BlowerMp2s = v + end subroutine + + subroutine SetSoundBlowerMP3(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerMp3Ptr)) call SoundBlowerMp3Ptr(v) + Sounds%BlowerMp3s = v + end subroutine + + subroutine SetSoundBlowerRT(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerRtPtr)) call SoundBlowerRtPtr(v) + Sounds%BlowerRts = v + end subroutine + + subroutine SetSoundBlowerDW(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerDwPtr)) call SoundBlowerDwPtr(v) + Sounds%BlowerDws = v + end subroutine + + + subroutine SetSoundBlowerStart(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerStartPtr)) call SoundBlowerStartPtr(v) + Sounds%BlowerStarts = v + end subroutine + + subroutine SetSoundBlowerShutdown(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundBlowerShutdownPtr)) call SoundBlowerShutdownPtr(v) + Sounds%BlowerShutdowns = v + end subroutine + + + subroutine SetSoundElectricPump(v) + implicit none + logical, intent(inout) :: v + !if(associated(SoundElectricPumpPtr)) call SoundElectricPumpPtr(v) + Sounds%ElectricPumps = v + end subroutine + + + + + + + + + + + + + + + + + + + ! subroutine SubscribeSoundMP1(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP1 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP1' :: SubscribeSoundMP1 + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundMP1Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundMP2(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP2 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP2' :: SubscribeSoundMP2 + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundMP2Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundMP3(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundMP3 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundMP3' :: SubscribeSoundMP3 + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundMP3Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundRT(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundRT + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundRT' :: SubscribeSoundRT + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundRTPtr => v + ! end subroutine + + ! subroutine SubscribeSoundDwFw(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwFw + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwFw' :: SubscribeSoundDwFw + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundDwFwPtr => v + ! end subroutine + + ! subroutine SubscribeSoundDwRev(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwRev + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwRev' :: SubscribeSoundDwRev + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundDwRevPtr => v + ! end subroutine + + ! subroutine SubscribeSoundDwBrake(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwBrake + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwBrake' :: SubscribeSoundDwBrake + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundDwBrakePtr => v + ! end subroutine + + ! subroutine SubscribeSoundChokePump(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundChokePump + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundChokePump' :: SubscribeSoundChokePump + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundChokePumpPtr => v + ! end subroutine + + ! subroutine SubscribeSoundGasThroughChoke(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundGasThroughChoke + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundGasThroughChoke' :: SubscribeSoundGasThroughChoke + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundGasThroughChokePtr => v + ! end subroutine + + ! subroutine SubscribeSoundKoomeyAirPump(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundKoomeyAirPump + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundKoomeyAirPump' :: SubscribeSoundKoomeyAirPump + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundKoomeyAirPumpPtr => v + ! end subroutine + + ! subroutine SubscribeSoundKoomeyElectricPump(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundKoomeyElectricPump + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundKoomeyElectricPump' :: SubscribeSoundKoomeyElectricPump + ! implicit none + ! procedure (ActionInteger) :: v + ! SoundKoomeyElectricPumpPtr => v + ! end subroutine + + ! subroutine SubscribeSoundRtGearCrash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundRtGearCrash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundRtGearCrash' :: SubscribeSoundRtGearCrash + ! implicit none + ! procedure (ActionBool) :: v + ! SoundRtGearCrashPtr => v + ! end subroutine + + ! subroutine SubscribeSoundDwGearCrash(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwGearCrash + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwGearCrash' :: SubscribeSoundDwGearCrash + ! implicit none + ! procedure (ActionBool) :: v + ! SoundDwGearCrashPtr => v + ! end subroutine + + ! subroutine SubscribeSoundFloorCollision(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundFloorCollision + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundFloorCollision' :: SubscribeSoundFloorCollision + ! implicit none + ! procedure (ActionBool) :: v + ! SoundFloorCollisionPtr => v + ! end subroutine + + ! subroutine SubscribeSoundCrownCollision(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundCrownCollision + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundCrownCollision' :: SubscribeSoundCrownCollision + ! implicit none + ! procedure (ActionBool) :: v + ! SoundCrownCollisionPtr => v + ! end subroutine + + ! subroutine SubscribeSoundDwClutch(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundDwClutch + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundDwClutch' :: SubscribeSoundDwClutch + ! implicit none + ! procedure (ActionBool) :: v + ! SoundDwClutchPtr => v + ! end subroutine + + ! subroutine SubscribeSoundBlower(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlower + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlower' :: SubscribeSoundBlower + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerPtr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerMp1(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp1 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp1' :: SubscribeSoundBlowerMp1 + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerMp1Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerMp2(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp2 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp2' :: SubscribeSoundBlowerMp2 + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerMp2Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerMp3(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerMp3 + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerMp3' :: SubscribeSoundBlowerMp3 + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerMp3Ptr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerRt(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerRt + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerRt' :: SubscribeSoundBlowerRt + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerRtPtr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerDw(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerDw + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerDw' :: SubscribeSoundBlowerDw + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerDwPtr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerStart(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerStart + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerStart' :: SubscribeSoundBlowerStart + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerStartPtr => v + ! end subroutine + + ! subroutine SubscribeSoundBlowerShutdown(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundBlowerShutdown + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundBlowerShutdown' :: SubscribeSoundBlowerShutdown + ! implicit none + ! procedure (ActionBool) :: v + ! SoundBlowerShutdownPtr => v + ! end subroutine + + ! subroutine SubscribeSoundElectricPump(v) + ! !DEC$ ATTRIBUTES DLLEXPORT :: SubscribeSoundElectricPump + ! !DEC$ ATTRIBUTES ALIAS: 'SubscribeSoundElectricPump' :: SubscribeSoundElectricPump + ! implicit none + ! procedure (ActionBool) :: v + ! SoundElectricPumpPtr => v + ! end subroutine + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ! ! Input routines + + ! ! Output routines + ! integer function GetSoundMP1() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP1 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP1' :: GetSoundMP1 + ! implicit none + ! GetSoundMP1 = SoundMP1s + ! end function + + ! integer function GetSoundMP2() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP2 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP2' :: GetSoundMP2 + ! implicit none + ! GetSoundMP2 = SoundMP2s + ! end function + + ! integer function GetSoundMP3() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundMP3 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundMP3' :: GetSoundMP3 + ! implicit none + ! GetSoundMP3 = SoundMP3s + ! end function + + ! integer function GetSoundRT() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundRT + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundRT' :: GetSoundRT + ! implicit none + ! GetSoundRT = SoundRTs + ! end function + + ! integer function GetSoundDwFw() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwFw + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwFw' :: GetSoundDwFw + ! implicit none + ! GetSoundDwFw = SoundDwFws + ! end function + + ! integer function GetSoundDwRev() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwRev + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwRev' :: GetSoundDwRev + ! implicit none + ! GetSoundDwRev = SoundDwRevs + ! end function + + ! integer function GetSoundDwBrake() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwBrake + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwBrake' :: GetSoundDwBrake + ! implicit none + ! GetSoundDwBrake = SoundDwBrakes + ! end function + + ! integer function GetSoundChokePump() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundChokePump + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundChokePump' :: GetSoundChokePump + ! implicit none + ! GetSoundChokePump = SoundChokePumps + ! end function + + ! integer function GetSoundGasThroughChoke() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundGasThroughChoke + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundGasThroughChoke' :: GetSoundGasThroughChoke + ! implicit none + ! GetSoundGasThroughChoke = SoundGasThroughChokes + ! end function + + ! integer function GetSoundKoomeyAirPump() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundKoomeyAirPump + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundKoomeyAirPump' :: GetSoundKoomeyAirPump + ! implicit none + ! GetSoundKoomeyAirPump = SoundKoomeyAirPumps + ! end function + + ! integer function GetSoundKoomeyElectricPump() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundKoomeyElectricPump + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundKoomeyElectricPump' :: GetSoundKoomeyElectricPump + ! implicit none + ! GetSoundKoomeyElectricPump = SoundKoomeyElectricPumps + ! end function + + ! logical function GetSoundRtGearCrash() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundRtGearCrash + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundRtGearCrash' :: GetSoundRtGearCrash + ! implicit none + ! GetSoundRtGearCrash = SoundRtGearCrashs + ! end function + + ! logical function GetSoundDwGearCrash() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwGearCrash + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwGearCrash' :: GetSoundDwGearCrash + ! implicit none + ! GetSoundDwGearCrash = SoundDwGearCrashs + ! end function + + ! logical function GetSoundFloorCollision() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundFloorCollision + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundFloorCollision' :: GetSoundFloorCollision + ! implicit none + ! GetSoundFloorCollision = SoundFloorCollisions + ! end function + + ! logical function GetSoundCrownCollision() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundCrownCollision + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundCrownCollision' :: GetSoundCrownCollision + ! implicit none + ! GetSoundCrownCollision = SoundCrownCollisions + ! end function + + ! logical function GetSoundDwClutch() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundDwClutch + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundDwClutch' :: GetSoundDwClutch + ! implicit none + ! GetSoundDwClutch = SoundDwClutchs + ! end function + + ! logical function GetSoundBlower() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlower + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlower' :: GetSoundBlower + ! implicit none + ! GetSoundBlower = SoundBlowers + ! end function + + ! logical function GetSoundBlowerMp1() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp1 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp1' :: GetSoundBlowerMp1 + ! implicit none + ! GetSoundBlowerMp1 = SoundBlowerMp1s + ! end function + + ! logical function GetSoundBlowerMp2() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp2 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp2' :: GetSoundBlowerMp2 + ! implicit none + ! GetSoundBlowerMp2 = SoundBlowerMp2s + ! end function + + ! logical function GetSoundBlowerMp3() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerMp3 + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerMp3' :: GetSoundBlowerMp3 + ! implicit none + ! GetSoundBlowerMp3 = SoundBlowerMp3s + ! end function + + ! logical function GetSoundBlowerRt() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerRt + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerRt' :: GetSoundBlowerRt + ! implicit none + ! GetSoundBlowerRt = SoundBlowerRts + ! end function + + ! logical function GetSoundBlowerDw() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerDw + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerDw' :: GetSoundBlowerDw + ! implicit none + ! GetSoundBlowerDw = SoundBlowerDws + ! end function + + ! logical function GetSoundBlowerStart() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerStart + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerStart' :: GetSoundBlowerStart + ! implicit none + ! GetSoundBlowerStart = SoundBlowerStarts + ! end function + + ! logical function GetSoundBlowerShutdown() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundBlowerShutdown + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundBlowerShutdown' :: GetSoundBlowerShutdown + ! implicit none + ! GetSoundBlowerShutdown = SoundBlowerShutdowns + ! end function + + ! logical function GetSoundElectricPump() + ! !DEC$ ATTRIBUTES DLLEXPORT :: GetSoundElectricPump + ! !DEC$ ATTRIBUTES ALIAS: 'GetSoundElectricPump' :: GetSoundElectricPump + ! implicit none + ! GetSoundElectricPump = SoundElectricPumps + ! end function + + + + + + + + + + + end module CSounds \ No newline at end of file diff --git a/Simulation/Constants.f90 b/Simulation/Constants.f90 index a434d9a..b05d419 100644 --- a/Simulation/Constants.f90 +++ b/Simulation/Constants.f90 @@ -1,5 +1,5 @@ -module Constants - real,parameter::PI=3.14159265 - REAL:: SG=1.12,WDENS=1000,GRAVITY=9.81,RE_CR=2000,NU=9e-6 - +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 \ No newline at end of file diff --git a/Simulation/SimulationVariables.f90 b/Simulation/SimulationVariables.f90 index ff935c4..6b1ccbb 100644 --- a/Simulation/SimulationVariables.f90 +++ b/Simulation/SimulationVariables.f90 @@ -1,210 +1,214 @@ -module SimulationVariables - use Constants - - use COperationScenariosVariables - use CStringConfigurationVariables - use CFormationVariables - use CReservoirVariables - use CShoeVariables - use CAccumulatorVariables - use CBopStackVariables - use CHoistingVariables - use CPowerVariables - use CPumpsVariables - use CRigSizeVariables - use CCasingLinerChokeVariables - use CPathGenerationVariables - use CWellSurveyDataVariables - use CMudPropertiesVariables - - use CBopControlPanelVariables - use CChokeControlPanelVariables - use CChokeManifoldVariables - use CDataDisplayConsoleVariables - use CDrillingConsoleVariables - use CHookVariables - use CStandPipeManifoldVariables - use CTopDrivePanelVariables - use CDrillWatchVariables - use CTanksVariables - use COperationScenariosVariables - use NotificationVariables - use PermissionsVariables - use UnitySignalVariables - - use CBitProblemsVariables - use CBopProblemsVariables - use CChokeProblemsVariables - use CDrillStemProblemsVariables - use CGaugesProblemsVariables - use CHoistingProblemsVariables - use CKickProblemsVariables - use CLostProblemsVariables - use CMudTreatmentProblemsVariables - use COtherProblemsVariables - use CPumpProblemsVariables - use CRotaryProblemsVariables - - use CStudentStationVariables - use CWarningsVariables - - use BopVariables - use Pumps_VARIABLES - use RTable_VARIABLES - use TopDrive_VARIABLES - use CHOKEVARIABLES - use Drawworks_VARIABLES - USE MudSystemVARIABLES - use Fluid_Flow_Startup_Vars - use PressureDisplayVARIABLESModule - use FricPressDropVarsModule - - use sROP_Other_Variables - use sROP_Variables - - use GeoElements_FluidModule - use TD_DrillStemComponents - use TD_GeneralData - use TD_StringConnectionData - use TD_WellElements - use TD_WellGeometry - - type ConfigurationType - Type(StringConfigurationType)::StringConfiguration - Type(FormationType) :: Formation - Type(ReservoirType)::Reservoir - Type(ShoeType)::Shoe - Type(AccumulatorType)::Accumulator - Type(BopStackSpecificationType)::BopStack - Type(HoistingType)::Hoisting - Type(PowerType)::Power - Type(PumpSpecificationType)::Pumps - Type(RigSizeType)::RigSize - Type(CasingLinerChokeType)::CasingLinerChoke - Type(PathGenerationType)::Path - ! Type(WellSurveyDataType)::WellSurveyData - Type(MudPropertiesType)::Mud - end type ConfigurationType - - type EquipmentControlType - ! Control Panels - type(BopControlPanelType) :: BopControlPanel - Type(ChokeControlPanelType)::ChokeControlPanel - Type(ChokeManifoldType)::ChokeManifold - Type(DataDisplayConsoleType) :: DataDisplayConsole - TYPE(DrillingConsoleType) :: DrillingConsole - Type(HookType)::Hook - type(StandPipeManifoldType)::StandPipeManifold - Type(TopDrivePanelType)::TopDrivePanel - ! Drill Watch - Type(DrillingWatchType)::DrillingWatch - Type(TankType)::Tank - end type EquipmentControlType - - type SimulationStateType - Type(HoistingType)::Hoisting - type(OperationScenarioType)::OperationScenario - type(NotificationType)::notifications - type(PermissionsType):: permissions - type(UnitySignalsType):: unitySignals - type(StudentStationType)::StudentStation - !Bop - type(BopStackInputType)::BopStackInput - type(BopStackAccType)::BopStackAcc - type(RamLineType)::RamLine - type(AnnularComputationalType)::AnnularComputational - type(AnnularType)::Annular - type(PipeRams1Type)::PipeRam1 - type(ShearRamType)::ShearRam - type(PipeRam2Type)::PipeRam2 - type(ChokeLineType)::ChokeLine - type(KillLineType)::KillLine - type(PumpsType)::Pumps - TYPE(BOP_TypeVars), DIMENSION(1:6) :: RAM - TYPE(BOP_TypeVars2D) :: RAMS - !Choke - type(ChokeType)::Choke - type(AirDrivenPumpType)::AirDrivenPump - type(AirPumpLineType)::AirPumpLine - TYPE(CHOKE_TypeVars), DIMENSION(1:2) :: CHOOKE - ! - !!Drawworks - TYPE(Drawworks_Var) :: Drawworks - !! - !!!MudSystem - type(MudSystemType)::MudSystem - TYPE(MUD_TypeVars), DIMENSION(1:10) :: MUD - - !!Pumps - Type(Pumps_Var) :: MPumps - TYPE(Pump_Var), DIMENSION(1:3) :: PUMP - ! - TYPE(RTable_Var) :: RTable - TYPE(TDS_Var) :: TDS - ! - !! FluidFlow - TYPE(GasData) :: GasType(3) ! 1 = methane , 2 = Hydrogen sulfide , 3 = Carbon dioxid - TYPE(PressureDisplayVARIABLESTYPE) :: PressureDisplay - ! TYPE(ObservationAndGaugePointsInformations) , ALLOCATABLE :: ObservationPoint(:) - TYPE(FricPressDropVarsTYPE) :: FricPressDrop - ! - !Rop - TYPE(ROPSpecificationInfo) :: ROP_Spec - TYPE(ROPInfo) :: ROP_Bit - - !TD - TYPE(Geo_Data) :: TDGeo - TYPE(F_StringData) , Allocatable :: F_String(:) - TYPE(F_IntervalsCountsData):: F_Counts - TYPE(F_IntervalData) , Allocatable :: F_Interval(:) - TYPE(OD_AnnulusData) :: OD_Annulus(4) - - TYPE(TD_DrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStem - TYPE(TD_SeparatedDrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStems - TYPE(TD_StringInfo) :: TD_String - TYPE(TD_AddRemoveInfo) :: TD_Count - TYPE(CStringComponents), ALLOCATABLE, DIMENSION(:) :: G_StringElement - TYPE(TD_RemovedVolumeInfo) :: TD_Vol - TYPE(TD_GeneralInfo) :: TD_General - TYPE(TD_BOPInfo) :: TD_BOP - TYPE(CBopElement) :: TD_BOPElement(4) - TYPE(TD_StringconnectionInfo) :: TD_StConn - TYPE(TD_LoadInfo) :: TD_Load - TYPE(TD_WellElementsInfo) :: TD_WellEl - TYPE(TD_CasingInfo), ALLOCATABLE, DIMENSION(:) :: TD_Casing - TYPE(TD_LinerInfo), ALLOCATABLE, DIMENSION(:) :: TD_Liner - TYPE(TD_OpenHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_OpenHole - TYPE(TD_ROPHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_ROPHole - TYPE(TD_WellGeneralInfo) :: TD_WellGeneral - TYPE(TD_WellGeometryData), Allocatable :: TD_WellGeo(:) - - - end type SimulationStateType - - type ProblemsType - type(BitProblemsType)::BitProblems - type(BopProblemsType)::BopProblems - type(ChokeProblemsType)::ChokeProblems - type(DrillStemProblemsType)::DrillStemProblems - type(GaugesProblemsType)::GaugesProblems - type(HoistingProblemsType):: HoistingProblems - type(KickProblemsType)::KickProblems - type(LostProblemsType)::LostProblems - type(MudTreatmentProblemsType)::MudTreatmentProblems - type(OtherProblemsType)::OtherProblems - type(PumpProblemsType)::PumpProblems - type(RotaryProblemsType)::RotaryProblems - end type ProblemsType - - type SimulationDataType - type(WarmingsType)::Warnings - type(SimulationStateType)::State - type(EquipmentControlType)::EquipmentControl - type(ConfigurationType)::Configuration - type(ProblemsType)::problems - end type SimulationDataType - - type(SimulationDataType)::data -contains - -end module SimulationVariables +module SimulationVariables + use Constants + use json_module + + use COperationScenariosVariables + use CStringConfigurationVariables + use CFormationVariables + use CReservoirVariables + use CShoeVariables + use CAccumulatorVariables + use CBopStackVariables + use CHoistingVariables + use CPowerVariables + use CPumpsVariables + use CRigSizeVariables + use CCasingLinerChokeVariables + use CPathGenerationVariables + use CWellSurveyDataVariables + use CMudPropertiesVariables + + use CBopControlPanelVariables + use CChokeControlPanelVariables + use CChokeManifoldVariables + use CDataDisplayConsoleVariables + use CDrillingConsoleVariables + use CHookVariables + use CStandPipeManifoldVariables + use CTopDrivePanelVariables + use CDrillWatchVariables + use CTanksVariables + use COperationScenariosVariables + use NotificationVariables + use PermissionsVariables + use UnitySignalVariables + use SoftwareInputsVariables + + use CBitProblemsVariables + use CBopProblemsVariables + use CChokeProblemsVariables + use CDrillStemProblemsVariables + use CGaugesProblemsVariables + use CHoistingProblemsVariables + use CKickProblemsVariables + use CLostProblemsVariables + use CMudTreatmentProblemsVariables + use COtherProblemsVariables + use CPumpProblemsVariables + use CRotaryProblemsVariables + + use CStudentStationVariables + use CWarningsVariables + + use BopVariables + use Pumps_VARIABLES + use RTable_VARIABLES + use TopDrive_VARIABLES + use CHOKEVARIABLES + use Drawworks_VARIABLES + USE MudSystemVARIABLES + use Fluid_Flow_Startup_Vars + use PressureDisplayVARIABLESModule + use FricPressDropVarsModule + + use sROP_Other_Variables + use sROP_Variables + + use GeoElements_FluidModule + use TD_DrillStemComponents + use TD_GeneralData + use TD_StringConnectionData + use TD_WellElements + use TD_WellGeometry + + type ConfigurationType + Type(StringConfigurationType)::StringConfiguration + Type(FormationType) :: Formation + Type(ReservoirType)::Reservoir + Type(ShoeType)::Shoe + Type(AccumulatorType)::Accumulator + Type(BopStackSpecificationType)::BopStack + Type(HoistingType)::Hoisting + Type(PowerType)::Power + Type(PumpSpecificationType)::Pumps + Type(RigSizeType)::RigSize + Type(CasingLinerChokeType)::CasingLinerChoke + Type(PathGenerationType)::Path + ! Type(WellSurveyDataType)::WellSurveyData + Type(MudPropertiesType)::Mud + end type ConfigurationType + + type EquipmentControlType + ! Control Panels + type(BopControlPanelType) :: BopControlPanel + Type(ChokeControlPanelType)::ChokeControlPanel + Type(ChokeManifoldType)::ChokeManifold + Type(DataDisplayConsoleType) :: DataDisplayConsole + TYPE(DrillingConsoleType) :: DrillingConsole + Type(HookType)::Hook + type(StandPipeManifoldType)::StandPipeManifold + Type(TopDrivePanelType)::TopDrivePanel + ! Drill Watch + Type(DrillingWatchType)::DrillingWatch + Type(TankType)::Tank + end type EquipmentControlType + + type SimulationStateType + ! Type(HoistingType)::Hoisting !This ds placed twice in data (onece in configuration, once in state) + type(OperationScenarioType)::OperationScenario + type(NotificationType)::notifications + type(PermissionsType):: permissions + type(UnitySignalsType):: unitySignals + type(StudentStationType)::StudentStation + type(SoftwareInputsType):: softwareInputs + + !Bop + type(BopStackInputType)::BopStackInput + type(BopStackAccType)::BopStackAcc + type(RamLineType)::RamLine + type(AnnularComputationalType)::AnnularComputational + type(AnnularType)::Annular + type(PipeRams1Type)::PipeRam1 + type(ShearRamType)::ShearRam + type(PipeRam2Type)::PipeRam2 + type(ChokeLineType)::ChokeLine + type(KillLineType)::KillLine + type(PumpsType)::Pumps + TYPE(BOP_TypeVars), DIMENSION(1:6) :: RAM + TYPE(BOP_TypeVars2D) :: RAMS + !Choke + type(ChokeType)::Choke + type(AirDrivenPumpType)::AirDrivenPump + type(AirPumpLineType)::AirPumpLine + TYPE(CHOKE_TypeVars), DIMENSION(1:2) :: CHOOKE + ! + !!Drawworks + TYPE(Drawworks_Var) :: Drawworks + !! + !!!MudSystem + type(MudSystemType)::MudSystem + TYPE(MUD_TypeVars), DIMENSION(1:10) :: MUD + + !!Pumps + Type(Pumps_Var) :: MPumps + TYPE(Pump_Var), DIMENSION(1:3) :: PUMP + ! + TYPE(RTable_Var) :: RTable + TYPE(TDS_Var) :: TDS + ! + !! FluidFlow + TYPE(GasData) :: GasType(3) ! 1 = methane , 2 = Hydrogen sulfide , 3 = Carbon dioxid + TYPE(PressureDisplayVARIABLESTYPE) :: PressureDisplay + ! TYPE(ObservationAndGaugePointsInformations) , ALLOCATABLE :: ObservationPoint(:) + TYPE(FricPressDropVarsTYPE) :: FricPressDrop + ! + !Rop + TYPE(ROPSpecificationInfo) :: ROP_Spec + TYPE(ROPInfo) :: ROP_Bit + + !TD + TYPE(Geo_Data) :: TDGeo + TYPE(F_StringData) , Allocatable :: F_String(:) + TYPE(F_IntervalsCountsData):: F_Counts + TYPE(F_IntervalData) , Allocatable :: F_Interval(:) + TYPE(OD_AnnulusData) :: OD_Annulus(4) + + TYPE(TD_DrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStem + TYPE(TD_SeparatedDrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStems + TYPE(TD_StringInfo) :: TD_String + TYPE(TD_AddRemoveInfo) :: TD_Count + TYPE(CStringComponents), ALLOCATABLE, DIMENSION(:) :: G_StringElement + TYPE(TD_RemovedVolumeInfo) :: TD_Vol + TYPE(TD_GeneralInfo) :: TD_General + TYPE(TD_BOPInfo) :: TD_BOP + TYPE(CBopElement) :: TD_BOPElement(4) + TYPE(TD_StringconnectionInfo) :: TD_StConn + TYPE(TD_LoadInfo) :: TD_Load + TYPE(TD_WellElementsInfo) :: TD_WellEl + TYPE(TD_CasingInfo), ALLOCATABLE, DIMENSION(:) :: TD_Casing + TYPE(TD_LinerInfo), ALLOCATABLE, DIMENSION(:) :: TD_Liner + TYPE(TD_OpenHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_OpenHole + TYPE(TD_ROPHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_ROPHole + TYPE(TD_WellGeneralInfo) :: TD_WellGeneral + TYPE(TD_WellGeometryData), Allocatable :: TD_WellGeo(:) + + + end type SimulationStateType + + type ProblemsType + type(BitProblemsType)::BitProblems + type(BopProblemsType)::BopProblems + type(ChokeProblemsType)::ChokeProblems + type(DrillStemProblemsType)::DrillStemProblems + type(GaugesProblemsType)::GaugesProblems + type(HoistingProblemsType):: HoistingProblems + type(KickProblemsType)::KickProblems + type(LostProblemsType)::LostProblems + type(MudTreatmentProblemsType)::MudTreatmentProblems + type(OtherProblemsType)::OtherProblems + type(PumpProblemsType)::PumpProblems + type(RotaryProblemsType)::RotaryProblems + end type ProblemsType + + type SimulationDataType + type(WarmingsType)::Warnings + type(SimulationStateType)::State + type(EquipmentControlType)::EquipmentControl + type(ConfigurationType)::Configuration + type(ProblemsType)::problems + end type SimulationDataType + + type(SimulationDataType)::data +contains + +end module SimulationVariables diff --git a/SimulationCore2 b/SimulationCore2 new file mode 100644 index 0000000000000000000000000000000000000000..1677f0d2c758c2a6ff3b58a38c847bfc0aaefc0a GIT binary patch literal 3162856 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 z%0D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 z

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

tR3eYF(sg7&DjrejCeG`v;fX-VEh8DA@tHtRb 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 z%0A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�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

;wh$>42g`YbF;sGbdvJ6%Jj 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

} z?f?JSo?$-tzyI0I)bfI#BlikUC0{8}u5c*0nW$fIXNqFM3#LTD_aUMnakVE~-{t`O z(Xavgn%zqF__!Qfc(o{7I+2HM)cLW%w^^J#mmo?OT@xmSJtmQwZKK*P%pPr-P4BeT zyq;uv0FZ|&F{Z1=N|-`K}C@3CY%O|oRy23xR~9kgHz?y+Du!mwm0KD^*Bx6QmmGB9)R{U*A0XSd}E#MzxIIT_ef;F|CDO zT_?#En^8?qZII-qtC!LPnk2a&juz7$pGk7xJS?FbwMcTi_@B^~UPy9}8#U6$UP^NN zt`yQ+TP3*?S@rbPHc75eA@uXDBzJxyhi>#?29wEKfgSK_5{eHYi$118b9hPSKf-GVgkCHZDL zIhDp;7*tIUm`>x)iLawq&!BNHXcf{$X3@CJc?EPMDH@lqP(lxorg5JxXrZ%ZY24$T z(2w~vuB>4(eQXhpTRSh0F0+KjwOm&~ClzVj^F9@HqZKr6(PJ*%LKW(HUP5kQwmB#hnR7|%Bh4pz{ zK(D?|;~th{)5!=L_k~^wJ@qDyJ6RsykGE;u-KnK?$0!;%tb$9gzDwg49xA3Q#ld>H z!uvg*#x7^R82f!1490e-rY%YzvYciMKT@2+T;Qd-k z<5siSbfa<_*9H3N{)EO|vA&LeyNbs3x&!^Ip>bCkw$QulXk4_qi7wIz>uU+)`;^Az ze~?cnn`zvTIc0Q<=QQr@h-SLuOB&Z{PBq=VmBzh!y^J2vM&mviE2ZCl3+t_4Nl$%G z<5t=>(NjOb`({fKo!trRJ={cRf1+{Um{rl)Uuawjt8)7PHbeh!X?$DWp^3!%XCZhZ zaj>Cb^+e*I$LIgnFgCDHoJcUC_C|KA+z{Qu?6v|(ybB#sl83MLYg+fHjwB;<#$7EC0r3ukCgB;*`h z3nminS`y?$qGY!Pdm{1A^Z$Qq`NAsgiNvw4p9K>MwwpLPk(e)J!JbH@?r9|_694vi z`=9w?oBr$C1MCU@{nu~jO8DQG`&$X--}JA*v?Q20m=I*@M$6nUICOL&xwj~teaOas zHC$KO08zTZ%tpIs^dw1hR-w-AWdB}0)&Knvn;=$0EQOGPm;oUOK~VAgm&`J9)Oeo; z@i3k|b^VnF@#8aDbf2L?+^k~{Z%fN2F5P6`XpG1rtaRANEn#AOIy2yciB5S|cJU;g+CU!&bp9;!j4v9#oZ)`H#VFZ@-fnNPuGck67T zR=ptbWJ5Ng{4oEG&Xd2|V&))%^APHTV8HK;Iavsv9SX}3oIF^DARsuo@G}Skg82xR zAvjQ$D*xvfle6Yi8jl9i#?X4Bn4m!r@En8_-_;4HbgjysJPpEWH2>#?=h+0OEB~2R zdp2QGo!_u!D4U34=bIP`WD=rx@&jfp&mtIs`RgqXWD#DR-etQqA=VvII!K=g?E4qd%pL(k)g@zJZ8qBWkPtZz3DhsjL$RZXxZuFxGQ2 z67k$qVL3|OM)XhXRaJX$Bb^0n)fDRQAikh$s$0{dP@rB9D>X10>0Yc*TkmuiJ^V4k z65SeuMkT{ov(#ge+Lr|^GpRVl^>k)E9g9O-(i7D}+wY;y?i#hws(7Tad=~3zb^@xt z@R4O6orunT%2ZqIpM>VMEK*zTdLMbFNU*NkB_jqqR*f`ELD4#&)K+dxMGm2h)Lhm) zKvNE-sEMpdLmmt3GWr&zqXhGFEY;Z=s9H^pRV>Crm-J_0{`M?dZIfalI(D!^tzMIh`do@tEA@&{ z*uv*(A1;<&7 z>nqT_i&|QU0%J*=L}26Xdcgqrz}M$}z%U(I69QzWIToHnxl8H#*bp|;wo8Ep<`v1UcK zptW=RGD4p`N1>(`YB|F%khFmb%X9fFbo1*;)=#TeG~L2eZN~N2s3)gYt+lcZU0eD^ z&3w{ZbYW~LNUgtX0%m+Rox$Y!2dwM4dcac-mJogdZ zX(rSjb3UPkuR7Fd0$9dqozagQNcr};v z-w|=Ih!s@-13As|$#7rPi_X0G#L{u?Lma;lR$Fa9TG8vrGG8)?cCHs9a#vQ^`?uSieSP#_ciWbRmXC&E>z%=`gobb38SVQ}a1BufrVS0rSHjQ^lYA zBAEB7`3v?5kY))X`)7tfzW@Cj%%OxFtANd)}AVKyN+852X(Fg!1tB-WRZgjqI8GU4e6wvn27}64G=@ zLT(vJ92SE-J=)ZKPBi<&bIjMkv&eIQ`+H|<{yw@*RQ-Boq{i!-E!m12eKf?&)Uyls z^=9q$?o+3QeAAfwGF4qmFG?ef=T7!Msg$hJ*>c%2v$`RFUDlW>M`N$|DGm91m$EKx z2*`X_dQYumcO=ZmI@x2U3=JN$!0ePM4>iI!JX5FkB|PB<8k-OA$evtt1?E^LDuVfu zn&TQ^o}%U&YQA^|+dP8p_6KZx)b>Md1JwI?6yA%k;r&z!?+G_}U19$^!T9YpgF61Z z?~_VH$caQ3D~COiFxKoNClYItH1R~D(kV`LBC#eZ2Tde;1Q;795^(yDClXJ#+i6cE z4u3mIP9)~TTr`pR`$Y8bbquVzM-_5&!&DUc(MB=E9;_gwMVu?{5X5)yCRm6zSUF#8@1XM56TEY4$|oWo`&Lk@%FD z!=6Y?WbUTQnsVtG6N#Be<5VXS6WRAsWhb)lrOHlZ?xM<0Z0;J?8Q|k=oJdgHA$9CV z9k)@(Y}D}@b*x4mr%}gf|EF{pD;w>JM7h8zav}l!`)}v%-^x+v0uu>npE;3$_rTah zVxsFm;rH*2R2^a>;pO^j*#d74k&eE~e3WJ@G`qfB0k&TgKU(uunjN*wtwjwy{!QPO z0d8~gYFq_24_*?w6zq}{ShWWHgza9Z`AwQlYl|sH;M*B_FTO*%)7!#F>%eE%r7n$y zbh`(ilQ)1L=*!Jq1L-|#3vL^NEtv9egz9Ihkfdc~J-pgm@MTa+`{Shu9R4$A8b zFLOHuuFi96`U>s!*hlPi1;?|lrbbZh2Q6222iFZNE3Ae5G@Xx=J;9>hX5pQXuCH7D z;v)D{QoigBFlTpb>Lu{g*_9p5U_y5e(;s{xA0VB1e*WBR z;BPCI?<#`&%{KIOhJ)ukDL%{#)-3s!aSQD9p;><~l($M%I2#2%=VBA04(k)dy1q6R ztk{_``!!h8OM7wx_(Bq|)_ZDv%Vo;%gCDA=_O6Hea#m=w$e$fFHfrnu0)o+}qK>4!hX+^nUhh=WW1xRNMFLPsq!*4GzJPMAw8=%ew`#i6( z4}{)R&Jgr}Fzq#1BDzaxPZetH6#omC{y!hw(9cKdBDfYV7uv z>c8CC%&bQ6GUNAOJfMCj=X#rF@VRMjL4n}3N+kLc9IhxZwhzY7Zq``tYw!x0ORwfb zdvec3_P+z0t$Q%H64Di-jth5ynK8y%l8|23y*&LB_$Sw7o;}p3Y=BI=!G^NJ;TX(Z znb`jg%(a>^PxSl{%$ z6S2^nv%0O}+zDvU%34;KAAF?1v{MPz*QG5lMgT0#u{z!a>EY}0RttkqHtji|5B1lM z%G8R0w+Mv|uYq(Ek4~Ez;3XGNop6Nu%`~L?W`duvbM}9M{wW7$cuRqkgy;EtL4N(8 zSu^K?#dddie*!C1FN~1`PihwPccRwMi&(J`EE!wkn+WZRo-ueN501+}Yd;I>s}ir%ret5kR_$XtkVJ}r)$uNHl*tl!E+eygZ!=I#T3T}FR zN2m;J^7c}^8Cb>s%<*)vrr4L+d%)ASuk@J<{j+*r=VuB2tmSM^^|$$g)~Gc&ey+^b z8(_g5%MTv}8!PqSrrxidt8p!dz&58swN0RXn(IB?BjAjv^zIR;Kfzcf%?X@u?EY4O zs(;G{sS{w81;H)akRG1@k$D=t)&(1qzdQL4LU;qszhIsc9OgE>ZObOSWGFFD{bvI0+8==|V<;W49+YJb?a*jvl{$ z3mkT(A>0|#2c8Ob-2s2zXdOGL0EtNmcdErB_Y@tfI z3ap=tgP>C`xZ`B-PhYUI-n!fZ@R5X1ZEmo>np+q06@pLZehY4d@`Cr14T`}B*Uuyu zL3*wItDsV_>5*=sVJL5w^suP{Jf>gk-vjA#=e4A&!5)W%1S??uG$$R|T?e*nvEJbi z^|=@t+-d~7bnVCrgLD(yrWen^C!g3GrbBtcVfySB;O`42d&@w6Guy!(tzhk=GdDkg z{5=k#!EeA_MCJ@?eiHS0Q~4fjd}eAf6UvvByqVMqKHw1;brIaGc3t~3*o6^1q6_t< zy%;~<4PN?V=TB;X81+~-@f+Cu@>vN6tWWqz-^-uijMq^kUm@M@g7@?RaDKZU&jv^j zvZ-MVgL&G$>o!AuR=4Y&#=xZqJr=R4{;j%thi8#DXAfQ4br>wCI<<-)?AP_WRR~_+ zH2?L30^rb%de1$fKAORrg~H&P;|7O(A%E0?Z<|HHDw6_bvLW5&mF+1puyuLF0a55r zc*>nf39#$~-|lbFepziqktDd!C_=9v^5-yicFqRBKV2K$3F&RU&B8L^U@N}o(NI32 zLsn@Xxaz1&`~c+FpSs+5Avj*ZKr$NgH=FSsl?N}{owQCAY*HBMzZ4ufOL{A{{|wjU zyT2SP>z$A%2kYaKrdp~De)~!E-4@92E4BQs8aTDNYh*s8JK6jg)&M6I#BP28=~3sr zC02uv%@Zr6UQg!Mj%C_l!OYCp)bWB<-7Fmj*r7*b(Q+ss{(k1pbzr-<-}CIDy#A?n zdp&UPr47*`(Eq5T-fkPgT2`hSgVg%x3I)bl9%un=y^tO>lla7IPTWmIFL4D!8ih?J=*Uo6Iu%yy&pA$L_R$Q$d zK)rw3l9Gj7!5c0K6gflxIAi&OZs7StOBY=N=NwC&%mgnuq{F1fU-0>PJ}H$8n( z7P#I0UHm~vXFmQek^_#j6O|N(bcNJK{kdST;M2@K&|c4FgVqA@rJV8MJgPo9>tYUg zA>#OuLi{PNoCP(ERx{#zrM=d_lzF17ugzFG5(Dz7;p zI1TEHa@d>v9Bi@YQf3KNUyzjVEAac0MdC(~?i*ce-A3hS^9#*|@|tE|TJON~YHoT_ z=L^O0}hclR`O!oe%L9$<^DrI><*nO!7sGhmY$~;ebhFo?^Cy94oi5RR z2<7d{jK2zi7knZVw4r{pm7;l5!1c-Brt5==`llDCfxk-L*rWsf4>FE576ms=|2V2h zl{Y^_69;EEP1_|4>H2qew9N!xuD>aOe1o?yW7(DmR9zJf4Y=wFV8so@52;rPQxSE2u$LxwyC z;6V9#wuWGr$2+n&fek({S`rHNC44?@Zw#g@<(J-tbhFbB=57VEs?B$8h4H2djMZ!h zbKT$H2!QqyR_#B(6Fj7#d6hc9FpGPuVh%pYdU|pt_5S;O=FJ}PvfwE_)bT}6+|nRR zaND|}oAO{y$6jq~@BuI3H%#cSQ|t3j`@!q825E6nUv1!v>$c#JEn|WqkiT>Gz*>87 zxs*d{3^l%zDqjwRxs7~QJyd_@`dm8-o;vKIOKtB#MMK)o;HTy%7E|w!ggbuiC%}8p zj$f?-hi}mKI}K)roVR)l^*fnNQ*{N$$R`CAQ1uy&K0OB>dOh#FCgfLsI_<0n_?xUxt3>1|Jj73^qazF;G?#~e9yE)-mON0>H~ z8sDKDS{RrSZa?!T)E~4|DKi4hUMo?)9m*$2RT$j@D{fibr48jxO#M4=gC{39$5Q8O z411UJ(O{+SgL>-Vg!fmZV!^Dfwjp1kJ~@-Jw0mH?7l~HX`?GnK(uPEE$&8%Tr_f)M z#q5{&!QLB%SIR^Av^bYzso-hsspj*j{v(S?>EOkwJt;e=`p+E=XMrboxjy~@^_R6L zFU+rxZf_g3k{+ zaKIhiUOSIKdeqcQgIw^~omqiTz`h~Ry-UE#3w7VRL3?RGc8iyRQ@#4{?S=I4^l5i0 zz;o@~d@3Pbb4$;XDlp67n#v@w;12%G8nE`K0~Z}2zvwyx?Rv0#QBsa$Iswq^$qJ>p?pH=qwX&7ckgA#sn?fT@8;M8{%}cn3w6CnZmnzAckox{ zO~XE@j|h6;&d{n@A z%1>yI&?wzA4t{sbTbJ5@=*!7H71{RJmxgPpFa7JLAg zSr>kg248$RX$EzCVaJ$kCJROuE=#HF1ES7;W%Izw$aLTP!;O5Hb`<%hPr!*$5 z22U0&+2Kv)f0=MZ3w(p$@pu_nvuj@y2^QNpzGe`tPqWrq3!ZBCDb^RvtW3PS4$Pby z;#5zSccBaFf!`|lshY$3DO?siq7TlAnKC$;%70X~&H!xgs}yNLt?#v4D>s7`oVmFi zNFO+45@rmRzB%25I=|tV84Yd$uTQp_Tm=2qufA@+9eh{*{eokV?xL|YZwEMbY@_@m zNau_Q&e;Vvh?fzej{g~cYOcG%AB$$_9fkH1jFX!8g5@vyyYs-_Rt`~OhX9^z&m!8REu`ijr>eGnUf_<0)(7&y%}3%gFM_{pWIbr3*5_iu zWMA;eR;49^P#^8g60^%-?5ruU4eWdWV}c)eL!#*vS8Dv2V*>%;mAu($iC+F-P#)mUaU3RM_s>9Te5&m0IzSGaS>M^sLFJRRRtXZtq+THhEUnTMAzNYQ>K@ zsNZVQ_{s`!OHS%09Z2ty2s~a1mQ4`YECuyB5$@^L;6g%9cRI8us#Dor3w}?tRu_Tv zC^gq*4d5q+hWg4-K26Ejwh26E|2;A4{D$e*clR0iY(Z1-N?1SIy^>cg;Oi-Y{0||W z*4Qig5`3Ef=t1gutJBeEODmY0mD6Yi^(R!jUTy>Xjc3PZfE5gDxo^QI6NL2NfqT~Y z4!sA@S2yT)fco_Z?y7WvcWPTNw5RHSCTI5%9I*9UW-0WKwu1NeXRyAy>?9k=pR;2_ zLl=0GjRs2t(gkCC1bV_U21ivJWvsqBTOR4_d zK5*G?=FBQcx8w6}900Rh3s}=&yn?1LnLG?$B(lzT3)qRFx@r_W7_{M>h?B><}T#0(W@cO$;fy@0= zbgAvHS=T6j4mf9J(nSLL!(qDC%msU;=q6Y~{x-fD{j%WVL$B+o{hhw-Oqu!MN9vq) zW00OR|HAr(U~U6V*%-!yv)9soF<84Z*OL1EO1Nx%paMABd3WLf*yQ2v%%$L)7ZO(s zfD?|pH7kO7_js`mffZt=jwpc>&xDBQLwjm|2c7eaba=n444Vwf-VEAvi( z^}lbnQ3nT{RVt>=XKIJ8U04McO=xP=fc`LtH^tGx&6_iV>Y+ZnwZ}`=fDaG>t)F51 zOr(U`wZSq;R(GNxe_M?RKLfn-?glz_K4O=CVZIJn{=7~9eX!sZ2gZ7^ncN$ax}F!c zh`U!0d^qD+gaC|RoAG5=eQ^5zlh;l_{c?>(*A2ky+~%C?00)gaW^4irIp)5iuD2^o z`c)Z$t)55!{Ox?yVNRzBI7B?5^$yhUt2>u>8@OLGGvyTYkNA3Zjw$$g!Uf|#NSDhv zvvMbR!L^^8ilF|4=EhCCz|U^c_2EU-@8_aC zB7-f#am_IY-M~&_7}zmo#NQ(mEWDMXwcuDuU}tygI8+XNCrdswurtCU$A%R zcD@}@f11hZAD6)m;=SY4?@u^p&SQSyTGchj`3#BtKg#< zW|>Nmp1`wSIt1M1qmW9SpSATZU33k+{MC+wub@7&AphlIV7(8q0sK^bVu#fuz#nbJ zOp2kuIr)#ZZh}!Idus~RZ`TyLE)uLR(iTe{9}h%++js|T@88N42A7#}jibT)FMRr* z5B1UXMNMPCX`b>H>ma=?<;AWz@ZsLLH`M$+@MNJyJb13Nd1M##XW-rEeTm?=^VU71 zwl9-aDhKX^Kbn3fsOvWjfnM7b@R`ALktDb_bd~)Bu(VE~Aoc!llN)qM2dmzHGglGn z6Z}Fy!UAXXt8ni_e`+;`j%0!PVs>w)wlC(|)s7Fr%;xSU>UtmX-+eJZh~7`+9k9e4 z;q<#xdXC~yrRL9K-KX&-TTzFlZ63HKe$n0~9bWkKl=GGwUi#oonkN*G)m*{v`9{(b zIDxq1^X)`aqs@=O!-J z+J5-n)ksXJxrp5Kyn|2elR9VoC<-%M7F=pci^j)0CFXyLzl*I3#vb|Hj=|DbHy0&` z#^R>;We;{=j>F*vp*^7<_wdL|)jqQm@wleXOF6+V0e^m1CgQax5v$k7jDIvvf)ApT zI`&HEK3*;xT)S628E+MSaoIsW1<$gQpDG}gitkyAag?V#zuxx9u7w?k{Tvs>e`m?nx+?|~s zelmxJd-U$HUn*r{Mq2dhX>pkt(Iz8-Iaydix@WW^C<_;xtV%SSoQ+2~j?QUkv+*W} z_RIA>*;t%?Zvj5=5LeAOd*syfhj^(%XZV0o4xV>Y<*9B_4sNyBWoohN5l&H))6=>C z2scVkZvG~di*1?=Rv!t@#bfKbZ)Q%)!_i%7%gS8x@Bv#1TEgc%ysmV2;C73A{6^dl zSJmd@y{yAe#n%;J`4%4@`K$u`;rmiY0eLpIm9X8I70&)+JTQLkRy20zEXH}CUZ`CC zg0Z1C*2z=iV8>k*GiKUyaFJAp%#J%8yepvgocl8lPNy%@37B4plXYw_T-;EI#qN!m z?e{3eQMN0ZmOd+SQWbnWHh1--HZTd#5PmhZj2QI%ZW z;PIaJjIRhAi<~~$ySfOU2$Yc7Qi2~j z?-F2?m*B>bcqirY5^NTqq%cMOG2W8mtW#zG7}qED*Pe-bjOW%%bxeQy7@tgv4hs}6 z#c`_`y#tI=EI%)B#->xHSg1vm_tO1Re1fa|^g&xG{=9QtG-qZRrf=~+nP*Uj#meOl zM0u3q-PQ{{k7kzPwMTqg6+V{XR^gR?m2=B+=8m7Y%(s@~3i!j22KXFXuVFVOjl6Qa z^2Vupudn6UChM(i{(=fzwRxe!>zx%?YK8B}mn#)`(+s`Tc3gpfV5U*|j|x0hRj)ft z{t1rF3cS5#_Y=Hks*Y1%z!Ut`Z}|yt?i2iWy+|HU-xFL&^E0(uQi&J6U%fqdPbG%S zrltLXm6-Q{BnO@qfnSyg8L9VG;tp2!dG#e#_-dZ9!@NCJ*kbOF*@FR9*zL>xsQkhz zykfcY)Wbik{&@dX;}z}+O#!>Av6Xq!R$jkqEPVFW&wcD_tg-9mla!unyjOHZNBjI5 zyy~psjwz-!Sl8s5!W^F(yo|IsLVHw$D+NBN@qVtsb4^lo4~x{|6$=g*ZkDgbYilz@ z7cpw_l}UB@;jNVAA~JP2Eg^*0N23m#+xdF*8P#Etd-w0}v8}^C%AiPhtS zXKIGmE~&@-5~Ej4*Vg0Jr(TO%?W)Jx7tz&y$Lev6cdNMhrFvYx?9`o&(e-#yWX@{k zNA=k2qRE$Ob@fUq5)rAyS@AvtpWQUFq@^Q+<;Bp!f(9V(16J$ zA$z}$j=tX;dRTpDqm5Q8~6 zs1b(^e$iSL--x4KPG7TRH)4;sUjsdw8nHdEm1@|RM$D3a;(3p+2`?X5?vpaR3A=Z= z>n5u-VVnAtqPzM{_$?VLaMiL2A2!#OJbkJOf9G`^*zONMulbp_G`0y#%}LT5$Zf(E zLT0$2t_d4lvO!6N-M#eo>Logmx_zTedg22@ThkZRa`L$*66Vv0<`f^}`X6gV;;$vA`0Z{)8}DpuyQ?d1DwUy-5DFzthE$XxGM0I!GE}HklI(fjocnj)?>V3M&vU-7Ke|27b6@wh zuC>;^wb{>eRUKuFb>WR?!fTbDE?m*o^WR(D1!u>Y%p18~*k5s1zx8$(@^{*5%)Qiw zxw7ScZXR8@uHCbs!lnxuO?h(4o4W8+b&u^8tuFj<>>8pfbfG(I*Nfwmow&ASsO;NF zC;l}*6Fc7BiT&}PgDK^ms4%{xb~&pP!5;JYN(r4vyAjQNbDbpjsi5(b-qQ)G)*a2^TZj+-&2Wp&6#}3(cAk2T=xZCCq7MGre}i)vDR%DYwJ> z;TQLXQtfDw{G+#Iv<-)(j*us{wBdX~!KsBQZJ>nsuhTi(22Glkyyf;be7!rs^Hpxc z&&kg}o-tb?b!(!Y*4zqaw)nkm4_l#iq3BR%P%GqQeofBWM@DUrz;LZrymnYxJ437$ zBcE7(>Afx36xsd4_+<;M8TlBAXn~^s&Cm>&7PvCJP8?s~f}lgLGy|CyM9dFWob$UG zdpGtsh*UP?@3u5aPEs?xW>aeUXPVK`JXK_dc{5&d=jLdrHpAJ*t#S{i3D0_r)`zz@ zk^a^{q#B+!p>t{R>baMi(4Q;+!0SL0j9U-d_2@RiY=OYsQmP5vE8NaBerv?D_&GH; zrH%OB8?|vPz7f05T6W(&)rhG%KQC`GZ3MN5x=FC85yx&%lYGZ&K+UYymZY`@tj`{e z_J7&{-)z}UM=v#y=Nq#>J2*5Ta>oIuLwXJ9EfbV@&S*e|PVQ*La6N8JtRH<|UXMrf zgI<11sz<_zwZUSqdaT-W&)37E9@Uw9T&tGWV|Utt$tA)%v^zZCc=KZ&ZtUGNXZnje zc<u3-Kn5A{Qf_$8}C8gyJ*rrT#*bn3_b_!|rMW`vJ?g81B7;7^!^0&L6CVrT;qYs{Fypv) zC~~?t`?<$Ed@g86TVeJN-NH@k1*-4Rtda7_lwX6;Y7e>ZA8L?Avva%tq6X)E#L`W! z*I>>~#TNqC8mv^;^oQosLvPta^u*mvJ?Yp1asf9*u;}PPFAE^eXH%xH^5TwF+A7r59FYS7B{i zd5F)|D!f#;6svcsLQQhbRJDy&|Ji?4;8TLVMCp}?u5NC*&{~NPzG`t2*_Dvokp4RP zY9;1bTIuT_uEfm0d!#;Zti-0nZ7ZYaRpR)Ee#5xm75EnXI&I=1?KY5F9GPhi9oZsSD z{NjkDxo`1Q{$IsdTN##GmWkR&l;NeL!`Mk z_t8)8b-2B>6gU1j{PX|(21ma(ns_F@!TPe7oBVdYL2j`6$Suh?Fkfz^Q&U+2pYokz zl7S`v@ofoy7v||T{4Iv&=eWS_kBedMZmr(yTnx(hO{*@F!CD9zbd`R z$$X6~Q)W$-IrJJ*@@iYc=epm~|K>y+p&t(v+gTFQNOpvA}fJOU&JstN63w#eejDfoQyD!|QN-)C!Gk1b_8@9Zv37SMU~^NG{02 z)`EKq*$GeauDNIF*;!BV#$VszK*SUH|FVAMD)t2SrQNiI;KwK)4_N(+^$6pwQ+7If zJ;Ir9JM1>U_kXWHC>@3sdi9=lUe(O9psd`B|6B-*5~D6jc>zM-elr!kZ`WM z;;nlFN5tozO4W)&_JfE_^JNjJ#p~bx%GW?ybAqcm{|ZK^>G6jYF2n0gC^7R4#?Wn>bcW_J&RQ$K&|3ptt&i3D(c!-xW&R`L|NrrS;T{kDZ%2|?@ISHt2O|lk{Ktp?&B&YBvhpX1|8K|i zvODZx@*IQzb|mocU)x0f{qILk?Ei}YZ%4|1;{S_r-0*+#_TP^GcikeC(Ep78;Kig;=c&~-$O3`?+5>1zEA(6PW(HL5b=l9Bcc@Sz08_YD@MU{xmo&};uNfL8M|_0 zDh2t9N%V0E3O0Y8d1>D?3Rb!9*D0D#fw-+FM@gE3YmNuMU6?^Z!Lr4p-)2%!?@%ST zeKrM#IVJ~kWGHx3eYbqJ90lul^>6W!r=X8FIozW_;{9ekHJ(F(t>=`;2XiUNiTM>F zIiG@g5v5N~DN!&kd3m^F0R?4c##;;)QLw{?`ZiUWf|QH*?8Q_m_&a7HcVaQQzLWK* zWeEjUJ0E`2TSmcHnjJS~IR%~+xm6pz%nwVz&R#lAaer+qZ*7~(iap(Oo5hj;7`S^6qp>_nSEg!!P#&)`j;sMVy16nt+!JkedF-U5_1Y#_V1xB zv7q3(P3+zqmIUWE zKhfoU!C@~O3OMX{W&O4!?_y&EGkXe#pDA~|I6#4f-KnSr2T462G>%?#q(JJs?Ln#& z1#RoO=Nz3WczaVWyUvAz{)dl5^o~$)dev*c^rIB8{%oBguI0Z_BBZ)(9 z6#R;nh_X6K!3?KoX(jGN_bEf|%TG~YZ}M>IEl&y(8@Y)Srzx;G_Cwv{ECn0tkN1A^ zqF`A;SoSt=;;(PUcVGHY@JcQ@N7;{p?P7`j*ZqkOrwvwc11MNL=klH7frN)bf6eY7 z3RcWs(6c#&0_Cr#A3wi9!ToQ(35zaL@UMT(gX@=jWJ)Q_yQZR$UN5d|aj;yCjMNx8o~<;;vKhSdxEDB%1JfI3@o~3Z-tnu3+< zzLfUV5M9MrKHd4A@K;vysi92#M)r|vz^@q$3IZoIM6WW*>-#w` zBO#0Mwrl@wUk(MK$Gc_!aVap1VLUs|r@%3#$bCRS{CrT=+MUKej!EK6yMMOe*#@hZ)|QMTO1$n0qs1s4(FiQ45!);?kz6t)lW&bT;_k4pyLI>8ZD& zY(*-vCVL{!&84E-vE|j+JSz4(riq+XqC)ADrRR?YWWC4zJm*DJoX*^x)vrv&+^5+A zcB)hu#f+cmT1>^X)r$jnFQsDGZA)&`GAcr4Y$vy?QSnyX+54S36-_EG(>7~TG27U& z{H+!hYu4K)ZqTM;{+M-ikq#AO2D=}xT}6dFbKl_0)l{q$Jz}(qJl{#(Ft{jJj|!E* zNBgz(sR+&(lzY04ioqMJY0KA>c}mH&OhYQ7)Rh#L7*SyxUt)WIBNciZ&%aSNp<;@t zBho;{ugYV?3pP`+>EP|$J6ov8drnW7zm4Qe4^2-tr6NYcxMA*gDlRsxR7^6bBD~J- z@*E2)t`5DCxot^B633xZ(TWP?e;eWwcTrKC=@h1DO@$f%{q4j(r0$P?O^W-dV9oPh ze0x9P=i%GrIkp72Nk0efg7HkqN2xAuYT2Of>Xi6KmQCB&o(VL*Y_fN79HDAe2$8T&f2?- ze5lY_5*k+SOGV#L=f2JUM4#Iod*25Tzs>vf*F2E;&DQ&Aa}X7GH)LJ44x!?2ZqSwP z3xuDfv4{2-so3*F^w;N0RQQIJS{x3e;-J-{_TeiepNW>g`!y=;Hx6Swobaf-N6ROY zij3)A>$p)=9C)$)*o7NZq{{XbOo<`<&R@PfGM0)ruXKxN#Zgh%CgPcJi|B2axK$~E z_}7qTbU%^sa74*gEs2V%N|{@^$y8`>=^0;hhw$I+eWv6t*#~YvWj3Wz;rM$^cWpWq z&1Q}zR`-d&yj&~0GpH~)uxI38CKV_DE?N8iA>nz!m;3IIsVMt+c@^ym6?bOM9Xy{! z#g~HAe9;^#t`*IB5}8Z*k&1XLn@5GyJvuYxITas{J6bP!NrmOU_s!Y)R7|zg_0W4o zd~_^xMcHdA3QjA}A~!tX;)zFct;IwyQzJvWH{?3!+oi!$DpvX3`+M>&*+2Q-=jr7n zKI4c+NF^1^49;*Rs;M}0GWGAx8nU0Y$3z#rCqDN-X85ROwMtC3p7 z@1>WDNxIVJ6LgWV(yzu1@qlbyVr+Mcn{UZK%)A;b@Hx;we%@^zcp<+wc z$JpvoDgv*3P_-VTqGpA8_m_WUAKcZ=_MlK9-k$J)OQpi4*5_?For=VuZk{5Otoygn z;US9(&3P(c)^G?PyxEtlxWq5=WFA^*(crPc;{KNvG~6#g zQ*l;@hUlGFM8#K;yrWUalUCEvm~ri&)*6DxKQN_SkA@Y#C*Ahy)9^0C*8b-@8pfxZ zo(fz~!=`M5%vl>~h)mKIJ}{!;>qq@S17jNQdTm!~Hle}M>*N=gO*DuNrq?hx(~w{H zr#WgX4IOK&xhkeK%+T&Me{DvCb-8z`g*gpv41+y`J7}2fTP)>gNkek*+Mm)^G$ak5 z8_w88!-ge;lIyJrp9r;T-9tmI`M$zq`)Ihh(|HSjKMhyx9#i9NX*lY?;+=*)4eSzX zNyP!ew~nCG_8<*k2CQcPb0l>Rj-0-Fhz5OQ@@Z%n8ssHrCcipN!#ayQhj$*OVekA4 zyM7#_!9J|?Q1EdY!jf%nDV(5T_sQKOxhH7|k;px2>Oq6-rPHEcPtmaNPfE4lX;Rld z-6ylp5?$L2o>I-PmZx7nKpZPRqkejgf691~CV@uMMiU|4rn0O7I0bo9x28tT`n z*KZD@p~o<~zCW0T*}nq+`d*;n;a<9)%tewXj+>r+iH12vH+4+Ih~Iik2L`SXK4x8b z9e9lf9rwOG#RwXlr*t>Hh@|1?xaW+W*J)T_mUH&k4I0uH#&Ryl5T2tJK2*L*gWY3W z?>BKYs77o$ZW~X7!}c%1v;-Oi{8dFUw`njgH&R@YOyV9-NvcaBy0%1ZJa(7xZq+?i zG>wMi#@}ga=`>s~elx}BJ`ENYZhsyA-4TNb4CjdZ&w9TwzSbOk$8Unk9HciEzfv(wUdULNyb|BZW>tI14imU z(2%COvfBL^ZIBQJe9tD&u1FUe;dcrztF&aq_XJt0MVh*tZn@e z4HAKckNUsS!07e5f8hr?KRdW$@lT>Zdc@xUBK6&jbU!gdgQ-S5OL~-sU)r3<&;OG8 z-)k2Dnz@Y-#VhGJ<2k+V@M=2pW0KEHuc4za zMtaX{JvuDzyIMKxlf2BV)6)&;pj7q0Dp*g)?)4KYhc?i$V zswNJB4qD|(lj)o3_!PhP$g3@M@OGHwIB%nq-k!VXOPkU0cddJF;dVN{b>BL6WCtB? zE1NgZvZUjk|NL!lcG5|o))0^5yXXjcB`A`!rlUbIMYCcL9c^1|D?RqnVc=~LJkN&U z{|cw~wsi8G+H*(G*%O|2bj7GRka;D?2AU7j@n^f1O`sDUraI~rb!R$4GY`G^;6m2@ z(Ull>gw(ASbzk=wS^xQ!_5oMI&-2>lF>Z9wkM6s_@gyCJ(^qa9b*E!%-+`%jPSIg6 z-#2c4nvMX<%SrYbI%M;HtbO7|M^}VztgSa4C2!qkOZd_u6;=M~wI3ZjSA>MR1`r(v z9-mPRq{H}!$<_Bkgr@-WO5YGVF89@{s)f=KyyNZTj~D5P5nr`8{4yP|R9U+I3LSP% zaq~y6(lHVkp?@cw4(lJ1{+5w+tm>2dDu|-PD=pVO?*_qrre~o`3>|CYQW&x~>7Z_- zQ)}Xgf0}K@{xkx0jk!>^k9ZqwmTzv&#EOh@jqIrBH&p<_E|JBN0c4h~gA z_$ZBz`ouEz1NZ0<*N_O9kwN$yoA$5b0Ual_>La}$(viGuyQTVLI<_s2T+{!A4z=TP zh|MBCGdy~3YYrV>2SuCMxpdshJi8+|kLXpOKj!j+@S50Eq?k{~+WqBE8Vl&ivxs>c z`kIcTRVLiEMRX*IbUFMfrsIqCu5b6=&@q!=5NlILd}uCtRJxpw$xD`wRTXp$Qp1A$ ztBAfs1(iBAbR0?jy5h$>I(j@L-`=UEW7%C@pFQ=YZeN!@(;DfJG)vlF(L~2v``!@0 z7UD0iW{XZ69qB$dwhXtEagO-cRPwxAJMDyf`@8A*C$=ek#z#7uen}<1`$WeB4NiS< zFY$}K^iutPI?l7qGRHoXeW3b$$K$VLzYUnpaULZ6UXh(X?;G)%qui2??{xGR?>rne zOvi$en%b?u=!h~7+AI7`N0Ee|c+np^E+iIxKKqyOY_zps>mMDj%@>Lcj}za>m|5PV z5*@zRlpUbc;jNgmUx7)-FuPu^jYam;7h85Dhpew;CT7Z`gDZMRPeee6%rBekr9z^I za>#W5Ns^B*m$ycgfe&3u=l_W@@Q0t|o-NJ*t3LYjaR~;zZcbJ%na03^r zJ@)dhGy`W<4;{6i$-wNDLq>|T8F)WT+0ZG&z`OLDF0pb9M7^lV-KoI9mvhl7Qgaw+ zH>MWX&1IncBrV|TdX&;o!|{?6JM{%fb8qM?QAUu4y#$eEYxNoMXzYH-%19) zuK&f+U(G=3t?wV1x(r-Td*1(AkAd96U6OwKB)`$S1M3VJ5Q~)WVy$Q3r4Zgl8yL94 z-nk)QBLmECV+}(S25K0J#yl_}c-<3Fx|sp4e`J5~Rt65-S>bA8%D}9UYDJOl3|L;= zGgf8JK$7_9(J%`JD%@RV&2}=-Cr@>nwu^yXhc9~y_cvBNab{rc zhFxzw4l^)AQrN%hC@GOpOzZS{>XMs|T)g=Z*a^<`g!idhDexdzW$ojk; z1rM$U-h{&g1*e z%#UXvzHt7)Pyz$BU7mi~w;6c0VxPWuGVz^u%Yuz}NWQHDnp0C582oy}xiyW{dAheO z=^g{eUFtU<&R}52GN*r9nPeT!yVZ<`45$uXEiZq}!2Dv>ZxK%!U@ShPvoD*0Gci8* z7v&PaoL+16`xyh>dilcq=LGj|>aUQO44AEDa?J}EDA-q}r|_DASk(iG1BJvlGb@#I ziWxA8;kNm`AwE@{p0%Znf$X`otXbs@?44HJ*;hgMJ9ud6lPU%b!hhfOt|9tP9@x0) zJ*jtnq4>-?;@d0{W^X+MC3PETK51k?ZTe{|pJoR3|44ehxs~j@wzsCU+ZoW=`d#?B zg8{?W(qFT?7^qI$@H5~818;r2=WPE(bj>e0t=P-JmNuF3?|lrc+7_IY|C#tNYSQh} zSF&Fgq`O!TGO+IK!AmONh##jIHU9g~z!K|CM&-jqpSIK8(Z3jwo@hvP8eyQ-#wJu} zl&rs3Ax`+0)PGj0spTI7Ju8fK(kTpNh-4R?rZLdz;ouGi1LyzjHkDx!Ub)fcLu>~A z&7J3y&t>3HHMK5`Pxhg|@-`bG@qJ;&Z?#DV3I!Klb3~Y^YAnfa6l3DaJ)8PeaneVZ zZ!_zR1QY&F<-wb$G0|^!OI|^W3AyzjI)6$tp_Cu>rer1)Th-dRs*DKpV| zb5qcy3YmAMLA84^6Z@8r|9iTW2|MN<)(gzve%0g<4F^ zPu*|VrOia*hO_gtRxs3ITMfV>l3$FFj2RA=!eoyCTiCFcBES|aW{HU*tDC8)W0ot4@qBQ zm(K-nLiQ0pMiM{T+Ay*1f&YTlc1%oTDM2_3&guoW6MN_A^X`r}-2w@nXXMkid1~9258J$~N}-Fv-v3l8uFar0??=rt7T$ zQtu1j;?sdlT=UppuTevt|HormrXT_Vq$&plRI9>&DUpEXjc zSD6To4ZUzaoQZA5cNf@25+7Yv`nL8u;d4TyQ!bhb3+x@G#4z#oi|op_n@l|S+Ir{N zEhbjp`m^dr0uu{9NsYVTW+JTT$)_F3Of;-~KcaDmiIj84mrqM2^=^!f`jy6ny871n zb@!O)YP{O8|h|Gm4rH4OeR*{$1AfVR{o2I|rJr#+sSPo|ik`-b(!A$v%s__k;e0oUhUo=^bEVcXNkn`4AH! zwjr-GzcV2*b;It+VZv94wEUT0M8{)H5t|Vv3S9W}j7G`+o45Gj;xQ(6>AKfRjuU?O z_Bs8dFk!gNSNQ{tiJLo3rk62Des4qNOcoQpo86tFI81DH?ymLXkve^X91aLbfA1AX z=WU)K`f10CXo`@2=ZmMv%Zjm}@~V0_cM1!aV>=3mrm`^Lq-WkJ$-=V6(J2MfNniHR ziIKa~EL3Qo;a!=@LX^*D{nN8q(42Apj-4zE%hTp-ZI)+YU$@#1EkzQ4=wZFWTo$(d zN&GZ1kA+>!CS^vHSXfZ{oxEjdVWHFZDdnU;xgN!H?wecj_Mk-tt|5X&|h(_DGT)4yGxgBXJNYKO-Gp>EM$GPubi+T=MA{K#&)uB zaHj9H&!kU$regcwMr#(nOU@FM>?P~mU9&E0KdC=r^W9`y7FJ#}SrK7R`qf+M{PcGq zed3d3o825)*uQZ6v)v(rGqGWwxeE)eZy$!PKf(gb>WZx9F&18loNAqaoQ2$*&V^DZ zSm-J~(!f8-g7@0XC-0Lhf?9HZ2N0UDG2B}6Ou`DFU|ITCF zWMNPv-fH9)3w|Z{=6+2eeJ&*BW_I0X;nK%3o%&=F_j_I7+dC{wic-k~Hp%>9mBgp% zWWIgf(e(Q)EL9$LN_fCR8b2m1>LCk%Ul(>?e9VHo-0?mBPg$t{c%SQ;&4N^ed&{w0 z;)CaP%?I;X_-S3r-ur_1(r3pmi+mO`27TK%zhZ&uwC#dnAq&c{itTiZ$vQb79W~#u z5IEyO^x`rW%h|Styy|W6r80 z@y>2J;|(m7pHkZ}(!_$L$ZN*878dx!bNWBGu`u(`?y-*@#Miw?S9El-zz(%dZ2G_g zHD|?&+D~LZY5n?J*-Ln7xY1YI&%z5kRYu_#;;RRb4D$zAa0^t;c{aqt)@KRkS>IWZ zmzI!wG)(+(G(a-r7Yh#I;~HrrEJT}~@k<#cI-TQ>Cyo)F`jZlGjgx)4&)hARO6qwg z<9dV6!krREOeB-|-IDX;8k_9jbt-OGxGYTU^i;geC;mF}b39bY!YRubR>&j^9{ndY zgGJfU{B=Gea0(kCTi?r{pUOtU`&~``l5G6lqV(KvIvb90D=K`Y*^mjp#`l@Y##P?R zV?MLlh^yA%ddsrmTQiXDUy<71_8Mx~$rJE*muQsA)d)*^ryFKgeeR8}F`P zQ}SKJ#u_aD>8rv<|MazA{T8zk|GrQxU@03{cD~$qemUura$db7P@N4owM9X}nrzsv zy1nPZ3N|jBxxN3Q4jTp4i?3W>#fIwCje}Qo*)WqIIT5bMhM+-PIZB`4kdPLMHeh4n z5X5;0RKGQp3L&=#fk-nLYJv+;J0!vdEJY}hAB zTb;Z}@Lc+pbM7)5zssox!B+^b4J)Zvud&hm<^HGG2sU~WtVUC!*tlo0Ui;w=VPuYz(Hq`boLN#*XU? zZwXQf-lk#qY4_L|-=*NCkiiCTO726|Og7B>UQE?_M0l)HOE7%GhIF>9wOJM$)35j% z?#p4rX_KwB%QJ$ny(q!+IU8S>rAq|8B)qPk`8cA0jm#g@yl=l|!)9%w=ffg4Hpmqw z=9jQ>(d*1;Whv3c^!@3!w`?R{E>-zj!G`xj+ljwbY;;PdNC|3){|qCxN!PMLeXO3V zR8QhegEnh5vY{azF213e4V{0xm^)h8&>H?I@6b;6!LKDQ?w#a#bX{LyHyiUu=3Ku1 zk&RD1wRWjJY!v5P9DLTt#<4SxZJsKkd_FE54D zi5?Ay`|dE=m^(xHa2}hDyniE#)m*afnFh`WKJm$o%ISZEY|?M2%Y0&z_%?BBp_~{8 z*DoI2qb|UJY&1_!Ova%RQN;$ZC!t%}Do z9CYQ5q?O5WkaOy9cBcXdimmH@{+`1@Wmog=$$1=oC3*=JsfQHp@x_3QkXeu#tUy>FdeT{vKiCa7ON!T~dVyYjtb9B3JS-dc8?gV;fv z#J$YKIf+q)4nsz*2bA|)yT^B2?y*LQadogj^n}fsAUrt5)a&`q+4$gKaXQ9V0;;Ea5crr(Gb&uQY5lE^;tnpZaC{We%?KG!xyfkoxmJ z1chHCbw*^yJ&7PX-B0>h7sbJD=|YR&H;9e{V*jSaa!|hJa;0V*2m2STueONi0EHTK zk3HE99y)QSmiWMa@r=rP4#dmE28J6skjjZ1l5XMPzS$f3HEo2K7sHx4c}XIQ-X!9iB3PSm%bXu{zwJ-f8zp=$lsMry#zEQUd2Uz7 zIe4*u&h0!Z;XhcM`H9Yf+~ChJQ5FYnPpY=8;BZjPPu8{Jao`~CWgRLY{{CZiFKdE> zj!$~Z-6CAXGSylp#JK45T#>6em5W&(rltEOx%f8sJTG)Q7pLwup3ITvVu6my^iMOn zc>DKLkC+S>7o<{qR?2blBR^)^K?N?_o|FtKaUo-NA$#T` zE(~@iH*HYiqGp`C@Wf&+-Z?)>Ph85ylctB(HOslsJIY!^Rp;WS?R`@fEiUl!afFpN z7fa=534&H~;bYQwFMBl?9g(wrde?BFqn;lyO`nS|=C#iZ47j+p*jnDrkc)#q_GR5R z;^M)(4`*tPxmeBWCI1`dV#Tv#F=|`5n4=u{({>vdogvC+!p#UyQCp2-b1r5MER!3t z;6iz4thSOB7wVxY{+7E5FL~SP!F#wclS{vsw~yo-ydOMh!^QEv`=jLS319ch>bE&? z;V}8dz~7OJRk>xKvJP?4_SNy}XBQIRUY#}jC>OiRX#HDUxwzI(G4XTbV#CR*&a9JM zT)BTD>5B&!pUVE+kUh=CRGwvl=~+^L!cD2ba|CaF*{wVuF1$OtEx-G5kxBWiKkqzQ z&!yMeDu|0<=hoEAAw);*%K62iTv$mI)Qw%@;=_uZ$4jpeen00H9=JyMurFiBMsOiI z_~m466cUdlR{!t&>rfP39s- zPyM&~9WGv5ocn$;l?!SGb9PBO;rG*PPwIUx%DW2%nweZ|5emwVJmQkSU);#M`-F>E z-%oaQXK~S@ow9sZE*FMH$~oKfxH#W1arn{;F1)ghElTsbIGizXl=+H_5$5l_RYhD( zr#P)}FX2L^XG`zHQgWVkw|L+!7Z(#f8QVYqaTaop)jp(&?+>F=3g_eK0qCqzo_my<#_*YwFYKT;!Ylx%8FEMdC^3 zDP;~9y;DXa5AnFjb!q5H7jTi*b?3mq1Q&N+9G;;n$^*@E3Dso^5Bqq7k`Jcx&?xi3 z`nx0#bw5rvEtBG5e)GnF<1=^|Tc~39bQTZYI*KR$$na2RvouFro(JZrmFgKq9#)&D z)V-X`Ls0ef490vO%nLGe4Hoj?=I!w(P?-lQM^}e(RUY2eCJIEC@^EdYXou-?9x|hH zK1HhY(3YGc)2hkC!uYlzIc*-qKJ1xqw~_~&H_JxuuI9nw-pqrm}vw2tlt-Zj*hi!UMhmvm+d?WMnhi{QO!b;ZbC6e_# z&(ba?@o;+1mVwq3qWkEY$%UyrR2|s9*CU;WpY35iCHDzW6@TNVWfJ`ou3fNu#KWHo zoAk#|c)0uW5S5ulbnAQMZ<vX5us1#^VxgJbX;rv-Cg*4+4p!^0{3k?xUE&v2|K} zh%A+ji__+#`dQnFzbpBuVKw<|*X4tGMe6kfJwCbbFjjLypN}UoE}aL~lle-Qp1@Yc4=<5)UlU6{ zOsWT&cdhtXZIqhL-A(YZyW{Ql@-aUw_T}sSd>r&>pQ2#LhmCP+)VTvB?=`k*$3Z?0 zeE6xq`Vb!uEl2FSc2@%8QSY9@C$(-h3n)aDGsH`QW#mowqlDkAbzXE*1pxaf(~JNHK(u zH7}oy`-SqMMmfdmxx~jqi|K2Ou8`|C;SbWT@$u-<=ys7vKKVJkVad_!d`z4=uUi|< z#|fESU(K5Y*Pc)RZrtMIWc_3+C4ulSt#xsK5+6|o4#~wSgfIKs!wXaS_p;)>!^K8DW!m>rbO$Bgc=_Q6~})CFpFX3zOh ziAkX4z9hV>8SRsQ#mCOWDkJ9$`LO?N`f9M4kI}USueO)+L78^yPu^QTN?ATOb1I3B zX`RfFYEt)|$fn_U1V?Q8N2@wMh8N74Ti8JSIKa4}+{{N+Al8Ss^5GfFn@4HqqpMtN z)qyTP2D7^Zt3UAZiz(o*==mQ%Kh00+q$H0I!_OnR-U2@M-8~aAIKjuo^6C^TQ33Xi{~CNVMS!|b-<>oh z1TbDwDsy|902j}n<4%zlpekb4ymK=JNan|%8k{YF#05$AE;#{w$~=qSDhTl6Xwx(8 zxdPBsm-pSBFFYJo48hhA}Wv;=tGpY(B|jsTqs86(lF1n@KYux3(MfE`kX`DfP(a73%a?b|v5Htl(^ zZ@-}cO}a0AYmEf34i#%%Zz4eC*d525O#&pY4qdFgRRE!&U}2mo!6#|5OWa(5=@Lr{ z{VfEje|BvD=uQFVzLwH--Yq~>=e)IDdkD_A@xI&l3$R-I;#jGz0JlDUySw^;00I7$ z7atuIAoSg$RHZ`#VEb?-}g^n8!?4y3tAe)uR?B z{Xu{a%FmWw|3q}s$>2-%36R|(DSiF30QP;ud!z>hC{o~!0bWiQ zqP64Y8T}bTY;~LbR5DA5*`3P*Ok{8<_PTK!kL5zr*Zk@jRb2=rv!!nXw1k+r+xl)& zTL@+5b@A|3LLAa@37)k^h*^uRwQsK#Vl3B1LD_&@&%3?$v7rzKV(c3$Hwv*X{Mw=- z(w{nFfyGa37D6oD>{tC(Ax6h8s_r!tg7QZg*KaO_wr{nOtECW{o?VN^t%T?+&|iPv zT8MjE|DvYs6JlF|=$sfEA*QVM?VV>&@P}D_$aD~*?Pl!sRZc>97;W-<<17T+jx8`d zBE&Qc@3#Iy@Xi(HN9n# zj}RIAW*g-Ak-RP{z3a~lv2U!apf*T|J>PWe_FoVpUBg8F`$Zw1W(kwL!i3~=H@-F^ z*M#Vrl5H6qAq4Z~{XpgGLVVbE=-absg7@jK%f>f_2(8=f*m6sV{8+EkPKiSJjRlpA zB?%$Z>S}!9ju3h(Yk9NMgqUm{9lv*v@YEcqtowlQH+99e>W4y1buUxf|3nDWKNccC zvxHdh*Dn{4D@5GHxkFOVNj*MuzNeB8-8eKf-e2`f2PcsCxe$s^dCz33h#ypfs~^?~ac7aPjA5-1y0?{+TIz+658YvRq)CXmt%cU? z7J~o0N7#*aAw&XBjW6yJqO7t!q38qQ+tSV3sz->(*&f%w_mO%f+CHEELXOpw-DC!Z zIPBT9;>kDS&kj#blVKtDTU~Ma@Jk4_&+;9o{s>VTusBG3Oo%Y${6neZ#8(ZCL2GHm zhrVY!n;FC>Do>BNvW2+%-cNgiOMH2BXjPIxNM2|Do?1OA#Jnr%-y1|Hpg4see^h(| z*}jq&gc1`->95a7nmz$J{cV%FGbT`S`NHkySrbToAMEBPI{~A~t>?rPCJ?6ETbMRy z0v(4o>l@CW04?&;SoeYnEG|qRIIBE?>A%vXXD*&Vjp`Mztfdp^b+eTAWX2|@9%k@KYn?=KJ%Wr z=YBrtbJlzAIp^NIw{$#q&V2vPz&NjU?VRbh^%K3;d;dD{(#(hO^Yvk--tk^*>hKS5 z|LifZwdYq)t(f#AeqEM*$1$7N8fp6>{I#iGYt#p8Eq5n-*b`O$^KRTAzGwTCYFN@>-uhd9~-)&w8yB zd!<}){5h{RZ^PJGtA6jbe(`H}59@5Nb@GQT&EL%RTElk#`A7Q#uhnqH4R;P)

2 z9`pBx0I^OBc+uYZ5~+Lyi78(;7KcG(KAb!6{bx~0A5wKn(Y`PV+HD4$PC zU;W3MUaNe1!e6Jnq|=s&#H$}N?V zZ~x0{eQxLW(AfWYt(#=!=ELi}){<$l&%asfwLTO1r=DZV$@l5^>^xLKeHeB4yEm)7 z)_u*}Zi!v*wLbjBPen&Ic&!H;CnmnL(QEyC-v0Opws@_Ur>Yj7*h>1>96k2_4zIOp z-i){6n!MIqd;T*2%xg3HR}zPAN=8-FwMI6%V&n~3)ifb+R2DFdurC@ zr2}po-$%2~z4NkXynQw6W555GTzr{ky?6cf?u08eYx%?nD=xWOvxY{G32|MkS?7J) z^Y?kzYdq)r=^eM-q*;G!`o)dAeu4cl`Eko{)vPPG{JUi20L{AShaaBs+^$&%7fJW6 z8LU~OAL#Mulsh%+-{gLO=^M>&!_}iI?$NA{XCg0s;Xcjke&@dH?ugN>gZ_|^+A?zGUe$%UpV~S>d;%oWZXA?E+AK!H3 z4xXl2pZ(P~^S%_#nkzrp`2N$Hb=?g&fBQtbW<9bqseixUYSt@f^!m&CZ2ay%Fl*sV zjeS*)j1kXh)&;XRethP48uP-_EhR5#*5}N#8?s*Hyf-491Ll&?pHDg1GN1f=<@Wdw z7UE~#sx!6%%{uG-kD9K0Nwe;I=uz*M<(l<@4S#=h#R|<@@JRWgxYsmmzuT6$y00QX zmiB0@d{eU?E{nU_{tkZkee^G*-qWnZ|K0x?!ad&AmTMc)m)r8t&io&tKJI ze@e_GX@h3%zxrRla5QMvZ4V{hJ$EzZReQI6^j6K<=aEr;Lw8Uf_buL8wM(;Vb-lh_ zx|?*`w*O+{x5Rf>Ytf}YXx6`cGI{#eJ(~3cwMXJx`!#FoJJ-FLa8R@Mb*|`h^I`0l zrn&YW)vU!w|Md4ipU|wA{$a}ZIVUyi$bkzc-g8E?`kw#Scz?uy_vf8`Tk@Do{}A)v z(idy=i2oUz{r>-azI&}nx%>8^*8i58>ht`+CjY}(`ya?q@1rsQ6B#>U@~CmPv6F_` zM)EOy+$d?xs0pJcjvZkeJM50ZQhfAX(una7J}k|cktdBGA1{rLpET^@QBrnxvNUOu z&cWi#V2)%b-@(^OqwWx)Lk12K$A{Pk>A!s62TL6(FgSdal$nv4n4TlWJs3A) z!el8kF>OX}nv^gzPa5`cyfkgl&_rqUprIqAtfZ{;Bx&Nvi4#UjqsI@E(w-Gs;~o=A zDQU@4EIw!D%#bEd9xt>93-!U`+ns|3PZK}jX#ek|-}(=X{I!&sGb<}KCs~S{{K&+y zlSfGpOc*g?tdx*M{3GLuH9I+3L_2BJsF8l{)M+yk{Q6_@v z7l=7A$$!p>ky3U_f;1_1m^34kJdKO@>r9>HKV$eK{v$Kf{6`)h7dSF?Mrz>L@bP%7 zr*a5>WoG-2+lJs;+@wIz%=GlsfMMH^hbK%J+h*OD|7}@fd)QYJWR1`4)YP1WwCMq} z!^ch@Hf~HiKlF?yZ*33b$zW;vwDeSI%xJQ3Wdpf&eP=Dq{$CR+0*l+ zNn_%rSyR(9QqyN9NskPl@Zi`9509i0Wu#9_oi4?VcyPk#v2EUF4o*$aNzTenPRwbG zGH$S_`V%LO8Zp_QsA-vlh6aL1$MHQeEh%|M232IlxRImAKS&*+`X;4jrHTqXa_q#h z{@+7~O!XfbI%K#sDA8_GBX2-XD%E?~`1k>n$5O||5t0$DAHnx%{fN&l=jcXfr6wg0csfmbWbDXM z10ERH)};sDizG?(HSPYqzi;=0uimcSUz6WvQhdqRw6IAz35iczaiW7aP%({i(NQaCa#D`7@*wk16y z$C90rF)JO#n+6QJd*GnEvtjhWLD7PN--8DZ8r=3fOd2~QVLEMjgfuZDHzzecSsEuk zCS~MiB_>N@VUvY_Q-!D5&&-&bk(Qch$;h&#BFFxzXy3?{-jybiH37H*OxxaG%AWv;)qDLB|Ue>)Z{Gxkua&hMUr~m>d_i+ z^JpalJX+!H9xZPWatCrJa+gOl6YeIwh;TdMDTK!p9#42Y;VriiM!22u6vAT(k0v~t z@Myx_gxd*EAv~7wNW#s8n+Z1)UPyR6;n9Rg5blY>pTWowWGH%sM-px(yk#Kv2rneO zknlpnBMEO2KK92C!tI2|6CO`^JmD>o94FjPcnaaMghvn_L3jk=MTDmi9!+=z;bsv( zJ~rZGBR-}O9zl2uKDhCr1Rw2$+X=T59@&$8x`eR4oY#-@FXNmD>|8mL>|94&H=uhX_HRO`H^MK2%e zg{($53R#P89MX(lCL$ppq2CYvkI)^8xX^tV`5wKQNC>hL-J6jw&>f9zMsFH&9NjmO zaP;3qw?FbPbjKk(&`U#3qgQ}jg{(pMUZfh`Cy@Qz;o&mt$$dlor~?z6~VbRR=1(R~b&(9cJ|72Qmv z72Qmv72Qmv72Qmv72Qmv8QnO97X@o^$Z>RMBHyDs4f!73X~_5JPD8#&cN+3Ny3>%& z=#ECdKzB5 z-HAv&x)YIlbSEP9=uSi&=nh8SLw7LJh;BUMMmH95qZ^C3(Tzpi=*A*$bYqbcbR&^M zbR!Wry0J(Jy3t4py3t4py3t4py3t4py3t4xx)F#SUD1zqU zgTvuSI0}w|vG9KCANnQei)%#*`qB45^rP>C=tsvu^rJ^W^rJ^Z^rOc@^rbxfe+Hj^ zhdr|aM-px(+=CBpd~}lr zH))6`+)Q{QK9t~N5#f1+=MkPqxVRRiBoH>0^O86}nRBLLXFBnxV*fX!>1pDffxqe4 z$sn%ZqML>NY;7Xdehd21IrO`KME5h! z{R?48V==mj=g-84L?A_f;#|c2DYlT7HN=IOk+;$Bf&Sa*4n+Qq?gV5Pdg+K4y`{)C z$e+;t6;g}dQ^)~yS0D=dE6}|W`5fJm$VPONkfZ3$MfxHipgRO9MRzjtExL=4ljto% zu0TFP_a3AY-N%r<=sk;sA*;~675Ng~`;l$v<|D1>`3NGO z4e}#ODZW6K)-O0#CbSEPl(VdKJM0YZ>5#7m1DY`?D56~Tg zY(w`kq!QixkxF#$M=H_1AE`w5exwrJ`;jlvy%kx7?yX22x^c)_bYqaU=*A#x(TzdY zq8o#(MK=a1M%RKYL)U`1&>f9@f$mV`3v`DfU!Xe_`2yXc$QS4iMLt5eA2J`^e#pPj zy%$-7ZhvGAy8V$g==Mj}pxYl=gKmH1O?1PN=g=*mbDx{*jBx)Derx)Derx)Derx)Derx)F#ST@QLGh-Wp&(Tzat z=$a8bx@N?Vt{JhTYewwonvp#8ThNV1O6E|v=JI_$TmTosMX&%afiJ;j@MZW4d=;*Q zh46La6}t2Ij()ryq94B)q94B$q94B;q94Bkq96YnL_dBN?b`o0COJKqTePvvN2CRg z{cqCnV!mWq;8zMRhZ+GZ_^i`gnZ#G(j|`P z>*N>d3moTE{ZFQx^7$sHpD!rR6BPL%NcxS!9_fU#WYO&yrEr~!|F}`2fC*PbI5d{t z?*AR5pBEy+|NrtQ%BOv?byZ#l>W8QXf_lA%7XR-U`2Y5wUXG%CsIU1%E=URaD9SHT zj|FjDo+}ykaN2{v9?1T3_UXUKFQG5!D}P@*5Wj`KD1Tr5(U0r(p<}%;h;l#o&nV)h zp8Vgx|CG_VW&5gw>_dVSP?w{O7b=n-!8_gluc{>gIAN$q}e zzT!VW(4Xo3Si4h#enme-iqg{&BE|YSC8)~(r-3$`Zv}4L*x_R*jhAy3|g#Sh%k{miCM|| zdW)V${YZxtb;$V1DXG~)aXRZ1mRSkDrIx9=scAVPC0V)Y7BWi|2InLuXJ=EzQqwKZ zu!h2_Np?>1jDgZ*LPajjVu`2itZWKeFSdcw#N6}&lT%67h?Ha&TSh0Orsaw-p*J%j zD>Y#%K8plfaAj(8YWj3bZZ@`NrRJoNEB-^invq7)vOwmmG?w9KmyL8!6BBc@vXYbf zvueWrP?>!7CpSG&Z-8wli5yDLNlHr_h)9-4Qqz-ILbAli zS%wZ7zzV8mR1&qEe0|to83#v2-67VV(vxT54+~wnRG_KJdNvG{^wqRS64IU)`P2Dw z+Bv?D%1cbn)MG#+DRjJ$XVag)-0^?OPZ8AJ)K5K^=Lb>vtyQo98vKzrAcGQ zOd2)jVZpKE#t966Xp+F_xKYxh8M&4jx!F0EwAA#c_0r?p)ZFx0q+e7f3e~qJsIR$A z^JiN^T58TS6cYD7krQvRjL67Jj+{LH7R$)oj1IL48=_HCh@!ga=eG|Rm4%KklU6JG z01`DRhi1Ui<8;fUvExTtM&;!sr;DbaZMnk|sqaa+g@Ve?$;$N=pHR-o67|LJN*s1l zb7u&zhFGX8UB}<18Z_>+XR$Bh;(Zw3l@I@&=hXXj(E@4t$+IjORGS(8rXqS=OG1*r zu2O*KWcq;Y%;dz>X=2&5z1CSb+I0qc@l2v7Ot(xRnz3i|U0klt$@ug1*fTP4u%3M1 zc7*ojb`kpe){@S3er8{IZr2x=mYhJX=Ax21jjlh1b}}`CiYPkFjLhULYO82-dPk}I z-?1n4r`(sZqMorcWuWwbz-WJq*fyhkz^0jD6GnE(jsGK24(@MZ4@iHDzA2}_g&jHl zEo{fpePB1rISvdLovXO^c7CxC9eT%Wh17*c`)hsYHviZ2S@fdq>h(ZLPitq<=$Fp~ z`l?h$4&p)}F1)^ruHI12?dU|+petnvD3C=yG3ud)O(Vi~=jzvHE)aC-Y0v0Eba-5& z87Q{(Ip>(^JZrkXHq#JD?uD<=BN7s60=|Km$d<$mF3gEJxRsSGdRZ<=BsprJ#b4Qz z)2B1c^NlM~60(wJF?tZ$cROi%a8jU)5LXd8q%6iEfiVd^7ef$9dYyUTul({M{7bvv zOZfismmaO`-^>~R)1&>3?;HNbeBf6eHhFrqT%-=Ujc{>}knV)fgEwX0lyp{WsYe>9&~(X}QTZ-#BF8 z=)0q?JsUJVnXztSLRvzWZR#^NE{!Pz$?2;)o-i{xv3=WM+HE%~>( z328QyWKcuP!nVr0WS6lm-biV6m-<9a=bP=f(-7w9UUsCS`{IHM<420D7Hkkx9~P;2 zR1iOWey3%mC)=EsePQ9!ZBlcW=lcpQQP&cK9NXp|j_`G|`>->-Qm(y4*{aSsZ7O{E zKW{8wQDGYfkK4pm@!Nh6CDy177iUi9zIV6vHg>*J(a=$loOHr)(9s zR+=llRdV4gib4I%E$=$BTiX+uXbzXIm5Rp)v8P9pnm#SVcBsehup0R_`|O1-?a$j~ zMO9;~jEmo|Rg?qf`wZmYYZYETmnz|WJFN6jm+bkP{JdFeo!FIqU%A-yXq4O3ha6YA zPC7zrPL_o@PdY;!#!Bz{pPV7HE9EMAek~u0NgZ8osrmK?`2`Et%L_SJdP3Q{YrdnOYp-&h`d8%>H4}fLrQ$~};E$fx_P$VG^#-L^8(SJZ zQcg;?ts&mk&2h|$_~i*!Qm6%AW_-zsm}|L*2ngh%1hKxysNpW{y;yS|z5 z%8rOq<6O5~zT0{IVzTVpp0#qh?9x_Jh4+Y@+pZ1^m+p|_l7rYkn{VwC9f)N2h*zDO za*3KyD<9tP^OyEIEr>lm|9t&JRd}{v!?P$y%dw%KU3umU%SozQ2^88pO_7 zzd9JJ2`@7{JPt%LtHamJqQ7blW=HoYkuhwREje(@m~C@~I@I}Y(a=7w5*H)N;Z|ww zZ-V%v+sR4E%9wT5j%`OTM<3S#XYcvt!qk*Xqtok4I(xX-|f=s^dRw_P5-%(*4$J^Q+0GJJEn9~hwsqc$6lml$p~VvUAY9hRMSV2 zdWEA$?cuT>uEWkA%3<@Za&?bVd9Fjo=YN(f^w5J0^|bY^#+7rHE|~2+LlZETYYQFP z>{lILT=3MNaP}@!oM-mYLgvpG-I>yGO4+Gq`;v)YzmPI>FV3$lW|wAi85+N(H}%>f zZ#LE_4wL&-y~$~u>onSHP36XUPU9R`$h`Swa-&kJ_cM`F+{}x$pP9yXSlfnfr9I}m zQ-{rNfZ+zr1ZqnZP=%DOSQJ=G3TRP97I8HlM=b1V6@~e*H zrQr^F4$jWDZ<1H8{(};tj;Rf4{`N2yMVoRb+NrIt_tmcGU`hc(~yDLZ6EQNQHJW~6y@sB+pIWtg+UsGL?O&pT#RzEf9K^io>YSGkC< zs_3R1Qwx=T=8Te>acYunL-+5(cNlAKJE+ie zjyKFvG&Q9_IqCnJT~L2SF|-|b$@5*>i(HRtw6?RKEZB6Q?Ubhrb{p4ei`#zBD5!5A z`0Y7?`wy?vX8X>!8EWP2cls26(h4e-R}1(dj_wUu1LaBZ9z?vvO|2`s};C=DM!WE-CBVX z?oZ+50>$J1I;LRrSQ;IK84(HSxe?LS4WO5rO zX4|W0)^~e-lc<5BJd10a8siUI$^ZSpHSQH$v3J(bbBxxhWnqrvj?LI5%Odj9-yb=I24|oa@&egKg#J ztqlD2Y)5~9v^tpndHE##z(@yAp4{d)hrL^*n7>`5KdDT^PEXFVZ5bN09OJ$SV(&cv z0!BMHD6-05&myJfVD{SQm;csbTX%P#vIEXOjss&`>pBM#(HPrWVs+R0#P^*@66-HCk~w#{c=IA4QF5ry;6kv8+bacSI_UD@?@5lr{k zSXtxI75uFUujhuMMy^oS8y78g$qOr#C5*;KaCI58IYh6o#s9oGyUf%jXXV%urZHb; zbKNf7tmw)3RCS!D=k+*^Zj;lrPGewDe|m#j_S5$8Ia`!X#&!E${T$rV)R^6Jz3h}1 zl*<)znSNCl{olP(-M{{e_mYMSazk-F7(@xI@|3 z&B5rkCcO6O7Umu{aMe-cUGkjyW!k)rveQ!8>{6WHeRt(1?ke?ruNS`2{K4+NyASO) zzEjq1{ppv<;UoU`F<5F{8^n*Z?X44Ms1Mz07@CXWxl;_!AKl#6?gmQB)&;Sv*E3-< z(0&66{H~j*V>R6?k8J5)DZ5nXUU$FBQyWZMI!VzL)rYnkSHDpfw*K^Dl5}AEVRw&j z^*dkDj+#q@#NRPp=Q>e$=>-xd?!WTOg4k_Km)?K>ZzO69iE8oR&Ql+wq&jzy_&cVn zgA<)4O7vry6+!HENDtS6K#I!E>nZXL-8KaJt-(@pFgxe_)y^2*mR^Tk%*g2VC}B&x zdNif-V*CpX5&{l>H}t=+N1Mp0cVxF$&a9n*EL6P;zbzugUx;%bA~ZOeE6b)zj= z-5h;t4%GCjY~9jJZyrCmFAv&0{&co^941-Z^=2?c6yw8Q4MF1Xn67i2AXz;sxs7%n zcJ(Mf+yt2}OkB^kQOwUZ2eW&jbcw0%vsalOHHRHN9EfiD@r~TK-Yw;C4C3#F?D{V` zfvcl#)P>u+;m2zI)lAP1%chI5ALuIDO~Tv0Qysl)4u038(zsr6?%R0j!q;DaW2fkv zhpnnISLuDzF}>J{=PqgWmLTzT%=gYB>$KAq^3-$o$6L8@A8To5-tsu);0&RcfOzJ7~K*o`qDD`QCGKeuF2+sa;>~YH}3a0?wcU? z+x+!6`S$*PcbDU`nmyn3tu$5|Kc;p+Tgt%Ar4>}k8~WF5{kSr0eTdV&F?t@gf4A&3 zG4Zh0IimH9KJPfHC8SI=g(Jov#6aOICTm~xtBXsBNOw$25WhO6yA$WO-CTBw^T&!y zs(w^1F=rYYd;|4x={`x?8^ms~^tSIiHmfeoH|S9~f2@Q=GtjWL?S9~1Y4yJUGMlL^zd{cN!ARicy1=By9zvmdK2`vkCoNypc zLR@*Dc5=3Ar01rk*{UC^?enlJi^wZZf| z^UH6fF4WPjvh7OUFci*{w>9 zfU*q@dZy~-b&r&JDu~^4`j>VCjbM5E@Y(ssyQN;I|10}v^O&&)&Nm8+Qy%IiX%o(i)&#OW=Sx5*BExy-EU$GSu2F0ECn74{3%s7dv8rf_Fpm$#BMIOHW2mpT-u*eR5^%j-6lnjG4@OyJ9Mj}B=Y#p6a|K6Q0SSLyMs2$5MQ9mxf&c)GrYs#vXA?li!%c_*2>YHDil`3^}d5^hh zJm8kUDELc3DXVqweyxesJd(Sx*~{d~BZk^5wr;@M9*sri&y@=GQBh~aeSKZui%S>l zyqzZLcj|+VzUA6H92iDjXi+g2E{&DyF1>(Vy-xb_>H;=dUG0!@HhuS6!xbB^UvJc> zYK7mHeiyJW)(Ow;XFF7Wy>isCm#=LBEwJz+>TPi_yY1RjPKM3j&F%}Ow~my5kju11 z%;%=o%52FPY51mZ1J+PwMzv5c{$onDg?V9L7fN1D3So8}yD#tTRSk z)0I8nxZ9Vy&EbyQzTH$4+1Ti~!u7r5s^;)LM;p8qy|>AwCa2hxHr{kvQZF&pdsSoU zU31oPBkuTVy;`a)tdMJzC3Ujf=qxUaD>d@FQd#2sk9*iRCezEP>=QFquYb@GtyHTM z8-}>{&SwKfnYQqdk+LZGprOZ}-82KfT;*z5#I6hdzJAIF4Y#rX5!`HgUQ;ixmO1CS zl?^X6EI@rZKc0TqZG3OJOPTM~=DM`i^>Ue7Dw6|`mWGJW2E}D$`Ng|gu44dTe#Ss# z%_}SAhOwrhn%b{caf`;6xzbc7Qf1ZDCzfMxu}djCU8yYEpxNuYAG~towhHxwm7Mp$ z{QcVe-CE%>ja>}>AD^^p8|BKdxx_Z5fi0&Zwr}NXG2GZL{M#%qGA$Iwr)X+=rEGee z@5)zd+6N88_joqanQ`KyKWKHTX+L>t>dPoaDK|f5P;M0;hsDPs@nI4lMdlQPa))`N zp<$d-NPH>$LrxACo1Zl(SDU{wC|84aYGi55SY=v3TJ2=YGmel-c8u`r0e(HgYTPn$xm{r2D6ep9iyR_P-lwGQ zX9JY7o9ze673yr|jCqBDO<(tlT=})W5g}Z9Qd>~8UEL}#VyZi2w&P5tyj1LyVsqJ3A{Rvec$1X>WLNfSKWr?~r&%hm zs~2k)djAwmuS35VP(FKS&pgOT-*}q#`&3u)i%v5zfxo%Ci%IC3UJddlrS$ZUkeyt& z>a_(FY+RkZ{X}W_Yt>4fQQVIg+q$yrdn&NabW`uDKGkg8{9fK-EIswT%BMmZjcYb; zk{f(clo|^b)XLRLftak<^N;+d;{1oj6wkGsOk zkAEHJ6#G3A&aPJukya-KvD=y7?d}M;Ez&Q7F0AX8e&z}Ci!RD?Jyr0xVW}r zcMqH9&*npOmv-CNyR2!6L+_3nWHYTWsQp~wj-vr_MmSnL;gxKdBkx6D8&koM)uB{q zbB@VJ`?@@ihg^Rw^KOzCoK)?*O$+|L$=IM$L}Hn~sL3?1UfygfT5`a+Q8^~Ne*W0JhMsukhVLa{A6jE^W-Lz_%YUPbcD<)6((Y~$?FyPTD80>WS4P% zRkwJ8=F=eW*@@*}?Ie>~&94i{Xa zKp*A6td=ts<~dw|Ule-<7StK*8Sa|y($pS~jg6Y=J4uyGySt85c3*bFXd0=R2OG+7 zd#AlQF7j{d4+t!58l+oY{-d{ie7jS;XEs(VC(L6FO%np)P2B?DOk*?^wS)4U9U@!i z{CGwgXdZ4b{Y_F!MU58sfxVV?Rj$5qkiR1`eYjT*tycAtdSYW+ySQ3f9n20RLw2=N z3!b`E?N=FEs%$^9Ewno18}@wc(EH;}a#`4}*3DrH7cqip730pjWkLKp+uyXWbb-!B z-&E$?w{?RwWqA-gdjBF!=ymm{%ava0q%B%$?*$Gv?r!P6*=U+0sUaKkw;EsBYHBhz z$lHvo-f@ID&bW;(Wp=q%@ah(J7naLqrn1&uy?^LsCzr=l_HOt7=F8c*s8&>Q{TAi_ zz4k$k_G+p2Nt3q0)clPI`;WV(>Mj?zr7rI}+3S6uLwVc1&Z^B5+-~Qv>Qn1Y>t*)Y z&OW65W4q@3L)FaEgH@VC`@@$_Ue}Fc18$AR4U18I$$f^KqJl zeS78Q?wLDIf31{#$ar{S*-<>4SnE}?%(0C7%nulp9_FbAWv}{Xg-JQ37ASMg|CB3d ztkYH~3)R=%Duatt22;MI#+p(!)ilTMlh*{9jgK#oza8_I!I0Q@!d-%%)utVi zdhKrWmN5KZy2D#>Y)kJ`A!Mjq3}lz>J<)K8fM>q*)?Tk~v*d%WsCb>dcN>kakY=-U*B*QKqOKRBZ8&^DQTc5akn{&i7yl6d;fwpHB` z<}+08GqhdXE)41SFJA?*)0X#vN%qZZMYn3>2Cdpy?ky92py&_A?AFNT@iit!Cglg+ z;SFI67c8taI=pWXIBmDr6;e)pTk!4?ZMVilMSi7SLh1gh?`yByxj`g~Kk)M~= zPun15s8NhqO;WR}EGXkH>D5h)NW`Wp`G|0FO0%}n=r+DluxM$uQ6G(%j$W%?uE#3k zy+c~-2oi6{ej<<=fymFBtPO0W664e<&LDQr%U?13xi_>rtlGFmc7?jmoHkOE%D62% zs(!eO{*3vTvJ2Sj)E3P})KF2I#LFja30YYQ&)BwIQx@JFg4LhQmm5}!^xr61$}eD7 z)c0v=3Da%7PJx*Z9t*ZPdsc>s5t6=dA(&pLJ_WMvglZK1zG-2T8qU4rXNFfA17&tx zl-acJDYI(hJBtV`HY~05ms^HK?cr1WU6UH(>f>JHx-wvY{t+CtF+<}7N^ z)7Y_fxDRZJm|G#Q+$`6eViQ1z=2d12{PwjRcf-3~BQf zO-wQw7&V#H0|(`D9vNgXRqic6`J+)epbq!t%TOtEPmuUJ&6f@(eoedX4gYVJV)h2H z*XDmFc6D1+mwbhk+%FzFW*o>gDR*^8?pb-%xg& zY2#JpvX~+_j}!B~abjM3ynCl|3twHvK;`CSMIFC>7f<7l=NY%-hR-V>kMm%b*>qnW(?2Fs*1CTb&&bR~X+} z{Mphf|G3I2%1IwY-@QXj0`F7b^9`-4Z%_xcnd|H8hj>1%R}jBCmfJbb`K*3_gBnF& z^i-|fdPMZgQN4rMJGb0K4cOPOhGBA}T;4WJW&!c2ImFPyIQc%Q`H~CR>&%wF871KhrX+pdoc!VOFj_-|cKiy>m_585W9Z)BhzuRgH;lE6Utt{c@J$|05aCyMG?7&n}uFda+)^fRmy`FNKUb>jv6=}?a6r905_l$+EsdV@0Ewq5NZZe4COh$m0K zG&F>?H9`IMCiQ!53+4LJB5_i8!`I(eU&)seLv2W)fE^UD&(@XORi+foSBU|_8?MU& zUsw8?(&sm-1^#+?uM`y(#Q%=<;KGTxQXP4`m$TJ@wDw{h_kbENA`th9af5=`KU-${ zeP+WoHQ{xv>(5!h)RmJt0H#)9y}ZG+aL!z(HlNB7yFpQosK566e}hy!xGVd-z{mG! zdwGPLX>~DWUm8{^ZY9NiQ1gZKb>G@_sY7kwxd4POnqP0M>|1wW&fIxUt&*v9-gIJm zbb z=AA+8pHqH%CI=!pZ`M-e2e0iI8pNKSCpGg_O zWBz^ll_wOgq?yR#?Z(&K#y6|w*9#UhRWCZgQQv3>%mh`;=W@H-Y&R&^s-G&Ayud)* zH%7%=oPYj{(1DnBJUz0mhwDs}&#S|(Zho)m2{LyoUmM?X%O8mN=kXYx9zSDPRo%n; zUDCznkw4K6Vn$tDyvfX$)LmWED}y~$LlXejSgbxYp3i^;dB+55&tLDJ?M>q`%HIo7Xyt_bReSa9_%n@b8SgNyDh7v6O5s zW9Xy4Qyaq2=6gk86xFB62#8ga_`hwO}BIQ zsE-v-VFQp}@2%RhZ0rGs;N zItNM8V?pd(z(3vCg`Csv4wUkP**!o1gh}z}LD<&N8sSS#>B+Rd0U>JP{pK@KeX+y-|0jRGf4)Z%&Ux9AzdUIvz6OeP4v=DOKg%!Qfa07C6Z2%!lpuC4;Fr(Xd2ZpCMam3jkAQABDGEp;-7D!OMk7z=Dr>6y)Nv%ChTqZ z92NFn5caN?@{@zx^K}^K7;Ep`eqn63zrI~7Nh!hY`RjheWiH-G;MB!ws@(7F$y*8b zyZXBJJNwq`-`11;V|N=C*-PaGE;bzSKByYwS2Vd#kuU##ly?GY;^y=%1JisgK5FV} zzRWc!J$Vb=ar0_}qL^PdutXWEk1#|!GiL_(ORw{FzYvdht<$e8=01jn`;83NPpZ@P z)QSAMR*K6DZpU9o>v{yS6fRvOMLiqbj;~GyHG@CbOTC^8V#jy=_Pf;7y{31yvCyG5 zYvpH}jrt7iXf|FLS!jKpdxlv%d8OTJTvCUX$uE=7qbrPC<$^keok1ggC%cS0e8<7Kik^&UE%0g zv$ux*T8_}l6MMpTXqDZ0;`ETx(_CPfJNKJ#_6Uq5adGwHrBy|%#1jr{D?F6$niU+L z%)vFUI&Lf7G`sFr*Skszn;E}UU#8tWY2bn;zC2-|^u?E4!)DcOWLv&m##U61Qm~3W z0P~N@@9s8k3w_f=;_x%-)>X= zzgF;umu&HG9&9_qo#8b{o#C#dHD+GI62AGgOQ|r@!oI8ZRB9h>5!)<2TYgwDg+@gKqUU7dQwra%6q4s`J3Y)z=^gu}dQi^iMDMwlB6->zLvPO642 zGH=i`t_wXbuUX&-S?AUFI*-PS&leN_pEii+1U@RQY>cilvQ62ky?97_d$EJ*1x=0l zf^AhUc7Z$Dfi=HWb9ldzmndh{Tw2n<#MFcNdC~du;T8KoPMA~0d~Y|ITEe&E=6Qx= zCwZS2HLb~C2zokM$0!YwPCZ%TCMa-oo|HT-AvcYUOKXm(*Vf#iUnU$1%Ov&dZm+{X zm%e3hE~y#5-e_7&Z8F7Zd<4E-UL~K9D@IeI+AF1>RZUn}Dc=3Iuu85lwuWpbX|v~X zpLR-pcIEP=ElR1e(d2u59B<*18p$C@0ez2s$zOYQoFyr;84gq zvv}dF<78ckX{M&iVpr0lf{M`g3Z->5QTnN>>y*RfI8|k;IMe75yPiYcRA85P{-T^p~Rq2s@w%mRsq)M(bHW=$nE1Z-Jr8Iq~#y%yndvJs5DzCbCS*_9Zl%`(q z^1k{Br8Vk1tvrFQJ+ZvI@)DoF6@ejcUM4u32_(5nbN;IAADcDy^J#Ocw7OyX{J?|X zX$>j<`gfhwYeQG%;`{d!HdD_ZRilH~2Knl(rAs~Evl^n))Z0k5ZU3J(@dC>Ed(Aa$ zcjD!f<(?e}>w4(*<0jtE(Ul)(|AB_h^!X|E79PzpmNFimUB+Ag$g5Fv=J4Xj`P_)# zCzpmTbZ#o`zhLe{=Z4a#Mb7o5gBLk#N{1|RR+SE2z`4r(^n7+hdh3;~ zVv+M%YL2~hmYt8^+1H2I>q9=DD_*cmvxqZPn>H%zD2XLi3~<?-Z=+r3=DMq=p!P=67wYBn<`5l8Rv|QYE z|Jfxz6Z}uUiT8XzLOCsK@!1retMA_Awd>osqq$`)_=_Sdi8Z92X#^Xxgc z_1z_5_Z=RTTHVg>6cG{QxwiL*`>+1|Ga&xaMr!g|>!KcB)~2i5Kkr=I`f#j?ezw>j zN2lkBx$3~pIAiR<7UinqhLgJgky5V%UBssk zScnZq9Mjq`M2Pk;YEw~)Fuzwyo89qOr{ z810W;_1>!Y-7;%P+>U?DTWHIb+EeVhe5_19EPwT<1%clgD>=b7f1%!KP8Dwh`%3{~ zRpQ*#m+G`P=DS3fNRpE_@RrbWtxDTr#=l=kG2SlxOXdyrnaP3TJP^9h!dU6`Z+J}} z1=VO+EPm!6es^Og!7uD-E)m}XvTP_E*n z5TuXTNP1HJtYWPa!;rRxL%YSLccl3a!%vGvdEO!|>-C^s8W*hhx#=BKD4x`bbM>fE zT&H>T5vfNSPFE`o=IQNTEHl~9463PPxtC7y6&^#paf5O8BJMuxoBKQE2JdXU^G8-L zv>F-ZpsesXxiGDE-COB>^*xt1+v(-9?&Zm;N_y9yjC6noa!(fu<|FsIJ@1M3PFNxH2Ido+C> zZDRjLl2GY~VJV%|OKBK5>#eJ{==FOUJF!>U+De6BzoYC;!%#o0vVs)-XTt z&JgkZ^f!9B-YP}i*M%KjR~QKxtohbwr%b$EJytvmq+b`ivJ+4j{j}d9zajlK?ZP2p zC+1fd;$xblaZS4^QX@5k4q$M8V^SZJ5#I|4vPgg4Q zw1z8)m0J)VN@$W}YZX(aUyfQLqHIj5A1I!_4spX%8%oGe{?)hfVQ@{ zC-HA5;gHD&sSm7!m&3@14AONlA4bBf9x+Jc;ad1G+!1e(Qs5Jh8>DpD2%m%FrW&L< z@N>8bRwo*yLRgYxkn&#LsrAam-fKIx!UYB?9+p5mJPjLRU7W z82kE8%??XoF^pVAys!vLYYkGw8~6?FFbS)_#FGt1Ebj0 zVE!BFhY@fJjD&eG8ZLveun5M(wJ-%X!aUdt?a<6y1PY-A7Qtv(0^?u{Oo0(!kbW2m z3t`GXNgulkV%PB-=DE=4e-Fi$<1chqlMdJj>tG9PfgUJ5f!{ThBaDVoFa^fKJU9iG z)Z-_NY~=To_`ef<7`cmhc>cEV8~lMqun;!FVrc%B@_-Sr8OH9x9~-|9@*Bn;B|TI4 zeT@8uc_&GK0{H+funNlX2KF^ zhiNei#kyFdnXkd9Vc9VI3@lEwBhmzrh}ifNmHC8(}PLfm5Id=0S4=>4y=p2u8xS zFd8<(Sl9~Vq4{a@3tC_vjD~g?2Mb{eEQ0y41QtR!EQXEH4O?I{^gs_ZUrzedh#yA6 zNEid7VLXh5nJ^yOVG3Lg^I!?I!#Y?9TVN5CW)MG&fNmHC8(}PLfm5Id=0Wonq#s7W zA{YtR!f4nCV__?dhvszRhZdLzqoEzf!9th0a5c=EhF{PQJyynuAU2-qsPlKh^J|1cKD!znNi=D|X^3>Lv6 z82uLU!B{9Q;CvVXQ(zR#gR!s>robYY4@+Pnbi-otTWZqGc4%zU;$S08fgYF-&3&6R zj|jhk;|qx|vPmm}_Pd%i%OcV>qDjkyk)xWlLKqE;Vf=$lTEt@Xe~n#OGON525SU^HxjaWEyJNm~u=NljWaY=j;dk=&&9T7uuHoCjOdnzUswdPb901oPlp zXwM`)OJR1C77I(@6zG9@&^!zOVZ^gdn)DL!!3bCcqXeHPJ+KklVZ;mgBlu#I)*?8! zNsC-YKEN1ghw(6SA?X&!p&RDGX4nWl;`n0hFUOw(@)5dWK5T@AFmE~e0;5;p&&&9` z61%YEb;4oZn}kCq4XMdU<9<65I-!0nXm}jp&J&#Mz|KXz($z&FZ2pI55~Yo zm;%jTQEy;0EP=7G4#vY4n758}zs~t^3XFD;4p<25pa+^)kxx$Y9md0Gm;&QqVIB5i z5iEip*a*!VC^r}Z&2OL&Eif8J!#p?z+F>4S+(CS>1-8K0@9^tQ;)5|T?+bW1(Gy z!(tH*-LMfh!$@cyWX-IhTq0V_tS7_?%PDnTm-ERsQC0jfl;8nt4c7L77BYK5p3qpLGw zw?(bKsC&MMRiln))TvRcMwu9)K-7sr>obl5Ve7VRD$~`_i6M4{V)lmFay&t53{fY^RNo5&^AFl zbVIL)ykQsyVG>4Q9>!r6rl9-mips(uEWkJ{!z`@9Jam4Q{?DZy7>5z)J)eA_ALe1X zhj9sCSW*73!3*d|_#(=Me#)WqLdN}d;-D8sVF0FK7#3j+)?pGlFQOmlg?Si+B^ZTO zn1r@0`9e3$Lmw={Agsd(bibHl8QANZSceUG@C{-(Sz{E@$@1Ps>xrfRU* zv0H_A(Eb^_RRR_-+O6_1ddY58gW1b=EARIyU%y*LptpawN<;t4cB>rBUb9;jVL7^6 zxqd+0+jpw~^uA-a%D^nl3zPUCQvON2a10OqTX!pWp8B7n9G1r^7p8YB+m9&!BIU67 zjor#8+uJFZZJ3Ak@9tKfAJhK#b}K*3|BQ0z|K)D}MmqZ)MqnPsVG*Wa8D?P>7GNEg zq4PGz4c*W=NnX$c{m>7CFa*Oe3ZpOq<1h`AFbC7H2(z#P^RN#6I~mVU*@k}T{T2B^ zKa9gH%t$%ROZn}@OF67dIrRLDa_EQNUlR}gFb=aYBjqqJchA9|@Sr~@}n1p4RhBcUl&R@|#^uQwY!!iuPDvZK9OhD%Y%p3H=91OxDjKT^` z!aB@C*X^_iy|4-c(D@+ahh7+iL70S5n1M-{hgn#HMOcMZX!|ws4>5k|g+3UBK^TP* zn1*qfhbdTvS?H`Xe&~f|7=$$#h0Y@VLJ!PBKPSVG>qg z7S>@Ax_(1E^g`zz#t*$P41+KRqc91RFaxtN4~wt_tFQ{4dl~;7#6vgqLm!MEVf?WA zDC398I(fn@OhfDK%CY9;-A`+k*!!JYRj z&t0q|=!f3l-LK-%4^zT>?^jt^{L}raF1(-kyJh~^hWza~<+}&oFr(7Y|Na?OhSg8b zs6dJBJln8(58Ju$;G(2T0V^#8E^d&X;f zK)H4?uC@nM9Hw0ls2p@Y@c~tV!80CE&OgxpSr4c@bUy6?Rf2w4g+XY$mw4!fMHqlp z7>0EigI>=ADhd5C1LH6clduHyunLRN_DAZSO?xm1127Mxum}^d3e&I-bI|+r2UHRI zVMVr|!MMt7LoZCiFigW3EW#u#!wjs$Jal%E4~)Y)OhVUv#6d62!T`*}Ff76t405k$ z8J4f0-k-=124MJV@`m--kS`40$oT$D`zbv1f13VbHpe_qvyP@{4;JrvKox{#<^`6a z?Ju+o-LMXQ(0ShjDhRzW3jHtvgD?%lFel~J2UHCfFMd!({+sq-99Cfp)?pSpU-F!R#++ z_d)W32^cOiUk}kP48t-^!z#?dIxIrxZQ{wnRj5G=wdEW-r!-a#Dn!wQVT zI*dct!_>Qr{9qN9Ve}7_@1-2NW?9G33;p-f9t^@X48t5OL-#)7p%2z!5C+S%3&XGs zqp$|u_c6ZxbP??0b!?Xk4um}UN48t(Hhjw8e7Ns0kq#V{^ z6}sl=7kZ&{FY&Ss6S6%^elQ73Fb%6P3vG`u&V7szhG7UsVHCz;0w!S^reO{ik1&r% z=pQCw6=q-^=ArXZ`hjj(g!RDhq%=bDGzi*KlH*7^uwt5H4mwZcvu$?UGv04AM`sPQehZ|F&KqO7>60? zUQ0am!aB@D?>`w248W-CA!Yj)^`RS9Pk%^dVfbwFQM7*!dBFI&#M!vd=6P(x@P!Yl zJPck!J1yL2bHzg{4%5kpQ~|mt7@wW{X@1Ulp!3d$R0@`VM?d@;8u#yMA9`U(ws(;~ ztim*O-un>0W`g$r$b7+YnYdQ&3#<#ba2OH~yVP7n{B*{UkR?Dwn6#n=0) z&?n4SRRnr##KZEr4=dkE@T!MZQ8>!>$&Byg5330D!Z^&soNRyMVO4?egSNI7+Z^=3 z!J8je0eBcjp!bsxs|57JG<1&9J`BSejBci%Qy32n!|G=qRv8%m?8B-IvtOXycDDcX zVHJhxuh2iN@;5YGr!sF}BM!#DNgQiVG#Pi^RP<6EG)tJcPT%O{(nF@EW;%9 z{*-d){2Aq^(;xIf=g;XErf;KP=-)|RQVwlTV7o*+&|Rk=7=?LQhILr|`@_oLLBIcC z{$TolD2Lv8%3&CKp2+@!5$OCE)fM?Ft~P)a=K}+ZI22;|0#P^3MO59R2h0tBmT*>0|U@~I`OjoMB<_I z4C0?c9#0`2rq3iE`aAci5-da4ndJ4fJt_?AFb(5RCqL+Z#vbMAB<`7eR22Hp*`u;B z?%ktm(0T42<$o%1=g}|BpT9>HVE6@ll`}g_(Jl0RRhIJ`_F?pO#zP)=?97bUlR$&!pFW#fPPiMYf z!Z=_YreW|B`hivGeg=63$OA^#Q4YPAQ4WjH-G#rLa#)2a7{7vfhR*ej_nG7Y{m>g^ zys&;1dBWt?j2DJqM)^5x4>DiEHxLiYunwcwQvNKq-$XgA!z@e=5f7`^F<)M}FOhM= z;#Zh&=>IDDJ)3wKfK`}~?XOb~PodmLT<2aDgL#;P^|SV>I*fbvD*yT9 zf6iW&fYE2|RYlo`HR$y2Ri5XQ2aLe_bLby>&!=3rq5lQ+*F!w?Ua(gcU=iASh`(^J z3c}OHC7rMi=3#+gO)32x93&{VCvKpwDuFZ=B>+S$W6VfrBBhecS1@j3eGBhR*3 z6@^9jtjfVMEX(#&W|jML#`)Y?6@fwDtV+Q!%!-Evm_2`1@qKDr@rAQ01l^a+s1q4CZE41*T!^%c=LBSrvf(?=l}S4CB!KJ;nvgumIyb=m%Dz>lNhn{aMuw-9I2t zSpFgN2kWpXK2Lp^hHbAT4tiklN8|(ZFe-j>R_%iB0_6jE7=%?g2>rK_Hw^EbRkJYp zt6A0eD(b-v(0@DSF#BufAC{r})r`AHey|Dy(EpoRH3ai_u)bmZ&RI1D%fDwoy@vQd z%&KV^{v+*&na?uw4)bsV`u{Ym=7fKt{I!e=#$fobvuYB?VM+Y`%=_z@?-|w)Ov5B} zKR~&7I0OB#4ujD3dh&oln0}CUVIGb`|3mC=7=#63m3e@1$alJI;XSh|0lj-Ehtd7a z_Zx_Rg!zNXBlHi$kFtMc8y2M;PQ!Gab#pEK!w%^G2l>mkW1mXGWa~b)9oFF#EUwkD-bDFX`_vFjcGE8` z!dd8i?mlIEGws1%=zZQk6@kw4=nt0R4D_GBkNcvTujkVa48CBWO2cvw{lNMK`;_}S z%3nkt(0d8xFbRt=xNe`CmvZQO3;P3hLFX0wxL=uam=+K7un5aizJ8x_zLkDpH*^N~ zsR5XVBhY&ldBQ3z!aA(NWdAxqkr~EKl+^3>2eJA@B7GYle6!l>py57O~ z?xH@7-_8DkRX7Tx_b^`BhPz<4L_WgblK(qdAHQRr!ZM6N@9+0kv#a;3aTr~*U**L+_j6w?^SE}uvb~4)pclGN-p~E8^beyj ze(HXehS}5ht0K&wv0v3;5xU>YxS=1`Ur2q~zJU5LcoFqs_%iClY9H+nGycnIAC|A& zui~Us#7_=zk0C!Sq{c?*{VQuwR8>@Vom}0=j>&U*%vL zmSOov`&H|W#Q$`^^1gfm62uwcdfZ7i0XB|+}(E0QO$~i)w z&pe=dVEmi|DgvYD9#AQmg*oUv?*R9glIQsclh+~ z;a40`9XBz5uR5UmU=_w-{xt_w8v4TrR1t<@6~>|S!}R+)@_^yjA5dW!hjCbhY4L*x zR6#tfK<^ufOVAJW!YB+v|Fs9yFwDO3fXWCX2h*k>^4&Ex1GBL8 z6ZrSkln+K>1jb5qyr!bUU5pPF|3E&_`wzwk{qy8M#yqziR0A-&>Yz%%s`H@A!{XBps;X>z z4yumL%)>Jds$Lkp^q`8tYTrS%4MyK^P))()wFgyQ$}#%Jr`D70&Ka79-pc;Z{m=u2JpvnrrcTg3f`v(WrEX+bziuQkWQ1!qf z3`6fv$RAcGiG$If9^}4J>J<*E)=$yjFAu72=>F9~6@tNEA5_E8f5$=Y8zug(gK82+ z@1`FZFCA2#Pt!jPz$}cwB22(C%)mM}Qm%ieedvS!4Tn@j z_>My=1%ogLqp$?yum+RRm1f+~2lFrli!cVuFa@hH2kWo~o$oxPT0c+w&<&%o8^&P( zmf?Vuzw3~S!ZaL#b(n(A*da9m-7pWma0>ci1qR_9OhV@uh=-jp3wVI3BsH-1P}VHomz`D{_x3Dd9_7U3YQ!x89x{~@&v z2H_-(!fBX<^DqlLzeF7Dg;h8RogW|`df_%0gp)7|r(qJ#!z}FlPxwK`BOGBIu>2wB z0XlDDzr!Fb!8okJJalC!|L`Hz1H&*3^DqwGi9;$4lW-E&;WUhXgnnTadcI7(kFs81 z6b`{O9EDYwh5n7K3z&p8n1`-gD2G1i9A&*iKa9aBOu;0~!6Ga{=f{YLe(3rN9(KX_ zrbEgP-5)=s`o+Tt3?~n%Vd(tCA?|l&Uf?$IH`6XG!<{hxN!AB+j~!C8Fb{1L%-7~a zssq-c7pAwcf5dMkUzmh3ScEC)Owq2C!x9X`85o6i7>8|NB@TLE8uq{}48lAdghd#G zWjG3}Fb(T)J9K{PkSaho+y%X`3gd7d7NP5F#KSIFg??Cv{m}Vo<_EgrF!aKtl*4VX z_!-6lv*XMUEW;{vewO^d&iq3kjKTq!hH+Sg+h83Qp!ai(ABLg)&b&1A!eW{{p!@TT zQ~VbXsSM1*f^2_@^U^oihF+M5L0J7V=S^6LIq1BFd4}PyvY)<5KF|;2Fbw_QARicn zlQ0aYVfj|_`4;U#FRa5LEPsdg#lxIW8dy0?=L^uzFvsSl%YJB-6AnEe^& zCzyvFw=!PX1B1WhyaK~81Ea72tG{Ai|BL=$H+0_4{J><9{R7i54YM#0y?0Xo+l&u( z!yxR3#k*ODuncps3QI8iTh0$T@__;9zL(<^rePX7E1cJ$_aTli+1|tY{0`eN0Nu{R zDh7*d534lHo^)94gjHCDcjN8hq(`z z@pT_oVOWJp=zi{Dl@$-mun6lg_&nc~?L{V)r|unOZa?I&+ohLg~J zA%EWy7NPA&)Po-Ayomh){V)QL+3sV0 zU>4?~_j2}&Y(xHNI@gofpRfqSvb~;h!7|LkaPY7y$u_LR=#|XJ&zKh&gwd)1LxC7?lE?9+g(D^drZ)5zh z2S(ulOu}K9hDn%(+h88%p!?()Rn1R^>`AGRMn12}lCC5>bc-RN)Fe=-BWdFkQKWO(i)Cf9)gOFA7h3L=|BbR$v|0q4VTNlOEs6-Hnk#-X$A5tV{&n1x5rLhyG`fKlDEP5j6*su4oGC^A|9FSbPzA{hquoBpz0KA5r75 zypDMme+BLDqTbc4BN%+?BWgQLzl?c=`4H_(Ipj|T+uW~Yy};sYnJ3{O^zyFc^pcfWl5SC#C`md)Q7=&pU zhB+98MOcJYScY7*;Qc44klp2iU=h|}89Jw#r(yDeK^TNt7=?M5fbRE^ z5A?!3^usCHzJYPU_z3I&FZ6#C?LhBGXa`nd1V%r~JV`lBiBB@$Fu0X`VEnV>Bjstv z_1}#1i?jpt|G{wz%m2wbh4BpMJ6MMq=>9VKz&tF$;4SPo=>IzV|F4v1$qS~x!Eq0x z-=sa5{}$~DZzUfo|2FwR?{{fO{0{OF|9$4CLOVZXo?#URp#MjV3l@LO{J`u_m}ltz zDfz%EEQ$XO?a20hjO%Zd|BZ3MV3j;zcrSTC{{iA*{UGtseTaA%g;kh@w%zmx-LMLM zuzZ+#hWO+9~co2 z<1i0Xun4oT3=6P&>Je3e+0%}wIt-sqdo!@(i1I`48MFhFPof=|cGC`YK81E*{7l*r zf7TII6`p-W^*lh_(~qby%)=3we8v$~gyAm!YS@E}1G-@x`e68(N7M%KFd-hM#h-IT z?Gg{G;-T#!wx4xG^};v|!6b~rG#r6N?-8{PmSGNtpL0abLT5MeRq}i85#@#P=aDC@ zpLax!!|eHt3+A7HM3tbkhx!k*AD|mXp-;B`^aqOqVDb%=&*GsMmSF&8!Ty3pn1T5_nO9hUknxLG)PIEedeWoH2czCcRS=H7@loz4Z?W~> z_$c?2x7a#A@hJC`x7cRC`zZI5x7eos@~A4p{gf#IIIs>3AgI6^xwuB#~Y_SV%H z%wAkqQ?UM$y7D~A_GNVyfYH9X8ic_s>S_e0*VolHSca3Z4yU0zSXcAV4?F9`y_9&E zgb`ST30QtzU1gy6&2_aC*5QnBsIFT7-eQwShw;;9Yx%${Y%OtD%b9I!oGFULck<8m z^1rBaq)y)&m!OM(J^U-aklzjGsx9Ob8w|*%^*gssFZm=iz8{~` z_#u2o<45p0jUUGsG=4k2r13lP6^)<9*ED_(Z+k;Pel8hT8~eef@m+Y2#`ofV8b5#! zX#56zNaIKG5slx5k7@i4d_v==@F|VwDT}|=)I8pKd`{y#?99K$cjHSM--oYg{2;!j z@xyrAwaxjA;awU(f%jn&uIJz zKBw{H_=3i7$CosIC%&Tb)A*Xk&*5!vY@YwNR_0&hyYL>3@5TF;`B9o4zy~a!T7}?o zX}fF8erdaVv*Xfs&z9Cp+r3*?t!wvfT)nQ{ziCZhd#c58gQMMlJMOl1?cRH+bvM=T zB5vx^cIP@OY+Su*&6s_&V@vDSRgOnmj$T>%lk?X!d6b3%vT5UMRmMa79KLW}z}PlU zviwi-ZX?%{jC5B5!nzhM8)`N%->e~x_0+Q2YvC!Snr@;H~qTkci}ufMO@$=X57NKWV|!@ zkjBqTKN{b`*kc;sjZbKNA3mk=gZPZb594zhKZY-8`~<$F@ss$9#_z({G=3Iud#5=+ zKK?5YnV;4*tYeMu#78W@FrUNJ@4?3`A7BpU!8+Y6>wAl=@8#>n5pXPB0W577OPghF zE|ksoEwWJl(4wzK`?5Z_({Jv*0shCh7yCWdapgaeZMMv3%{)$I9ZwP$`&87uu2aH-e8W)L&c&E9AfK_|BuZue|>FqsX?@m(4s&i~SyJ{hiQx^c}~s z{zgt={9m``>-h6Hq4VhRtiRTF=3~1xAM6)-7_Zk>IFAldrvbu zidp_T&p4k>&`;sJWOl;}VPWxWf76#GdDSPvboJ8?$}7G9I$d2Jp5!0>-w__-U@c4S1jB z7wY#?K8g=m-o|@!c^JoEUwbUr9)Bq>60dBJy|g`kjrl+OHy2;hbW(Sx#NQc^Fq`?) zX5&>)Ox_qsJ~Najtn!6^#n0nY8sBj`^R4mS_?*V~;R_l+h%agUFutPkWB8iJPvC7+ z=ExfJpTxT~eiz=O@w0fJ#ji$z(+KG z3Ln$>8GJ(H=kY0x?|35fukqdZoW}Rz3mQL&FKPTRzM}DC_?pH~;B9v|&;KOerSZG) z9*v*H`!v4w4CY_sJMkfn@4-hjz8@dc_#u44@*ajF52oHWg3oCDIKH6q+wm2R--)-~ z6W|BqHh!AzPvborKZg%!eA|;4m&SMD6B^%(&uIJrzF_&r^VJ4?N#jTH6^-A9uW9@a zysZ>4M%vi^6yBxrGkA~2&*Oa>-{EF{G`<@j()d1nMB@kXF^wO_Cp3NxpVIgVd`9CZ z@i~p(g)eCQEWV`itxsnDHNF#H)A$~|?YGVI-;Z}`{1D!w@gsPj#*gCz8owPM()gYD zh{jLjV;Vn)PiTDGQ<#5^@4{y^z89a<_yK%D<2T?-8b6A!X#6&OP2+dqZNF=t|0%pn z<7e<5ji1N+G`{0Z=3nEx@ga@x!$&lJ5FgX{VSGa4$M7kQpTK7{eiEP4_+9vd#?RtQ z8sEx`$cp7XOszcR{M;!oE`J~32lHzDG<^@=rSbiEkH!z-eHuT44`}>2KBV#6@ez&R ziH~XgG(Ms6bNH0Tw>_14*7z=bPUCy=1&trTmo$C@zM}D?_?pIV!`pTRjG1qo{~dUj z#!ulr8b5>gY5Y7spz$4NG5;FhjgM%2A3mn>gZPBT593oBKZeg}`~*Iy@ss$1#_z(H zG=3Ie(fHPGmqFveR$iw0e&n!PYin4*7#w(N8`uv zK8>Hi2Q+>XAJX_;_=v{O;$s@$dN%7+<2&&wjqkx{G`=67)A%8LLE}g8C5<1)S2TV* zzNYaz@wPt(__1{Ur|~Y0pTm1JzU}GEzsAcQCIOA_#fLP003TWAd&zABK4$q+i;?cq z&sVp!u5YijIDXQy^uu4NDe>DSkNX0$Y0DigzSQE_qKWSyW|sKcp8^uT^!nd3n2$d< z`%Zkw@{Q-;9(-h3efeChAD>$Ai`ScubzS*{uIC=>df6a(>>`gs#T-v!F^~V1>t3=S zdb-#T4_fWBEf3>*)#B&-eeFJbq_)i6Z;{VWx60>s8|8EMP4YRr zW4@)`%SU(~KI(S!QMZdv-uTqix3P88sx9`d4&&aaowS#DIAAnXGMh8=S>gJ%tcQ8x zLVL`(#{JvzO!lwkBUXD-zZ+k$e67Lv;d6TfhB1GduagGxHH{y}`(~T#kKtn)KOyZ~ z-edH_?O|{dU$T6u)ht-t4~z4-zP;vje7|*ZA{XweAVkL1dJgBag8`#~#(C((=QO?t zUs&dQi0;RiEMMWXDS42OweHrpXWAThp4{$U`0&&ym;OhkpMM67?Z*DMNk1CDL;6|f zJBgmcS1eyLTC>^KbK{8pr|nKDpOt?86);Mcm$MXXZO>vIDYM*XonMHzJD%EN++!hu z(oPTca<+A{XVwmU%f}&)@@=FUchH;PWy2Z#b(A&RRMSc^(?amnvAmz7pU4Jl5Yc%>F7Z2p;6M zk>fRH-_-8nH5x}~Y@-~lkNw}QW*n~@i1$77@yBl`-u0};`{IwjUU9!Tl^vwUrhIpF5!=~Er|tZ9Beka-!Cc3-e`UZmX#Y1i_B6`udkIok6- z@wE%gb|Yq5^8CMrb?bTU!dnW@7Fo9D+YA2RL%q)Pnco+kc-#PSxyKPVMx4ukV*Say z?IbQ{#W7UlA$}U4(fB!h$?`6%zRYvm^I6B14;=OUu-b99=KLV@)lazc4R6Zy7Vx!OzwgGOlHD;ydv*jqkzRUcEHm0aQQUW%=5h5Ih$5pYD4P>)Q)+ zEskApI{FQ9eY7zl{r$-7&!#*7S=UR}x93(n9<(3zeg3SpGuga8S}$N-FZ07x?ZgKx z@3M9{^R~%O+O4l_FSfqAz0_*|H5>LHZRATCZ@wpZoBb{Fzt@hfzIyYTtG75E$&;pn zcLnbbQX~ae-FDCVb{B8bc%e{eVk8=5ln%q<=V zjo*Ke41#2Ejb!jkHXN6=jIFtPv-9dLYaMSf`+T{%+IS^my?3BP$EMb?HJhDV)^4?% z9rn{->x=j?ZT6RHI`0|#&6wJ6wrpMPIM8yB{raU>w$?H4))!M&57E>B?WHPadx6FL zSGW$yRfdxtkDPq;Wx#!rCpUio#kh_(Nk63nWi%# zPb^N>N7se?IN6L#tXev*rtf>O1KJ$dt!n-vhkT96ylyv4dkL4>o@d$d+<5)dSafR~ zi^sEE05zL2U;ooi<_TsyAu}z*@50wCAF#ZPV;1l0IFWHgjyeuG@AqEB`S!`0ac~XB z`koRyW3_`J7}sUwNVL*7@*E+))Y+W>INtMA(=X&N{cXobET3C;oEq~c&oh~m9NVnd zCk@kOy#JUb-u3jypKteznZIW?=i7%*SbibjKJp#J7cB2O)_y+HaNcf6T*f^?J0-8# z@AC8i;<#5k_S(&PZU{H#c}C*THRFA>Cl5J}=kc~~(+BvkJfy!4egrJPB=2SW)u!36 zGVTH5L+6?8E{R`uecxE$bNX>he%oj#@_e(M#`V1epR;^`dh$Torub2_{E~TEmiMeR zPs`V1+r`Acuz8-k@SY2n&XbI@7ay_wlKyn#q|+rIWLO7+# z<~P;COABaI^5}mF&kO6!JUnd6L;MgvW%#sC;cc&O&VK~&vV3FyjOe*+vtgh}Djr1bG;*Cl}A>Tv>43uO zUDr3y{|>yz^0{TN#~0`SB*zz4>904;5nqZeZCCPcyPQ0h`A&QnzGit3+wx%j7?ij^ z%3benZf_9pS>}!NKi+5g)KS;ZD#uNl_0vUvJBTj~oBb`!FZsMwjzrh1%@r*5rm0su zj(V+Ekmvi3-Cj5KLdU3Q?0@Pdta|1wna9%xd}^7O`547#EbnPW@K}7`xbS?s+TqkZ zpY~99C-H^%oB2m1n1}Iv+PCuc-Ff0XA2{*2p7o6Hal~yPu5yBLGM^K~1wOcR|A?Q& z$25KyK4bZX`ImW~#pf34pMv1gJkMu3&OAkb+;j)YKWXN%&~7(v^xrR}M+UM>YG zhw&QQah7%AR^Bkl6TZw5|9Y=t{3>9EzX9+jcb1=M3Iu`Pkxk%+GDFGe4`9_%<#Q zB{cC}_|$R4_sd15?>F~9gm+nfrT)jHe@*;^^nV=jQ_}wrn){!T{w=>!|7|a&e@%QB zK6M=N{nWGlu(|&syvy<{^*<*4YvL!Q|Ko_ClK%6}{m)4MmS3s=wwKYrCcX=wI*#~$ z>e+s@w0~JwLwMIRFS}|4@3DMn4T1;9>9X_FDUQ$EA3HxCG0#Z$51D7e#S@aT{%J2( zSlYiF&olUhL2_<*MV6h5Z$Gx&_g&*MuP-|-6axvx2&ZoE(9 z`|uHsAH=6Lei&cS_%VFV@(bfN)<53%Co`YiT64!VKc7Fr@tL*y*GDtN=k7P-8{3_i zJS_is-bePnlKFnPx!nPL!t$A;zQ1dA+^l(jC*vI_-m}ka*VbZ=m-E#ot`7w4+yZ8P zd>Ys!H&Q(If3uo#zSt%4`yYRN#{lsM9)J9R#Md5Qyqp)tCH|lp@3Y1wemg#-@jLMe zji1KnG=2_W(fGDkalSaz+;0~?VEKjh(?LGH_>kp24S5dWV;a8!pVIhId`{!H;Y%97 z17EXzV?I-O+hH^RMn8jhS-x>T=kWo{H|F2*YK~`(@5U!Iz7L<#_(6O@`+ zov&ej9$7k{64!$dSzZ@6KzU_ZoaDO!U$gv5`HoXBa%5@062BcEv;0c&yQKeR@sjtf z^ly1x-fdy_@1slmmAEc^%JRCnKFU4y=D0z;&+@vs5y}gixN&@Gg}5D*NB+LFzdrJu z!pAJ{b0c`L9xiKJ&AIcH8`q3EHn(nB#XTJFJ?*x2_gs4SrFUIAb=mFfHm>0=6sySC z?;WpYy__Z&TglHl{|@s1ZhYhkrZ3rzVspJ2*OB|$BaTqZ;&tS8?U9Z4O%BJI&CdSv z#cF0V#^-WlwC_8^>ep(2@%3)Jyb9b4^o)vT^rRFd}$?bh68yO~zA zL)vZpysz>1nnoOaR=MQ&nsQg9b;n*reyyqb8KButH|TpE>*J|r`vGgdh}dGc4~@0j zZ=Sk|c)2vWg)t3Lf0+8Ev&{N2uEEHI`YYZaQ}R2w7iERt4_optxt~Rj-)Z^@yw&Vy zVf~4plm0F5vgTQiueR57+`P@KA7Wb`Mqc)H3%4!UWIlVS=X<+Z&$l?AW9H{~AKH9U zaLdWTt!=@Lr#N2Ka@XZ|Uw+T!w{h2#v|)Tyatb#KowViTt!?&6tF&+9DW);+f1>@! zJI(eJi|e3qe{q^}T->tsQ&?`jHusGE8%Ha6&(Z?M(#OA6233if{Vl9(#=ZExtro}i zd_c0e3NkIyk^QPgXMAqkPdmByn(fqRS02Xs*f>78j%DXpm-B+fx;fkX9Ut721^-*x5K z>ey7j{E}R&-AUSYC9HX~*2&_0%lTrEL>DJKBol6*ZdPAkRI)!huI0x@v)!0<#zTBJ zK4$rnb)3uk>B9#;X60d~xBPhKlkHYVY4!5^=2Co0C%@3yY=4Y)d}C%i9;^Kx+MmFO zHk&@R&~JO_-DA$+=C$j$oMgX`+3CC6{z{py(3o@c+ASw-Aa0tt$`&iH#q-kA<0xeR z`_hAgCal9~ZX3VX%1+^gz3khpp^dHbT~>SIXa(0U zEs*|Xe@se$pSI>jB#&|a?ZQVsWBQDopm`kY{93rwvF@2GonH%=HlAPY?>hdvM*qG1 z+z{bM!OSc29z%0Z=P$I_%VVcpy}AABEvGu(dzNv@*|^q9$=E5I+qaxbRT=O02;+Lb ztT@gS4g<#VwKKx{xWM!w%P%<&?EkTOO>oQV;MP_4kKT19=VSYi7gxMIk8)ga7wT%t zZ@KI4d!%JqKb`-^dFeu{zjul~_B@uhv^cH|t~5E+Xq-v2S>t(ejQ&ztv%f@_S+IB> z=5vR}-z&|P`->f0&N|u?b>ia1XKF{?KGtc!Yf4&_X6NX~b(h(X$6BYx_gt^yK2M&Z zM9Fd2`6iCXd(3*3XCQbi*5Z0EN+ar+@oe(pw-X~&mY9Cb)2V*+euvQe@;AZUdCtRLsA~c+n=n%o;PzIY&GK+ zUO$NM$0t^se&N0)$!Z8+TVs0PlMy_a5A${DOB-I79(ux2Uzf^Zyq$JDXPfOToCl5L zn(G3Nx3(<2!U)Kn4?K0+rm3HMx>>(~lgHwIkk_kME_r@1U$1sFJI(7=8E@|p^YBcw z{e(2mW0Zdb_?qQyXBt}8jdfj@BmQ(p&)UV8sN4yDy75YugL3i3t?3+Jb!y}jHS#@+ z^`u8*{E|oD|8V@*F~66Y?c1#97wLCEyxbJPW8wAG(s_UU?-ROca|i7w)|>6utbS?V z@iyb|bs7B{?H<>t^5o#_MKd{lAqwhO9iyG>r530N!<->3yrs0^>O4 zUdp5W{fk74iT_-Q?f7$)zEsig)ZN4v+ zZwIuOl~y-|MLX!f6ITwm+tzA9efE@i~p}!51{X zA79e=A$&#SNAR^}zLTjR$J<7%b!F`@&L;K^yvC679h4`IQZDDmT@wExGk)Ryi*f#y zi+c^9ch6HVX4PBR&l2BpJ?$Syd@uECn)m^{?WSY*KSI5jRj;xCaq0g!;wPnlP5dtD z|HH@be_r~x>NWP?!O1jn9Pz!>t7+l~97e?f8_&@5E;` zej1Hnik^OF8&q<_n=)PEcAaY~x_E_}uE8QPNv&u8-e>6ra<=Cix(w|?p+HZJX7 z{1856d7lLHki16l1Wa6_B%ywO8>#wvH2#m47u{rH^a7hd=AYPZF{U*1+hPGAPP6KVj#)wZOmyWX+KY>qKK69Gc;o|Fwh5N&v>G;@bNBR7dc;6S6wrh+ZAJF&?c1B3! zyYUf?@59G5eh{C~_+flX&c9v$jQP*cAfZ_Ai@HrDUM`z-HiXlD=~()eL~OykG!DUF}N z=QMs2U()zp_?pJg;$2^Ep6AvZ$Y0|-@ga@x!N)YdAD`0rA$(5bNAM+$AIH};emmZE zOLP7^@ji{8#)mY14j}<6W=l0wOQAv7GJL{-ajw5Gwp8vTc1XY(#|$%=euS*iDm6H zUdJ%Ll=e>TWeVf-kQv%BzBB`Tn~mlhu7fS+BVQa_ZTvk_F0SuvarAy@rR(_AXuKlx ziW8_y3Pb!Gc|ZBAyTVAQcJ}e*m3p@0(`T>LRqEM|SsAZOXXwZCX0x9_({*58KRSB3 zCb#%Gq4B}2nU3)~z3T(KuDH(1v*CK<$qm;Vc}r#Mr(Wo-RzFWP8(>`+zb~Z4@$^>t z1t5+utRoRA;*hcS%`UOm+{W(+xkp--bv;Rc zsS&fkh2ub8FYm%deUyk2RXiOUfQns zZhXS>wpOFM@q0M>#BVX{r!3EUZ~UBb;rBT)My?pVv=Q@7By187Af`#9%Ykm&a zH9|hy%zP?~<6Hc`bHnfJ<Jwdr{3`4Ih_x87)f z;X1Q?5%q`0@!&H)yY$&#D{u0AuQ7i18$TsL@*E~UalRR!JKbpJ*m*h}-#cx^JeU4H zmvNe%rXOFQ*-xnZ`1(mW9X%_aUlPv7`EY!Cg}-xndHd4Jl7TV)n;3u08vm1yFRxsy zWBiPj#-CfdpZaKantpsqvme(<4gK&W=LobcTub(h*$2%3U*69D9Uf;xiLA%25A#0Y z(`GxqRgbm9{Y`&04>vA_gv>+BxW`Fq$oXQBxY)m&aWU)qct3s^U-^RRZLLzf@pCy& z4)#ZyPRI85HYp=+n4dePy)T*VrPdg_;d4G|@5-iN`#+l1#wO(`H+(UghU9~Cvwayy zZ-ViC&Ft4>jf3ND@%tMNC(kR3AL)6FPx(fhl(e{=e`B1^R^Eh4e%Q_m$$#nz&dOyOvf6vUf zwmAO(lk?&b{cWeeQr_&(*M{J6tn*u;#WA?T_Y&nYRO9h%oPRq$O2fZ0`>8B`uCsU_ zi{nnm@(=8~3F#-UQZ(aYi}PXpo<+wY$HK>e{B}j_`XBW}cbWAA*6Rw!v)OL{g4|EQ zONY&NSr-%3OWkeO%Q+D|}vie>4ZTOVsV^Wz1T{hj{ypwvia&v#vc$eip63j#To5TAw_1i|t+wzV1 zb>U;0`n~vsofM4SiUBW^N=OQ zAMWH^9#u& z#8)(a8eh}+IlS#JOUE;WYWq0jw0y#Y;Bl<;YtHVt`OFnxm)Mt_U;Alun0`|KH2Yt2 zA5ZiB0h?CKy*=-4F>mwYsfzFMEqUcD^RkonJj!g(B}wy;`JTr6EWdC*mX|(HambqT zNHv?RpVlPrmmEQ3JJV)h;XD&@e7?=RU)R*e>$e{22V7?T(9_IEz>lkyq zl3y=ziL1=G*jc7OR(`CP=bp7ve!1p(n4q6p)avKV~M= z;F8ovYY)A%WTV43fvof&+{@*cM3A?H+iNI$KgTTfPnB4Osae-cD-Rui)tCRDRCN?q7@9dhJz$z^orTUT4bkvA-nuTu z)H@t^@Is!cH@@9t)RX6msHM^iH&}yyf-JRyjuGA?tPr^()tK(ep^}BBlv{nQ;Ww(({)4nb1076c*DzdFS~Ha zU4hn>L%y}Ra`~oXlz-tE<*8$ofBqQdzicjNu4I3XrZ^8>v~+&NZ^L^ueh1!Xc@OpE zA@!&5Ax-@md_?2t@iC3>_!RqPnV0q4jZaxVCY|yyj*DgYl?_nO_TuL8Y{0vgd1L+K zJ(jmwuRr8CdAYIl?V}Bci@E-#e(%!ujrEWBS>9tEFtp?7uv_b&^3Y3`#>u!^Kh6AD z-Y0|NK^)gHdFNnm8vS-tFSRUQ=DiP}(fC1pZlPUkTr%EaeB}}|kBsHzb?HkuPFdma zHGW$C_Q472C)SzubI&&m$j`igez4*G`B$EG)cfcEAA9c~7g<&RkHfvQD=vhjm{h!L zEb2|YsivZ$!Wvdq*cI1FQBhHGMcoXI6gN~fbaCC3-9;r^6>Ti4wW!djHp3j1jEa&B zYfUUFsx1bbmC>lE`+YvoIrq+)JNFLj_Wu0!ec#6e=Fao=e7(-=yw2})@7zl}ao7oU zNIMaguHDY{{U!Er_;H=HkBvUad2TV|Re3x7xl-D(@AF}tFBJaEh%qkB;6*wmPmf~< z@D>-|0e&y=c7=Dl{8P`h!!~nUdMAW!Ek5gThiUvZU4X$%3NB5@9R;K)+fAS!{nu6L zevU#`3Owg(iAPtHoiTo|EiB)~_w=djX5va*(Q5xeZyg^MsolrC<>0Bc{#5a+O3f<# zWc;V$f3!P2U+nLbz=svyj_*8Be%p*sVg|rEk0&cQXX~7^FwbbW@-t|E*QeVh-T*x0 zfwuw=d*EHbBQBi&^#gBFcptv=Kou1GXvX<+8x334JFx*K?yMK*wW<5?rl6m2*`w-{-rHoi>U z&(0-2cKq;7K72p?<@)Jo=YI?T-|`1DL7CkPGjC-YoF2!nJWfbv7vnmctcZ$#P91ot9fO{VEthKkb2+0q^#}tAY2q@Jgi9 z2t2CrNtLb`UlB25$lmw};+Y)soD{~Zm+9Y@>DM6B_rOP)z6U-;a1Yv* z2VM$%(gUvqKI6hUUN!(vC_KVU;W(7>vLANBx2MNp6!XC$;1Puf_4yczS-o$Aw;}vP zJyr^p)441vo`;Q2%dQb}5Kzy_{@=pU*?Zc*$_K|_;>mxx{`lEZGv$mp_~95FJpK6( zaZwMt@W1VIsNZ+Wa`oI_)qmg38`dY%f8CwBV@5oNg_HhW0X~`|?O`o8i_f3I!&)RO zhv~FL`nmA<;KiS4^BiuQM3dc7vz13cz| z4*;KZ;bq{D0H0BK2;X_2uD6J}JLc&8PP@}l%xgcNo?avHB=DfZ?fyxOQ}%fIaXA#K zAqvk1FzoS?kQgs_7^kI3u*viq?nC=`rANFKc+MBn{UF{2yvPIZ2Ojjmhk%DX@G;8854;h0*aL3^9`V3?fVX(y1Hju|cq9BA z0p6|fK78kqnrCvp+nn0fR&z|;0cCeg3PEGH5$KEje-Zf~_Q*f*pa)(JJmkXRT23SI zu)>D}^e$BoT>DH$Z{{}BI!+|jkFSsQ*oM;Ow|m~Gmwfrk{{qS8eW;45U-h2I1=%{Ez)X)e}>= zFZ-{$!kJv-Df_15YuW|J@4VOVf+OuT!_G{2gD}wjT9=)OW~TgAerCk)=>}n^rCHkPbK5Z<)C~O$ zkJj{lur2FJ9Ci|)ly+M3r9WbvN9VB9L;$u1jBlWXwfl(x@pdAt(Lk>l#(29`>QAQP zDf%5TuQh+93QR7~@M8+xYySmxuee;O32c)rLk&@duOS8oT^6(k(c@D5jlhrKEz*xL zK^!O_+%_xw%_+!Rl)Olag|ZLu z3+<4+V6G&>PIIsE@riYq8to7x)TLsCDucKc{K!t_ui{I)e{}4U*9%_XF3BrOQFz4q*8CvyeTVcj#)88k@@=<2^TsvOj?A983?XUa zcbfyyFZ!m`4>9mKgg)x4_qc)=Y8d8^kIvRHPo~{pnYFJ?r^@t`_^A9Q=2^d$e&xJJ z;;DQIAD&#jHE+i%JW=v6^S8N=<2Q@ONe=LH34F`}W+kxR0iG6s`DAe_IyK1I);vzL zrP(I+Qg!1DN9%=Lg_%#8HfYn#Txd(pb8O8z8!;Ch&2MIC%It~z6DvlLZ@wIf#~bAb z@~yA4Fz?vP`vJDC#>;&R&1(yKk2Yo}%mQ2GB*%KC=L5G`=9}-v`y|{8 zK+*ocg?{}crLV7-FjVH6#~G=+MdbM03VtXe`F*MJS%DF#kXPS9BHR0iywHUv)D-2 z)P;T<^dl`&Kk8dPG|S(UwSP(f9cC-cwtffW&K{Z0@COer9sDl! zz!BNfNuy+RmH9 zQg_+Pc}&4WpkKS+Itgky;o zoshyE{bqWDwJQFS;LRvrMD>RbPfO=wEt&MUM9B3;_4m+!h?m|W9;tbttS86gX$Pix zcrI-49TS0Vm2|(000grANu<) zHkw)O1V-V{87gjWJ6b%C2Yi7d104BfkT% zAGz=#@_VahKRs+Bzq7Ctx=7lIsBzKBuU6lTd;RTHBfk~jM?L?jwA0SuY$CCl@ zBU>cDMX)t~J@@YnjzA(_9JeOGA6EQm2A}T9((0!cpou6Pvlg<)wYBH@%j$L}&f ziJqSItr5Io#e2E!g!=u^4?ZB%$vO@uv}`MXs6Pe$(1TLHPvK77^nUmvZ~fxO(C(Ce zFjpGz)c>2eek1f}zIhPoe>78{aqfqH`-s%fs2`hT{a`*v!HX(hRJxfe4?UllsX0Zf zc+_8pe)wC59_Q-E(QdwdX!&INUC^IV`k^dwHrMF=o6La7KlF?C%JgR>oXUS=Y93*H z*C+qbPbmFix4s^~9p3uYV~GEEW%^n5Z_m_cf7J#3$U{=U#hri5v*k}o@v{)6&W?`t zV+4A`-;;V7_0xP!E^7$mGY#J4sIrgmJe+!5EBeoMqW?t4%Wt)IX9`{|{z`vV-Wg%k4pWF@mte3-;v#q zIPA=f9l9SC2yFKc{&PP%U}tjt(EJeP5B>HZN&T>jlM~O&So*5`aXPGcS?i}hUsU!) z`Tr38{g40i{I zddPZQF^>A9^rLQl%@5-`Z~ZptcTXKe9C|YK8HXY02cMSu-G+3)@n1{d{Jh;`WWL{z z`AEV}^j8PrhfjN~{1L{DegC;1U9c1T^`ZMQ3jLO6|8qYAKSsGecj$i9LcjYrQa|i2 zm-Sm$i5-FGdJi)OCX9Yjv|JJ6ckdLadc^YWg`L=pw3BT;Wj6cQbK04LoyZ@gorFrj zv!1-$e_hOaQu-5=^L}Y3<{qE)`R9OM-(-fU-wgenze@dRHvKK$`UB99&MAFq)_dIW zXm1tZPt*Un)Q`CJ#rU_y8S&_E!34$`#qW0WwRM1TZf5(WegpK2=4E;@x4vBuHuN4= zw`27uCTf3rhN=pJN&Q~vPb&RxxBd$0mw`V4{m6n$KjhXwFEuVC!RuDMmzxg#to$kd zJulM0QOzem%0N@BYYfsRR1K15*FxreA@iN1z{7`eA(M;nZ)j@6;yJ zB~E{5!Jkq5c7iw@z8+WHtmB?1Grh8(A+9e-e-EY}HG&^i{B9PiCHOJL$Ei4+^3~@NU&yRa%x?#j`u--~3 zK)+~N>A%czh3l>){r{KL?{?>Z-6} z*NE3DD>?OAp%*&@y#eS&tQFEjSLaS|3VJgu>AC#myrJM1D3_d*gy)m)eqHM~Ow)h< z!TdJDPS})o4mM6qzZZIwN-raQtzDR(*5?c9>rL93f}QAUnSQ8HWGB_W^m)q*+3l20 z!JlGjC&yjSG=Gdcw0fHEj@b8YrJbXtorrWN9x4+=;cIKj{V$R$Buqo>F@sY z=SG-lhMl5jX{X(tp9Xv1)i`_W;l|C6H#jqonyrVYwqI)>U%U12$m1t%JzVC8?;XEp=to-*!v7n*^#`CIzVIOQJ;q7a<7w#6DE*cqnE@w$n*Zig*{>gzJp(_s zs5l&x#m-mqwTz^9gcVS0gPo$C(oUZ=ld8A4eqeNBv7m7JKLCDI@k8$VqnF>=dikZN z%X%;iJCl7r>1uWipZ>J$*QiIgO8roYbkH-7IsW-)e%fHC?|x~g#XT-*ewfet_sg_1 z0y~NCNIUJ>_GR<4$7PxM`ku5iBeRt%56vGVrWLE=F|O6mqF#(j{X{nXiA;UwqYL_> zhoycjTRyh=_p|h440aMRX=l>iPigru@7LoY9j1O@8vV>;Qa>tT?>PAEht)#A<#DMW zcGpwqei`!uq>lXtxhJ>U?&4K?^rIJcqCb#!GWuKRdcY@DFuAUV6*+y7zkh*#@P|@A z=+4KqZW7LCawI_o2S^{?}44@Pou%CSa%UDdkVLdNAZ&4+?&Ra-5R-QFr|G{P@&^2I%KJE%pDCde9F$;a^ER zFSj1BT&AEO+b8vdt7S$!%lE$Q{q_Z^AB8<0PCYz`@)>}B(eqM2?2!*SgI>8`orRsq0cqz@+Edx@ z(a*gg_5YLpvJG}xmZY6SZBH!U5!ea+UD}BpDZ=U*SM$2VeLG&-S%#hN{EfoEOdyM$ z`|O&Mc|D1CYX5+I6-hf;^R?C29Wf5{!cORw($28q^2b>(nHS}zmP+<0x=S@XVP^_< zW{y&JOqU(4-kJB>E!#U^rL!1Mj*)i4?)d2Q=Y9V36UL_%b|znY5b;@IoE(CkXsNU_ zlPzE8WG}BI>~sfx;**-Md^g*Ch54%fBg(5x+Q}(!#aWNfGl%&WJni(*PDt7bX6a{) zulkx1zvG*Loya?-offy94YIc|PT!ShoQ$8N*fTMw2IbX0xpr4x!;>fN%7ag3_$&Pr z#;tcrdl}=_g-?hK)BjrVW^A52UF_F0WlR~=%n#T72wbu=&)E30lXm7c@ShmZdSR!i z(#L7StTk)fyEPvmibC*#ln{ixE-J-D*l3UK3&?0(FhJFfBJsX z=e2e!X`+6%LBIP9so$+|PyJSJ{UPY*G#z^Sar&?H4<-GIzoK59dFbi4K|klLL(6{| zREMD7t@JbcBkjJxDe#65F&&n3@f_O0+0xG$eCOemlU84hhrG+F5&A{VQh!par}Xvf zV_(YDXZ!7k{*2O(x%HjhZauwzdbD5B|Ha|=xl%vo*3Xh| zE%YXp-l3%11O4!MFF)N;=;gE=T7H|Mx(xkxrQhxDXS8xQZ?QWV&XW%A27cOap2zxX zlk~4IoBjSnvp)*^-4{yx|J(kv-z;6gzs)MXg*eCI)eg*){nvGjLo4jGZ;^Ip+~cZN zFU^w=Ee>O_AL;ymXTR)u^aoe}zp>AD+XMSWUDEz!fKm2|^ROOg$zwTKA3J zXV>fTP2Y&3oq`1F>kZOQbd9v{l(#;QnbrNsw9^PXeLJL`VRw0J?aIh@>PvGYeMosUUx*dnt?aZs&by(fj)#ih_xIwA* zXSGk(K91k}t=Vz-&OH2-`+rjC87WveR)+r#2T%_8%XC5l)yh%({aFWiMPE_zahI1C zXX7?)d`J(onAeQLPHaf!E6a5WL%)x~!%pA@j2mOpPJ4lL+_T(w`md)&{$Z!+=h9A* zJO3M=5D4pg2Y5lnOStPtYMhamgvHX-S){CHy%=FSzmVxfkCX{{`g>xbZvZQxwhTMN ze^l{vm&1DedhapAxgb*ve#Ii{_5Sqy5w8Uvb>Z~08Thcm!|r_Q?O@i|O;OH+u#@F3Qs#p*y$@eSs0$l zc0H>+`+BYVMT~22k#_nr%2)I&b+~(KHJ+StMDEYlqc2$}zsin9q+f>rJ+PDWKhjP{ zzp-(bc`9ll<2M9eNbzF$&ci7`V?*!ix*dm!F6{8St!plys8bzS9a|ptKG3=Wk8bz~9uNap_~f{J@tgQCxE06ESyz(VARaNdevOdkd+WB8=44Z1D*-3x94-22Gg$OnYgl8Z-1TtVvNNcRam_9y>ze5-Z7;W0yxKao=e zl?mv#d}z*6RXC>+*bJ~{Uj!CSI1pC$rtZrZ9x(tKnf3cnks_ zhkz#x)#f)y5H2`iO+J0C`Um3l;W_KaIM?jrsaVQxJzv6NbgU^XPge%L9)F$CAB6tL zlwZ3HBp_ZYw|Xocq$6!YVxY5sw8~tGTi+U+goE!Pa9^Ey=n*UJKbfl zd#;3hsbS7~gz^*lOtY_xB4@rLkPVzPXMKnJ!P$MOEsU6NHa%Ub$)_I!uyqOi5L-le z0-ffDDDP3o6OlRVaBz7r{YhYPVAjE;-(ofzp6S=;vp$tBqaSLVvkGY(Mp)t4H-49@?>RY) z`5tgGDtGd*SCo`686F&WwO-0n@6Y`C-oi8=Qr)B63 zpD|~>jy7==dW=d}#WV4Woeu*}bu5B|3S^e4GvZ8-uT!(CvZL=|@R{>d0^PKfbDT6N` zb$qFZtQE44*?Q-s^jaa?3)%U$>{KbM#`kW>3eK6c9;OU26c0V><-^~$1?mg(quse5 zdBtJ1g~LcJvZgSI4pDYZYZ1H(sKlV(3;kC)Wne$d3lERmgIJ@t=Cji5SSP^$ukf_> zN~Xsr%<&OcI1S>jz(RdIZ_Z-b%Dx)a`iwPpcb`)QI0Q~FIH#(*ru&QDb1Pnk88N!h z>mdj5L^``cjumat9d4PkKJ3^(R|EoY`WAJs7xGESUqw0U9$t7R+Q}gBeZU_gF6x=c zV;vrZ3j(@I7b)e{=cCU?)w~S|8?p=-q|VIV+?u&m(5wPNpFvsb8N#) zbkH98xac3qS%}jfPmq1XzkG1oVj1UP8f4q$+NvG0>h?M7?UboDD90+y3+qHn6fxQjUM+ZfJsbjd zC+rG;q0Y7w12zEO#q?9mFYD~__(j=XF;_i4A9GUn6F6U+uiCM|Hv*UQ*?J8}`=+m@ zcq!=cCsy{g7QDUS-2xpREcYg0m6y+1*9ashCy38BU{PS=P6_2}=;~De%KF#`&ICAH zRNVEs+`9C++=jyL!;NXr`Ac0s$H!^d%IV1LpBf-rf@~17b67|y2R!=SuZ`isley*x zIZ^VQfyy~!{i@uYzz3#fop#L`yOG3Z$osqItTB}@HEyKW)8}0E>4bc&5jcN#YVJCg zWEyfpKH7iUXmg?mNA!Df_;BOcBE7AsX6P*IL|qq>6~cS*R_sX zZT=RfNq!Xk-h?A7dJ5~bY5te^9~yu)&HF0Y!FzOVNmiaQUD6rxHzKAy9)%UBswHxa^o7&oZ^Cspwb3KI-NcIJ-dAT`FpPsY& z@SO+eQJui1fNdgxwAH#awSGif!}<|T9#zm;d&+tD2z2vqR&(N%-y$xlKEhc$)_D~O zW3mi8Vc2;EeZWDi=x~%bFni6zx={wKO2f!yU8@Ej0)8U_@c=8rV?Z5)>own3Aq`(G%1#g*?b5(HICl3Rw0Ja6^+|=2|DPZ1u z?g^l4?{MZ7`@rh~uYf!p%tstpH!!hwGcGMG+E|#!v;%8$b9TOG+Q~Ef&Jtjay>r&v za4z>X@H!)$cHplPvdxe^$9j3Dv))eCOVovJtL=J&=cS-}9G_7!Yw}S-CuG1I9)Ds2 z&!;`1usvisLDrtZk@9>a4`0@rD71xHLvhqXp4C&`-Sbaw|mYS$2r?WFJJZ``>m@` zlk7FD=tD-pT{;LZ%XS9bfjj4{H`6W-Vo6|of!Xt~Ah5gwv`1ji;av8c#%ZWhST%D2 z*dXS272x#UHD|qt92`OXg@KI%`v~iTsE=Gzd|nRf$Q@(V3eM8qbJnfgsBpE{j6M`E zAo`|ve}Y+?OmhVG>c2Q=-H-3eSFScU=C=x0#U9Q+aHhc7Oiq1akW1sb{1*JL$qxcr zg1qcYs7v%)%|(L7i1Zs{LMhXACW7n zRcp@>_-)|F?w_-E;GA*T!7;X%`xJaYaL7O#PAzcN95o7^(yz=}U!{&%&)p^RKzpN* z4MXO#x8AmQif*r7jspqk6nr(cXTOyAom0ags`ZED=}ZfmuLsM;}P*u8To z>NWe37T8%H^4{C%f-L;CIqOpJ#JL16K3sQpvX#|wKHl+edN zp@?z;LVwUKDq=| zCovyU`!DP5^%G_mt~qB%`jk`7Z5m*!@1Z&C-Kx$weOSoMM;%e|uFdCI)Cq3+J5p;e z?!vII=mXw6ioN$&NPn{Q(Rh@uVczK7S76p7%VP%ie)x7fojxONPyt8O|5u_sex&wg z6jlOk3K+*79;{mxz;b>(XZ@A{>O#ie&jw8V?cv9nvY#OOo6XQ2gzo#PyMcQHn6{%w zLYdS*4k(PjUT|XI{0irC3^-oxW1jCsZ+(8JbG|ko`wJ?n9OO7Zn1qeypUhc5q7Bin z8CWr3YQQ#vy%LV%jQcxV_rf7xS_cu^02K zXRBwN8et>vr`SVvY@CvAV?*I&F87_%=5{st?9=*~K6Dpw?u>(~KC_R+HYQg?a%P1c zRHiouojpIBv$i^Q7-PSx!)mRL^tQPwaZP@hX&iE5E7DZ+r}cb+z^wt#iHH~vnf@5;ZGYzA(r1j5;O_dtn*-h5&>2X>|V8|PSw4S{#P&NDVC;%S0N-X8FZe}^>`%goM$c}1=wo=Rd6qDk<&eviFWoI5=HM$7oR zFeT!Z1gGQ=YK>#tl8^Zo^ULB_p?*TXooR_V9pc67&a3gp20lglDkdw}Kw)s(W)XXK zAhs>uOJZ}kkh>0nG}>{(h>CHw6MBt*!gVU$Pc04OcQ#v&!+XFl`!js{Z_OuO3%1i) zc%!4hGTjG$Phs4`G%w|sZhyg{ix*a+_KBja*@ZQE*=w&+_2}Kjf{D4+ZeW%m2Fqg3JD)xCHIt)o}}#5>x5b;RZ8N`o=FnT&uMV zQJ(eC8F@|II((J4ed8`@iPD#CwiEpR*T?0xH``yf52!OgyOmsAhqL7yrJVWMtK@g< z<*S#+jk1nbgF6du-m!6OM6b^p*I+r*H{**qVO`}j?fEI|c-gDbzrG=E{Y}^ZsM2Xu zpLW~E!%%>TI@1ijNLk$axE>R&4w@~iNEO`e;P$^IZk?j1q4{WrWqw$HM!+3^YutM3 zjrd~6MsEw(7AmKt?OE_UH^Mf{-sbDJt7X|Uu0_~LA37y&-Jr)+xBXG+2m7RIaElt_ z)}L_h*ySBYrtwRWF~Ib<6})}moy76ZEB)YMY5w+uzjSuodJEf{7yl^P)`Aenz+FB! zZoLEN4p;QW7dWw<1t;&kxOI=t(eh;UNN+{{F=^=n_a>dIm6_2Yxg!7I&VZX*hoYb4 z?{fIWHP(07pv_kBHn+sBpZM9_E4i%qec%?HANPER0@ECZycu%t!#Mdhm{-=<~Hj0}gK2OZ6SHoc~M~IrZT5To9M{nb>wV zh`R7RIm}xdIPI-*xu0coIKDzgd9RY!;oQmFbyCiHGz57R`v0PWt*@1%*`Eip>}1HF zroBs%p5ABc{J$9vpD`==FYFJs$L0Q*-ACHx`KOd0mEcuPDQtdAYN-Ox| z-Ek|VwLFH&Kt-!LV%Q04>@-xJ%%^Pw!Xse08%u%Q(>X zEckgh#jPjEx8sK2Ey@1eY-VdBo3@KyhxXqaw{F*c)%%L0>9MrUG7E!Wx-%~K4sF{t zpg=}>3*-fm2XXGCEoLiH-mT>SrOP8J{iu>}(&eJVmTfBrc{A)^qx+l6TdVA?BsUK3 z@UFOZtlzks&-x&_C9g;OxixP6A}!r9$XOODgOIV_)PlSDwz&08oy+n0GoZ^*30@m` zIk(5HHl1g1VnEUfPTKw8)r0qEJx|W~i>GfZjUepAz%BSp-1@F=lWBiLm=o#Fg0lyl zTHT(UuiB%RD64`X_Pg$gTm8B%;}&6v`K*9E@>$f4H2Jm4n+CySnKyzr4j!sqs?5z| zQ52MSP`*1ZueI29M$L&?2m6)$Ljg@+uirNojg;O`r7m8;IrljRDk7>|kD+xXM5HolnHAd@kHSVZDcf`-_*?_yWcp9XVBniTIB} zz8P}Ax#BG3`%0&+=k)k!`E6C%h@kZ1l3)ceF^DYsqSGTY}TpFyms6 z7iQ271{<{9u)RLdf}EWRXB7NAorYQ8`eAqPU*lFW&Ykj+%T-a{BT9a*-k<9}{x&^+ zv*7Q4K5m_;+cVZOIgwtV4C}!}T<%TT@x>hAGB8+w%OJ0U{0u#xV)4OjiIt_DKhfVb zg1`Ad-1-&E*N%&rFPLq%XSCY|Uht*3_2@c$vD4M_F;D{!Xj<0WA@E}#oVR}JQ;r75 z6-gI(bjP=Huqu>`F;q61=_j^A>K?PQ}HZ=j<2mi}Xw1414S6txj&H+Huj# zXZmpEgB%ANz@KTHw`TS9m0dgPj9~|OdrqIXa5*kjKeQMc|CBxiA&!FEd&a!=HJm$p zJDi{10}k$cW`4%NDQTLQ*GTL*+WCp5Y{kKgf_E`(**w}(?--+RMgNWcM{vZxgw4@? zOGtaw;8uehJ9FNO>G^QRX`>cQRvcpxCv4!N=y?KNQU9SIK6~DJw_kiaQt>5!2>i%J z^VSmu_~KO_H?2`gO8e8`CoZ42jz7$Y|4-KKlY~R;cM8g}p1XS93gg^~5BJ&dm2s|s zJOnwm5>j#%XS0AcO!6ARE5Bymy5FN7n0KXkUEmFO&0CkloRc4x$Hg*D!p!#|czM^( zTR#qHJiQ(c+P#WQe+v9P*Uwu|>glKEgnQ`$%X%5S$kuu52YP?fpxXU4c8iho!Sc7{ z<|MbxTjRP9DVwL-y+jap8^PUu%e?g!oTugMb24AdQztlOz4O*Zer5m9^s?Loe(PuF z<-V#{*`Jz<0qyStf9h`3b-nDhdThQYH78&!^4^O5#V^cTN9eK8WBd|xC}U9x?$Q_M ztuN?YZ9Fx1(6;2ZfZKKdyfuO}oLFdFIp&qer&4)jeH{gV^6T@~ zyL8*AKde5C!8GIv$WQh2vnUk<@(cb4kqoV7DMx=avv!S?j*RS zkI!5G;tecz4E1uq(oW6Trjj*x72r&bn@q2`0`sMx&s#V6#i32s1;#84ZuJ!M=Ewb} z9SK<<+QDD`<-A;Dc=fM0!WY)X7>FwC=Z@$BP$o^prypm_;)89+U`Jw1^ z!zy!foMgR8g1;I3v^6KkRmdnWew&n+;M|F!ntw4ql}i36-7meZ{8aiD1h)m;if8Ao z-{ah|CD&eJkBsT{fU^XSS9+8WD*1ZdhQWNvIE_JGK0R;Utjq23Pxarl69=ykJg;;Z z?}E2W`H*f$?(ry?|8rM8S#+uv-aC3g^n%8JtaZLd{`nUw{6u9Dd0Je{EN+|a1O5P#mTn0Gh#u+{9 zRE?}F6tNA|f;$ddtNiwZhEw}NMf&VqG>-llc_ zL$65VPk~=jxM2NWU*GBcq4ar002@>Lj#;qk$+z32&i`zxKdJwe>cbsT@-;Fa&Hqnv!OJO{wf_4ZiT?NW1#8aF_Q0zh+w`Ro{F3$s zt6v`%w0IiVJ9JUkdcfa)#mf2QwV7dXyE+!EMJ^7#V)*M+T?0eJeHJ?PpI)#Q{B*vR ziaY%;ei!Cj_bym}_Nza=srtimss(@i%L~>>9=>?gAFd-=Ay{|X!EGL1u>PvYJ+tnZ zuVc}w%EP{C5A=$^xnO-*?*~*L_i<&Pyh-pXMiwl5q~hb)muBhn5(u^5TClEJjW4#( z`Z(FP8dh_1f)JOz8}qsEEu{CaeEwyZpa@PqIDydx>pJkAav_ITJpnPzHgHa+2Ol)c^HRzAF7{ZQx9p18s+{Tc;l2ArqeoFAsroB?Ox`wP})Jsw(`<|(obu}>_h zguO==tgq|##5FP5XI4Po9$Tv*<~c>SEfC4V_e6;Tl&d@^=qAHUT0ITf>lwISho}44n4VG z{e|Uj`>6R~{)FW&od|*wd=IW~|I(f3euqPwwcsp)^EC5i`>EUf-eGC{4)FK&p^;?~0dD}dzCoVti`K5}Yt})CyTA?p zVZr*4&b6h*hndMp#P_vZzxo9)5Qhbb0& zBE6#b!TDQ&@Z5W~rhm>6G+1UA0{g53C&NS&;Gq{tm)r@n;cW2&zwTj$HA~Vcu zFZels@z3iJZ11UwYsk`1)~z0J_suWJ`*&92&V}Epc!8-aF&92^l zUq~MxE5YA))brL4{pMqrr`vA@zw-^xTl0SNy^j~EOvv%NAN;Dy=dFMEjn}88=7)^+ z82EYXpFgO1QUcs%aL-~u?O5x1EiFs)CHMifugjjdUZIcIT6;FNI>%T>z%OWj-ufKZ zs&@O*+hZHos;N5K4Sv^^&s*E{zB@HuUu3sl&K-upo#}kux601J1;9v^QriQDBs&wjweGH26y82=dA+Wr_{cX*gfXFZ8LZycRX)x zd>y`c#r>IM93Q|Cea!%LCP$vPZe#3io%Pyvs_xVrbsXHui^&c&V0)ys8TdLEa+ z?|*XTJhDv7sxiJyK5so#<70d7y^inXH-cYsWWt)qx#Nr7mprM8M)f5u*BV}TvyHlU8gH2YaGn8$)F%bl{ z0E>%m=%wxd$+$es{LqIGI2G?mSPy3A`3`dEEp0V{H}=ki^?IGhJRMDzEbA_CV((5^ z?{IV8l;T9enRrjait8Nd(+pWmYYd#-RS9b$lkx zfII~KqjdY)oF%@3yr4$vAF1nW{#UFZZ%}eS|JooAX7R6g1^Lhl@`)AXaV7W5U%}d3 z;h&$pLdm`I$2!&kc@gp#@|m~T<21v|eyWT7QxeuQdL1(-Mdhb_0P@L3SAANasxPBT z?zNvu{b?m%gL8L%qrc0L$6)_oerv%urPhLM`xVEdzdJi2e{dp*L*T|XCDQM=)a_2D?Ct}%=YoW_CICgd zPt~|)k~1qg-wf2E|GhY2{gHvPxq4gwV`|P81f>%E^2-y}efpe7uFG$wRmQdnoRKRN zRwIAM<7M+K7PIWz$=?qC>O1`Y* ze)^>+U_8uXzZ&v($kX}@t$j8txmWw6|6P!`WU)U0c_fQ`6!LHu`84FAEb?W@bF61Q zju{4!uo-Y z0~31;N_P*i;$Nm?qrh5#u{?P&jY(k5E^HQ9lM7n{*66|t>Je{Xy3avi4Zy@6jY^{u zSf`6u53Iw5H3Mr0rpK=xSQ{|<%7dRhz&5+E-N0I1*bp%0*VbhniUDJOkE1cW&7vRR z1uM#DAn(c|&smTC9v^uS`a#G?A-^8yj(s_Qy^<}7oLX?of0fXl7l`}7B}eo|>;}JhUn2cJboOuBp7SU;-QeujZE`(xbIQ&PILqMN zrgLcLrW7Zz0pFp&j183M`1fa&Q8_PFO=aM_wBoAd8#^aQd=vSZ?j$ls=0- znRal9@&{G|tUy8n+YPK3n7Br(ctgN~F5Q^R9?N`6*<-iw#2Wc&hNF}xAuop=(O&I3 zbEeEI<;5pr{oo^~zm<^JLvFVd>eK_P1;%-TlP2O!vy^X!ybH6%y zw0ng2gEI!sr8>uG6~ST}c_*X4nemnfAuor#74lE%`b>j;H!#|004D}cS{qg65rn)A z@=3`3;zb*M;4EjcF${UZ@BD2rohfjtR^Tjw)0%}tUrHnB&%rqs=T7};O69j2@@N)$ zGvvdN2X%dJyWl(RcPY7_{Q<~hS?rHOKAFY-w35G5PakE*VV3DHL!N-XpS<)VSfBnL z>sgonCg^h-4bAB z`xDl^8m|J_FtBYJ76w-F7d5X@x{bibfkidmW?+qfO~~J{0vF{EECK9;5zhPhvE^G`~y$jn1tk#9afrVXIP9v^|y0BtkRlwFV zt~eO0a$p@UtQy#`OE&^+$c426+vCDIfepH_USLrd76mro!bX7Y2KK1%PWm?vtTCRB zO#>^M$KHzK1@V~xHVrK8TDX|2%fW)2;?uByz5=HToa73eW^i&AvZvJzPQePCL2yb| z;EaP)wgM*(PG|*A(dnoUSvYK$mEhEa^C6t;?e+?^yC9%O$TveSo*iVjYq@8AEO&j# z=>(@E;Tp#{50bYviv5rQaH8OR!hnKp$Jxg>zn^doq^vYyy%?<#G+qo1gF!769%UP^39N^ z{l3}pW7PKJ0o#v{*nXU!@?$S-G%jWLV;Y>W4~Kp%Lmq;By}pm<_+d{-jgf4Agqu)b z{+Zp6R&dIFIP{|j@)F1&^76wx$}CCCRMf3rL9i>69U z#xQs`#bXp+qh5TyIygLv2;6+H0=biQmcaDf?c^-nTSh2q^6Oa%4 z$mvTQ@+jp08@^OEWB>gae_xs)AM=qj{+*DIKz^Ox7qjl2p1Lj&1TP9+!E3zJfmqb@ zF>sb%?ag8Rn}vKojP)#O$X%r z4(xvTDwTKc2eCMKpAU`V;NI#Obe5oV{^9sy>*&|E-;%ojl65Z$e$_h;Sg+Ra$B@rs zSS|0wkakPYLww(RApQEJ{rj*-QuP!jMR_!UKT~xe{dXmp(@;)7+mw8co0_(t`t_*g z*QyN4dr=0!kDh)&-tXtS-e^WyJo5gMG4RTp4p_foLN-so&NLz86@)ke?lid7pWoOHW4 z^S*LArt%Mdd)tBZXIZH++4zd2vOLGY%e(Y|d=G)`uQN}SH!zbI2QLcVUM67kT=p23 zVq~Q1vIEwoTzJ_$%}?Vpq|IAM%pL}UXU-&v`D}##=FS7w^Eh|M!}vBdYN5eRIEcyb z0l)kzv^e%;*b^TQJseXUNzGVdbCh*I3z8WWJZ;I(d{!v|Sw`;o%HOTa7FR%&o z5%Axw^ELmwP+(F~fJtJ0P!ue4Q>w9c2GP zc|YWvA+Oiv*tfCeBarWgJnfoKN6P*b-wLR@*uDzyp<+T#$pz@& zufhC4=ZH0o?0o2FH8??Vy!J0>qZ#rrX0J z)va@+9d4C~zI7a&5pe1`+EY~2!S&V4*P1S zuEO67;Ybir1oAlKwYpsW28|GHbbwQG-GTHqIBalqrMw^Va>#ibiPL_x>((Pmo>pI> zzgg)|L0%7i-tOu6s9l#%t{^YIQ0l)y*N1&>UDCfw$eY~u?1ws({A%64 zx;NTjCV(@Y0q};Aj^Fk5(Jb;H^rw})1?Ns2WWC{pMx>E*5y~q|8o?~`Ak2o9yanfe zX|#e<{weSNh577(ydLtjeLOWF1tA}Vd^6-c0R_zNoGl7Kjg*T{%Pc0 zjO#6sXG^03oESKM^{Qb7d7F~^)vI2}Ct*LWytVt!hE|YIC^;W9JkE)!Z)9o8v41yo z0ynsHocp4TkC91VW8gI(1aCihBL~4N`Y6^LTeGLjI$H%^D|n~j+=;asKqzm5d@zf= z6Y^Qez4~J6?}ogr$KU>5rVqL3Bkeguos1v#_pKmbQu1TLb^J$NIUOb#*OE)H9|HSn zb&0(O%c(}DQx0Ajyf*M|*4I|rT*>UmYWlY|~`Sr8%-C}mV z_uvICLw^t6HJSNHvsVFL6ug!4+X&u%@X~%y=#h^u@Iue7oZmt4wu84)x)b0{g11t- zN$^UhS5CL|<5+)!w^F*b;Ozx(rF7fC%Xx0)bo;?;0&k^sN5PANw^F*Z;O$=_-6HmX z?XZV-Zr`uRaU=+A0N5M#x`AnpW|4P8J^}e_b$#u= zrRWOs*b4F)B~KgYw0jtGK7sWN()W`GA&)~I)cw=$VF)X^pMDGE%USGqLtcPB&dWZ_ zB&y{4HQ*6odC<|ZabN)rK|xS95EJzzcJXW!ZK1Q`c?8h}phHtYrJd!)Mm zC8@o7@+ZJAy5r#ZteeZ=x7_JHhhqFnuaI(Vn|sHko-vVoaP{E!-*v$Hkj{1Xpv<>R zrp#9dxO?tCV2PJ5c$AA_@BPpR{0)MickcnuXRKC1J_h;HJqOaCD`4=#C(DaBg!9v| zH)>dWML|+GrvvR1w*Sd<+m}pTZhBD1(Pg}=q1*kr1J))wY3u6yncA~r**~;_AN$?` zdB2RkPwB+S*n%{~@8$ZzD<4Ilz*yQmz1$C%(PXkQa7!OPVEs4F9UrvowKI@cKz^Yv z=Y3nM4Kp8sD{*}aoVWYsLp<9|giMU*mE=FOaz2{Dn*r}&^06J z2RB}TiTV#t_}K&2sNeqbt*JK5@>m9ca%ts!lx@L&-QN!`9}#dX{^6gGcF3zCPaCsX z9vm>>Qv?3`!PySZHZE>Zuf&_Yf_PKZTD~o;s;;nmRq98u+YEE};o|jkf&dy{x{LQO z)qp1L&BESz;S1I}4q{&RVtHxyPAu@Y7lVWJukw?y_s$orE!@ELvNy9P&ECCm8m~ml z@NWhkIPLYo-qMyAtk4MuXYbs#{`Od|Q?R#h^aZ*94FAO2NVXZqPgGn=z!BvSUi9JY zJo;DGiS^0%U$FjJ?c-l}L0W!aCEr(+k>BnDncoiBEBWUOR$Hx)Jy-mmJl;RQ6)-Ud zdsQD^v|hxyDi86#r=56TrSY>=eF#F#DwPC3FTCiy_YaW33$8+k?WfA+J{Q=;U9{33GaSwa~c+3Nz1-{n^%-Tf@TT$c%FCi;vJSRWS5M0)~LGa3J7p?V5mmkDOfwusEmkXa_`oNin zeUKjq9tAG;UzLD(;99f~;C%dteGo4N9s@4c*-AjX5_rkFMR~17!yAA{fPX|`{2;#- z_-^2Ox-6?M;KRVhbqstb)(33bg$)ABJ0YF77g(hWn*i1V%ua{)W`K3Muq3eEz&L#I zATRGa%s*UMDX^ltMR}b@@j}2VTv#ozdKcCNtks3J0qX|#8YYT^>2?F_bz%L$b^{aF z4;60@urUo|Tt|V0Pg%4YaW38;c%po7?iBFtz{T@6F@MaMKg{4YaQ2IXFn{>PDzEWH zmR;~u$Zyl4+^6Nc2GSz1kMqx z_c&_tw;fpW%th-DYCYxhS@+jSddwv_m*-eL2|EMLi&jjnnOt^i3;S|)Tjp-lEAKU+ zNxy>KSf92mTH9gUW3E$E7}m`hmw8#EUz=g45q7Tf&L3YSsT(riWq4Vt0S!eBdwXH8 zXVaqdo{EfowxpTclIvv-cFOS=xE|y01&i`sQFv!0Y^nLfF2ne@m_Mv#XA}lE1ny|- zqIEaRE_3demgv^pjDixrcfdx;MT^$uer432X67`{B0}avW#a#`ZzCzjIN(^8(*P_=^LZylT-Z zW*v0OxwbIE*VMpNGFN-kdQD-3c7j_`-q$QTdtw|@DuL|<#^}tN@Ku;nP$k$r?Ro7zq(heV<-c}trA z@Kf|6;$ffgz17qTKse66gLa#t-*Q{}yn##X4&Y6|?fWnIvQh)@f#<4?di{{^hFqU7 zQE!O;WYL>|e9}X27WjA;y#O}7@@~&euaui%!2SHJhCJ+{*9g2Si(UuhogR93ZX56%;C}J!g**(oyW9tXS7p%~gS^v2ZyI=e7QJQ2hduO)Z$dn? z=v6|#-$Snf_)HePHpqjY$;@95@DkvDaT$cX$)(3Qj{=VXcbEGV@OlqC4m|9_SuTO? zh%fL~oXa^2+hdc{9?Kx#4mtZn`=DMm@NVGtbqd*z&vNvdA)oZn>i|BUCB1&gOYX=_ zZwPo1aKH2>AaC)|n+4tk+%JEDPoum&^h$w8v!quIdBQ`l5%_-Ke&yK#dHH8E>p?H@ zAaFmuA;?=i^u~ZUWzn03e7A?*GVs1EdZjm`{9JnM2P%P&13#CQA-x~?h~5u0gO{^A zvm85sFJ(!$AMz^bx%+`3;343C@tJ_U-KEDmI}3a>@WbdY4$k?OfVBb>_h_c)q20~{ zIybTZUUm!0>&``M1IIzGXKPkF>sYqKTF9F|2Y)#}tAltm@W_3bE4uIw;QPL?DBszo z@q2-H4=&34{4{(J_S;=?HT3MkcYmCwMa^SsxDuKy#0Yi z>+LCdxh^m5g+Jd}wDRqBykR=|7VRJM_J{oC&5*Y|ylB0W`N#U+%rnyTyC{FeTh6== zQ2r?5hjaTNJ_39{aB)A85)hvN9(gQ1PQ+({Hv!+Rxcnf#415OoRu^8p1N_I;oLb4q zuK*qzUzGP*BR|H|h2k1#E$}7aSXRq?cBJ+>sMkt+KVGzcN?X($lX_jii++N2xUE;6 z(qnuFAP-M0%J+_9{%9UZmybdo{Mn*4W9$DaT|N!@%#({2Uacj6Hx3-G%wVe(W!?6QTSqMQQSC$S0Q;tz+4-P+oFan!FkE8OvYZ1$kn1 z(hA7-6*m8wia-0=0qP%~bbcqsSCJd$L%Cvr#oQkh(LarWxBC@I>w9)NKA5t@a-4;{ zswn9^2kI1fNqiZ282DNmQU~#3OyE0#^V~joUIDxt_y=tepTui{@A2R_10M$d7Z<++ z`1V&O<#UOZjCOi~PXh0E@dtr79hr2Vn?$kb|A0q@4zD_$`u3f?$NmhUv=ImJoq zK2@L0-RbRP8S=iPlh&oF{_oeJ!!ot;~O+h75{5xFx`DxUGUl;15rXies)7rfXzQ7>HS4+777chcD}v-zXIb1IY8WiI{{@TT`9tqU}q z{>Fh1zc*>UO18J4`7i0OX~@q8_{%+&;@gqm_b06v*q-!tyS)CGv4{4w=Ux@|4xruw zTg}x;=N`5?ZonDFr$ifuoSYtT#=*H6=S)v=x@-=8+5=AIaY^|OVYzpq?Ezqq(b)qq zZq3*Nz@<<-6x>%y!q#5c8dK?E9d~u%aPEy}k8x-5T}R$sG*Ea?!M$rfmls`aTrVa= zHKJc*HyG;2e$$6ghp3B#^`jP8Juop}6aMFk{hMasVc=6F0!KR67RJ2O+38AWH*{xR z=?npz@knP3_`X9-C+9QRAOCQAeu{y00(0l50(d*{*;IavaN(qPhVD*fh;iEt-Li0c zI$gkm!1Q#;?FU{0+@7zp?d}0q4D8J;NW>C#=sGqZ^7%JT`!z{tEy!}7rhQ-?N+(PF zaf3>_za@8Ie!MnmeOXl;wx0@MIkidaNMe}$$cGc3bYq}L{Pf}nV^4qsQ6qRu;GIO? zwWwKl9(h;M-Gu`M_pG@$?{ll80plFHK1?zF>;b>zghTT)2HobmbU&w1%!h3pkot&8*U z1?B7PPm7B__Wo#(zCn$SRCdPnqYL_pi;{93t?Ux-2VQltng_t{M)=nYdzcwQqr0%r+?u~_&5eimD&1gCAl`+z@0|Iu~bV3>Q?DA{(%D!Y=- zv&wETE{8;pFN2UZLADX!Y0s!H6z>`tr9I%{HyE&o{teT9)|cxIiKqF_^jr#lC(7+|KLL{TT<=;lieYwY#tcur^?J+H6080cr1gue7(M z(x#Z{SAxIKWw##KlnZMHHmRk>e6|Cd26hvTq0CT+RX%aA&UN;^I&ywL0B-nGN$1^> z#(iSM<1|gwr%}jfAisgOFrPI#C=UtQKFAuolU9$E6&Tlu>LliONyx?_dp8GI>4Th0 z+4H;lw98b7d0sL@Q>%x1_#Rvzx+!UWy}-xT<}_Q^uJ*e8R#Ui{wt8VJ*q^js;(B6b zzux6zOZc@9wx;evpUBCDm#y^cqu2P{vem*eE4vrt+n%Iz4<*7}S6I|on1{BA4o&_C zkK72j%?H8doTdxhD7YWSIotKeHCqjU1|W|?{%oFIpwwS zIP66p!1%%qbEKDHZ*RK2i+$|vg*~=|>d#?(e<*3S;G74s2(T_-;UAU=d*Fs_{?mr$2;K{puL>Iv-A2arSN6x{m$c z3}g+DB(1P+6EEwvP01S*VBI{%u?aP?zAlZzpGT7xwn;?1%(h(70MABKV!u%hdF-*I zwM+%X(-1fC6rrV|!W}REi=CJvbmc7XHt_o%Pg-@hy*H)X>!rQ1q=jjuw1<`sOYH9P zak}__s%*w0)}!FJ{2*y|>*Or3`X|)diGIQ#7`#IK$8AP9KY?ah ze~a!zf1Sy_NaG3@g5Xwz+xNqy^&_U0vb#lav3Es#E#Op-ubejL*S+A*fcuDT?^0o@ zQ~c*-1P9|d0$%5jlGcBzG8OYZvsm2BAB230@}DH-z7+hD@}u}@3vm-OIZNR5Je9PL z$2ol$9R9$b-*GUV($8bP437O9MXWhwQJ`!&PpO7H0r^o>PzT#>Bk(2QrE1=r(asWS z_uCp*c=w43`og#j!ru7PN$V3#1HNuGT18K>P6URaoTpBJ7yM-^esXN7D~ts=j$(ZI zs(pPQy_QrH`3!sk;~Dgf*8&vw&E?l92J=}4`O<-;^(Y&gIvAg7;KOTPw8lA@O1;O9 z(e#=jZ+XLu)(=@R)j_=u;3e;V(K`Bl_#*X=c%P=%4|(Y&FIt24APpM*7y>?W{fpK< z?pLaV_!#i6+h4REe~XPu{xtB)hhMawdTTnK1it*|7p;!}NyiHYvF1DKCCkuoX1NS_ z(}!Mi-Y>V+*etv)hb#ZGxtAhJ*C%M@w+hdM*G(y zLGb#)TdIA@`X0_1pSr>s?wNee?(?bv?**rS-AmS0>`R>a9PUl1!@APBIpkb@?k%RS zTy#dDvIPC96JD|+sxQLav92(YyOq`C8GGtj1EkgdvJPL)vA0D#}J-QCOQ+sOGZQ0CsI3j6cl6DYRjT+!eA>VXp7xTnUJ!Y#Px;WR0SbgqQpRcUnBtX@1_DI_HHq)`Uh`RxO8h+ad7=7jQ=gZs&#Tnur_|?7>a$OMenx%X ztv)}mKKH24udB~*sn3Vi=a~BZvHJYE`g}%x&Z^IO^?9lKyh45cO@01Tedefqu2!G< z>a$3FmZ;Cysn7q9z3YIFs>=HJy?N7;NiwN~9$E-Jp(`y^0i_p_8fl_ZBGm@OhFw7g z6{F&cy`ihvS8V8~F0yuAMPym*iVd+We*gcy=S_w{CMfvruHSpV->*_zDF;e9RLZqd9xdf~DJM&LoRqgqd9ReSq?{+^sZy3nd9IWf zNO_5rE2La0D<*%FR*+L@p|2Z7K7mY%66)DZ5D7SIVJM9xdf0DW^#}OUi{(E|&5f zDKC<8g_NtMTr1`6Qr;uw15!RBAH%a+7DPNcJEh*oX@=GaqN%?`4A4>U! zl;27Dvy^%gH4Xv++2$j)) zmvZ?L2CrNWeZ|n-va-F(__}KRZy03kZ611n<;x-`Wo3Vr@w`SxzB1j#w~i40=mRTv z{*RG!OV>_S<+^J8=Z!J;HdHE$k1_P>%BuXj^t{H>E|*ZLED=9ytjPV^vXZ^Z=<;g( zmrXK$OGBx>#FfzCVncHd3TBbYRW3y#>jas6Su!i?5lf3?$?$vPy4Sd zug3qnb<)lU_b%5wZt%+G*3E|QmizY_M{Q-~<0yMocRp?SrO)hLZWg@S^6&e%zhQ@= z=Y5d49J<}`cYd6>bc5dTu90(bw;cMJp;uRyiClH1Yj?wY`}bG4%h1<}y{gLS*G6vn zPl?Nzzb*UsH`M%hK~-H@CUVu4u0NJMgL_rZ-&p4v+YLv^Ii2ud7M$mDlzBsN$`XH1 zaDIJ4e7oTMT8;R(g7ch?xL?iz`Bew;Ou_kT1MwDu^HnS2eFW!Mhx9pIaK5%ee7fNL zYK8d4g7bg96Te&VG{N5%oL_B{pEAI-H(l_2!TDRpqEQR^ts>eg#bXokX5r{jxpt1m{<~#Pa5`P(eSn-4Mi{H+t>O9gK)_}7AW5PaTHBi~W*n*`@q=G1>y@XmsN zDEMK5_aA2T4;Or};9Ue?D|lDIKNY;2;Jt?%eddza&zy+3Ts$BL<}Mx;obyRv#l^bd zeB$+5y>Yta_~bR?*{QnJ-?yU1dBlt3mDkC_=lJBsdCrS%=k=DaSeM`J`DG3(1xW_y z`oU{+{bF58*lJzG;9L)QT`KW%J>bQ8#7lp_YpVLw{T@MWHSyZQJ6Rga`O8bpDfg9y zXv^Zg=npkBxZ92~Vu?zu{xU`(w1%byeJN z+>q8)aldu>zqMRf#eKE1z2f&wzg4Dpl=0b5%F$9zmvW($%cNW-<;_yAmvW<&Z%DaA z%3V?hdKPQfIa20J*-^@VQjV5#x|9p0TqflzDQ}i?y_6fJd_&3|Qtpy6&`bPFnJ;BW zDf>w|TFU8CE|hYal&hq?S<3ZNZj|y3DR)S@OUgj+V#O;*%6ut1O4(1!(Na#Aa-o#V zq+BKC%~GzHa-)=QNV!AGT~Y@6h<_>brR*qWKPg8`IbF(yQZAEnm6SJ2xn9bRQobSO z4k>p@8R#qirOcPIqm=!m94+N^DHlq)Ov+VK-Yn&MDK|>_hLk&`+$Ck8pZJ$DU&@YB z_LFk7l+&eLDCIIKS4nxZlc9gQ8l%u7bF6BZgmr1!w z%A2KJFXcul-;i>Ll)I!1^cVk9=1bX8%6?LgmU6n33#C+Y_1`{K*KENpDX~8P!s>zI zu3Tk1j@a`_S(*R9o*dr#asAkbpHF{RrzcCLPStp`@t5`>R#`8-RiBYRH3%1z_iL^) zyxK;2H(u5c8cqp7%`-0$V(FLA%PNh@(o_%rmZY zzsFVP*-x0(|MvVOY@EleHUn<|AM85r*-4ygFF#&>5@#SW*Bd`xeiCOOG1nVEUVaj1 zATjsfJ$@?hPkw7Wo}I+~{9C!dwLcEj-=VU9sO(gZ`%u~S>{QO|-nf^az4K8S^YT+U zBYWe2l>Gcr?_+!S)*lc1ql~}GJ@cQ|uFCOwxR(Jh16~IHQ!-HIeJ_=;EB@Q_ldy3f z^Z#WAD*k5Tzqk2ivTjv={`j>m^6Vten3o?fKZ!GtnCp(8-}}9qKk7R0d*v;0uX)@9 z&44?;|ES~dVB2+|dHkcudE+5*PkQ3NiMihR`Tv=p#I5$YUIzYeGf?K8KO{`J zm!E{`;osR6Q{rIv*Pb0_vFfYL%X8Jq0msWv!t{9gNt_-pKVE*S$v|RunYTVCOpuqK zgz53tpTz0$^5f;FnhYdnmwD@R!UTEwNthmQ{YjjjLzbUv+<0s+16~Gx#|)Ioee(Bu zU&FQUofq!E6TSTGKQAuzKQ%wU*L-o??Uh~zybO35@G{_Kz{@~I2Fkp1or+}qirS&d z+plo>n?w&)oQKNJZ)(K9LFrJn_dm_fzaf?XCoT_Fp8rpR^_+Mas3HSp-u<|W%p@is zs=Ouk;&HtUcp3P=%fQYj_V24I`u?Ros+WO3Y6i*<(SG4j<>x;wop=bwX;psc!~6fHCWA;tl~-9694~)nez;??iZt_aHqhf+cC@>h|Is%m9bF+lh7mmoR9DoY^ZT{Gx!pmQx z>{QSDqvx-x44~b`AMf{He)(nZk+FZw9WRx+Uj7a)f7Q)DFTV$uUoU@N{tDKn%ysVFMrkND3OGhzeL%op6BJS`Wz*a@bZ@^JJs{N{8gW$L=s;95@n})o|nJsbCgKJ z%U`1GRL}GBSAC8WNqG57l%48%UjC}jQ6dR1e~GeFJ@1d6zp66ew%a`;u1fB=(mnf$ zGw0>U%TMAAB<6bK$IDOR3?$}yCl-u`~?yttT`A2$>GFArUQihJ(uAzBG9*c&f9yZ5C}eb==@=lNcH;}x7l zwX)yo?+RU?e*pWsDgWQs2k-vv-M={zFrW8(aejFB@BOAGA+b!j|KHb_s*-f5^3xFx z8UvVTu4SoG_o3_zY6Gyy3jq!TxO~bA->!!5+aI6y66q&Z@b~iH33SHn#^Ip8zxdCA1sJbnJ!t4tKE zU#ob4^8YRNs~X?TccSqfH~#lKKH|pze))0ZZ!i9V_T_&|ewhdU^&*P>US+b6-Y@e2 zh>7&wv7HyYD*on(rro&AUsqNgBW25~h?72AQvjE1k8S34Aa;#p)%LyoCGMB%^5^oa zDi0vPRjD2jy)1#$As(Om^>hfw=YH*b`8(k8>E#a#B9rhN*GDgZUjFtw21qQcg5#}! z2euFScjd2&Zj1G&dylM2?!Sg!?Cbk~8Ect1`@QmasO!{^0n+T&*q4zN9kT-MDy<8<2*PupMY%^@q#$W_Ku zm5u%B9q6+!+^RBu;QDVE-~AD#o73M~H?7_Glk=w=z|AuyTwlM2PQBmbDmzG{2djUO z?qlQZx7zvt9>4c|=sh2D?o>4oxPBj^^E0|R;H&I_C5>QJ@|Nv${DEL7oRl0%NllBU zXJlq&=hVopS*v!Py7lTWjXz(eCHEdzSk$&%`wksDbv~?Tuikz7_B(d+l&RCE8(;CC z#eIfow6wP=qdiSo(#w>~i%qGdTqAtfM&S z7<~ElrYw_kYb7~X|JRmJPM)Y$UXXH&l;262G{x}qr0gK2>u36$xpU{wbTRBt9J51k z_X(SyGy0!N=|FUkJXcfe_FsNk8UR#S_+!@GGZ;57ED1cbW{bIx=EeN*a^+k-?h|?O zdn{i34vQD}yu4gFSKpQ6{+(CY6fr&5pKCYXA8k;Nw5aIOzDp;`rMr5rUpEfduWP@! z=@@OPP|BfFYT~c>*qLYS{0f!5L`xbRoc`v6)Guy$aQ@dFq<&tbgYTf+r{h|2>7ypKX)Gzss^VXe&TMtsdq~PG%zx5#XOPU>||AW*oX?}42 zHy@;aaf^fVzwRLQ^I9I9|K$g%uUf_X-`T?**9Tf|{(HRsfofIAZFu(}_1`;4{VlG( zd#9HjK(WM_C#AbVaB+7>Q*8K0^zMClUcsoz3uez>kXKaHx?StSRz(XmTC}8X+t!8c zTNgDGh8i$?{^0ZJ$r0Uo_Zki`3{nULl4WT6pTg^|k z^tMi^&D)Ls=~c)Zf6ql-`Jw+b@_TZP!Yks>-Go*)(+ZjLD@!MP%p4RvWz}2NH{E@y zsN{v5H^Gby!#+0fw;Jq#tRj5mg@RkKbv(xLA3u9OF#iQmL~#xaD|B5l3Ol$Es#()0 z?gak<@jNTA2As%bSPSOY;FCw5?LPr~-$*ZPP=f_^C>*&HGQs9KC$ZiR8{uH9+H@Sr zfw|zCT0>d?nKFN>&-&O<=S?IHrq!ovlN9(AADutI2VC9)(JT@oLm?5GnfW^Dq2Swy zD3|nFm?CxP!KVU^QSVH`xbZ=U5oEQo&Ia1FMhXzC>BZbg+f7@+rgEA#VunLaKO`~Q zbP%z;rpIzGU)=N*I8$ZKry^*p`Qylo-TX*!oaXgG38~0>D1{4ZFNg67=Yw=LD!I4e zgP_AvYGOke$xTvQKssy|>@gyB*ceb*a}IkBZD8X=hh-un)}ku%I4mc(&t=$kSD{`Q zIV#%EhWKvqBZI;NP$*|Rk-=$4qXum zaLp-DfluHdLI;r%KGw62gizgM&|{q=qoU8!<2&SzPWcDw%E{tLJ38fOAR*^+WF#^s zB^wQhI^RGia!g8R_K4GmVq;T|0+Q$SMpGl>QlNs3OJJ6Ade&0W6t5!nWZ~-Lv%VU&&eANmFG>bmukjlGh=8<57DJ6Fbwqo zdp>X~8^}gQPVy~7z3y7DqA8)!r6`>j(32^tk@fJRoEAt!N?Q6;sE1V6ao|U$f}fh3 z$&-di9}rS&W?jbm-7uJ1E9*MeJ3uY9cGm5vPntJ%o^p!P*wUui5ve43XqV)uT~B%eqE9PLdm8op zSMg!Y>e&@}3wYW|Y44NwC3*V8%)D=bPp*$PZMLF4qwCS0=oA(0opC9WtBN`E`kAHA zYQ&j$gq~};R-=Zve-G5-KF?}&0yszNEEHJ9(-x{@f;S+XLaWhE473ULrhq-eYV;h! zEvY>NNU7B*1)O8+&H{3>)o2x*O|5Yhbjqwoe~07aaxMUAxz(r$x9u5b7F)&h7ED&9 z!P?MSV>N1yX*I9LctrlZrLx$Jy7w{Uw3DMn9K>AE(@v2^<8dOVng!j7qLFE*MYw=P z_2^GKU38wYS z(q68qdp~-7sY=_d>mjG0HW+_Pr*u?J%}smB|0?7M&Yx1MUP(R~)oHw~rM;F-)q&He zs<+bVSRFnz?TPSkST#9$Mso5J{cO~T<2=Vmp07=*kaG{syr_|=(;VqedppR`a`keT z_O9;sLT3_er@g1Uy|csaNZXomGz=6wjfs4qJEy-2aES{%h?oK#n32nv{%tD$jJMFzkX3IXgjG)t_9ROuB$UCy zo^0vcOr$4r8L?8B%!@L(D5e;xqvGFcC=7;bJUs1@ld3ZEIqoTZFOREF{R-m zuo@o`+KsmJkx=&(BsCiC7(IeM4ntQ)J7ux1obSPocB)Mzqym{JB3ih!kGtAPKYT>H zq;b!iKOY}H{V@QVD!^qo(w)Y-YJtc+%z|jQv=tQQQfiv2g%9r>9qbQabUIvuqeIg4 zI_^9{?GaJ#sY1@_uooSvk*ISf+dE1lxz1m}kB-(zo)bl?qep9`zzJZaM#n^RV7XA` zvoN<1_J<14;o$|*6aB}~GuP|r%-USAmGd#PGb?8z7*Xd7a%O8J*WuPYI!AYWo*LXV z19qq$7z4e)Df~DG9}(VtqVs)R!iR(rY};BKSYcnDHJ#Z}L*~Iw--g^mg?(Fkr)n0p1&PzJk5<=3!dw?($X6v!piD)QK)NZdw)I#-6!w4q5zAfw_pS z@J0@*3(kpA3m*m{yjpF@y_IgmhcOnH zW0mtJJ+#%VV4B-J-F#!UE%|LUzi4khW6-Y62Bok$@W_H*6k-llPB97dQ;Ccrl{;m1 z+%5RXUS~yaKuHse$2kw^Kp)BEu|FL%W8- z3s{=DF~-zSGBb{X^NhYJACjzFr9V!hC)QM9BY1MQ?{?KxPBwbR`Ai$j#Q{)-Cm&H2 z;KM<$%Tdc3(x@3If!6$(2|~_D1d_cgmF*ZzRqc!6tDNq1^P#qSJXx{$)zC%YXJ2Wh zG2k*+P31hrR_)LlYhoIF>XsDsV4T}DKW#T;*E_*Yu&{I15PV_}pg%Dp%D1KCMl}We zd=6cn&tMFxz!h1j08TEv{#Vw_0Gr-L7M~oL_p@%nK%)U z10*X}!}6}Lhn>hRkhX7w)OnyR1Jw94khauoBzhG!tOxqK)=AYmR{~oJXh$7;#n4b| zQCXMG`}-(+AwEZf0U3Xe@HRm9HF%BjeK%SoEo&HxVU{%<#c&lICBnYJPz|tq0({{q zZ8UOmx5;0jFeDa_>!o`~*O(_x6a&{(5hR@NUDfybuoe*Ly11BtA0*V=+iER5qc-?DU#b zfE6(hEtu}>OuAM3!MKktbvV3pU>s6Qo#vEkz=6NiDI%u<2mDf}4+ne$4)mqY7!LHt zQ)W$7Wlos0v@uT*&T#ZIgGzfC3JV;)9G0ADx}{>IuodW*1!ks|A_+4Ax?2`F9oQ|G z0KWjBN6NyAk&-@l+I+Rh(fg0v!M_#Y-z^Sk_8LHJq-0Ch^hjy{3xb@a8~U|r=p-Dv zv7sEHlbnw9TNA@zlGBgFK)0>L(R)?hwquQ3l~xx{N1L{lonYFQgCy~?%I9M4p>3m` zHnjaHL>~mCFj1qO?)32n@K;D4wnw0H-&NxA+?@4>Y}`hV{h?TTg3moneCKV=*tQe0B{T zd_AWD?L~1*3jvZjUg|k5xLN29yd$921u#?JWW=}Pv87#(U2rmv*z^>(R}_b7sn+qv zzNOZn*^Qj=YNW|N51bjWFcn}g0dh7fO90_VfwU7HrS4;QIH^mi^Ex=Z=U-2q7lAyE z3h((U)I=0kg34Jj51%7#o^~J47~T_hZxDD{?VR+wpm$&x9q2xjZoiJXb!)ASJVUS{ zphI{a9$$4s*pA9J9l}Rdh7epMtQI{nP9GIy8|?K5RD`=2+_!{#9G;g-Vq6t$CnG`+ z;(|Tst87PaUf5!EeztR%9>wgWY^S&0(Y3!2frWJ^vvrUPJ1t^TVW)$ZDtHzuzxcE< z#sslne1$QwUwnscViJ0{L{Dt>>AAccy>68=M2zvRzQz>xW6SXs{3Txq=2l-zZbnW7 zZ35tgIdf(yYq!rTl(E*Q35>mfM~!+pxEFuuOaC4o9)aZDfbb)|uzNkuj2hG+`l&Df zTu9q5g7X7Jz5=9@k@Pw!hhs`N1mKzM@##j5JDA{8f^b97@o+Kt0PL7`Q-um7oaZs5 zv0T{UU&Q;Rq6sf>vcnhlqpjNe&G5q$yHql?_cwt(t-b5Ox5rc$K;k=JUa_m%35jV2 zNF_t7o&#(F00X#>gz|6`H#`hrs{^76`}_^f8&#O}ZQ(6r5Mw=*#DMMGwdx2B^i;p0&OV9=P~cEMMwB zS2P>dhbnYv9&{DFK^SH`au0f--1yo&)%ZFw=Ib=*CG$DH+}ECqG|xFFxX!MPbJifv z*{pbHUG{QT6O&=3aW+((Es8n&$#u5Ur|$^o!VynInYWd`;mq4TKyPyWuZr`3msn$C zKacnSoG?sdZ$LL(YW#1VVj4R+=6?pBwsm7K^|fSUcLF|foh^@ZRuJcGERb$8G0!=`&;JgMqgRjx}*YO9CdF1XRSdysn99vFYrYkev?DF)j9WWlR?VKaVuV zw8Y5W0{ljRj%jIJOkLt)Iuo{Ic^b7>OiN&Qp^2$fVmdCCrzmC>^R&=c$UHp*KYsz} zm=^jvGo~HDw*j>OMREQg7i-Lk4LdRaZwkZYp{#+U zY!iT0{$U=RakVM%bz%K>I9d%zpQ4)iGP!8|4D4$_*w+NZSPWR|CCt8Nz8ZVrHm1^vD1=U;b`F=aEe7IQqRp=L+2~j{bwtdBd6*N6(T( z^6q$EjJ}^cq`!?w(!yQwl40M_UM5Ht>@7mu8zRQz1PP{LLmtymp)#TK2uRwa0<(~y zVN0>|{@EU&FeE1!ljkErysYwbVG^67pKbm4dlSU32IvQtEOSf#4EVc%aB^>qM=_w( zW9XYbw*Qg_=#IAFw8Cg<0kHFdbVcQGBDH`Vg~~ucXtpRv2D=e5BZX+wvBKfu$<44R z@prsk=#L0(A-ZzC&^|=_gHH*izPg6JN9RS@>Lzn0u#*&n%RG41PP2CJ>!v6MEN zXcFR|D3Z)#VN6o_FBCen-an3hecZjfq=FuLCeCApx61pYw2tVS@9Z$|;ZX?~M)YNs zv%AqZ-`VHn&M=j^O@O}qDu{UttFs%#T``?GF&($& z>U?DTYc`hlgwYTDg2ebaC8p!nT%C_?{~%YV7UXla4rj(gqGQEs?U?{vU)la^sKZ&p zFF=|B^epLyN*5xWC4*7nai$8h7e0$ca3|*3*S7yP*Xyy683*Y5lk3p!?~VmR`3SOR z%&A~|q3PM;_AO_NDp(H7&)PX00rfB*8c$IhZM|}{?^`1(ff!t;5 z@6?)HgLc$}TG$tDA`?FMYbt=IU*55{2wL>c%Je2(O{hEMxA=??oI zXkdn}WsTvUC3Lnli&_Vyp>%Ms#)2D);I6TwtC~r0c^D*h06MtgsPqT;e~1fi8bsmB zzeFuo4fl@ES+Qnmzzyy5V}|J7lF$;$FNI{d2NuGBC|PPQ0xP$}sTe`_bZ{<09OnT# zj0Iv3#>d^j{>13gM5!K+yK{TQqJbpwrtT%2A0p%pJb>ARAjNvuF&2v{n9fD_JN8+Ra(d#`%3Rfyd$l z?T!QBX)^GEr15xspgn*K#pl4^CXEZlk#;*S6jO1`G8mv2ib1wMF5eCOCDM3sI>=6C zjO93&UIoyL!eBd>zh3tQ@CN~U@fd99k+uu?cG6BzL(D=k90$S00KHHITVnwDisKiG z;t^*2;AjzkM%&SMTcG2)P&^2&y8x+V=*jmfu=fEnuRj-6OU;ACF?MF>mQdxqZiu7V zS^zz-T``}!1Y+9s(cm2cNF_y^UIXkh0B!TEFMpH?%Tl*NWS;GxN83E>`v;`nq%Ily z$gFJ*3;_Vf)wv^$8n>tZ>jb$S{dpbK(Whpv<0x49pAhaP;6AOn7;Kv>1{+7M|A#oC zPh6olDukRB>y`$TKUJbFgIfnf0!xW->cw#yXwFC&2H$F{f@6iLr^Lf?i2rYbFt{07 zZIm{Mg&^#U^KbKfcx#-GGUHv-cgE4Lt>oK(ecWJwz<5A%ROmUO$0p;uvDQ|ejPuN7 zbcYirBZsPj|24gJ{|4YH-vihcQRxBeenMd@P8yOX!vpf@@>8$Op_t2pT2wd zK~P;S9n`6qJXZOQxLfH!x>|V*B!YwC06+)Q)zU|EJ%RHjB7QH})#}49gl+=50)Pke zZdN+a3Od%r00roI-QB#_^gZyGN#h2fhk5Vmb{zR#1*kU-O2w9*|Ajc2+C$ofNu;Ig zq~fG$C+PJq#yZy1=spYDU4VL*V2$ZzMHujWoc=Th)LRUDy{vkqsrq<`tp^&{r`|?4 znup_H(Di!K$Iy;#fFHF0)Kk#yYiM;Eq8$LNC;bei6xdWi={tzd%C)VoNfETmO8?uD zrdzunXXCpNEB&}51Ye6RXW5p^*9*~~J98l_k%g!$U!SRCTh|OQDt$ghZ(P+DO*wY% zaq2iL^8>V^-b7@2hNb^7U^4>P1nAQNz6u~%3r)itk4>M~cIS)TT71Lo46EsTntGZ` z9iD=XnpJBXs2CMX(ertAP=MR03f@*$RjLg#b);TNG`zU_Se>Bs*7Ok zJ1cW8jq&#PHgsPGq>`a;f7wl-1duou$KtpT5~Hm8Pq=XmfzTj;j-v#X@qp~JTvu^% zobJYPh0DZKtWML9ZXC;?yAY5{hK}O{V6Ot?0sn83dP})AOgnw$+2P{$2!n?l4fFA$ zAs~B;D=uM(l^rfwxiu_1`f6dZmzxSJ0N%TAt7RX$vez|+V8K*vi(WHdM!94RZdWBN9-LV1lt$W-E}-FC-KE^+Hg0uqum%AhjOqP8VE=wLl2=Iz?uQjEUFG1>?Z3eNCfTh z$*$^J2wg{2GPLTuz&2K>o*}Au?1MxI&%dr}Puvo_08+`&s;2;(0+3`jj(M%&=z!~X zl4QOEp|=1!nY&Qg2?+HOc}Yw1Qf0boVddwxufbE)46d#_pl#MrE>(+p=dg6Ab};u{t#n{~apx)znNZ)an3hM@voLeeNQbf{64busD%Q*bl$ z8DAd(*S>sKJNklsC(gbTXWty}ZFTMUD@4RwHX#W2=W+CJ?E|;Uf9Qgiu?1T?(&%-F z^)f)qabb{pWA>=`fW8js#skGILq7m16AxNJKsTmu%XnsQ4A6mqR&&++y3yAHSqV4- zO!YpS&S$vC0XhZYu1vuO39(@aV}7|Dl;WKusB8}h5t>~SjBQZb3P>eAsR<}Q0^12_ z&9BN_J)inB`1(7t#(1J>2+-e=bwH&ZAp1JkfqX}1hl-(~8kWPz6E06Z4bsP{-RYdG z{t?jZP3@;#3G7n%mUe%h)4c2wW3^1k~0>!|IlQi$DRWV<&6{l2pV@NV~2j!XEJWGWvsCW z^jOPKSsVpzzO-Td1wF2^vIQ7xj`kcEM2*1m{7*;NH z&0dSjH8lIUtICmv{vK&z1@kxVW5xmd`!g7T)3C4VK7Ug8xtk9a>@4aWMrH+N#`FM4 zS6S?jetda-@g}g{U)MSj!SxWYV*%9DW52GQMjh0&(--7wWK zm|h<4@0xxE%A0A88=Y;aY$Za|U!n3PKxqR*#DGstg@Mb$H@XIF4h4WVkckTa3P2lZ zfl4z#Xr$=IVso%{(W_tZL}76N`Y#e>V;Vfeel=6z20aDb!J|TV#Hnl54OOm~=j^Sj z=4SfgZd}0q9l0COCSF!K?_4bpM|E7CP59)%?+n10AFs#!-9WA);RH27e*vfP9J?EY zhTH*e>1jr?rOt)&ss0zyOuYeY1*ryrd7q2K!{8ujedgUa#l7vghv5BbY^R9Yv05sO z@>&$$;~Jg-qvHT-ek(De+LZZVduSFXq(wuucY|*YZO&~BR{LROs0BABvEQ6FS#e`zkyZ*9u9Kl zWIOovboWV<<^i>K(Ax;~DC#S5lPXdJ9zf&FOS7D4wU@z??=VX@Aj8si8mWCMG6lL0 zalrRv)S}G1m`*KgGv(T)kY&|}gwd&GbeeHv>Ha9;MX2(!${*{)9Dy|tJ#!+!9uDMM zR8|6#CIWdHl_!YI0P;R6Zvw&`ebHhwhVVzWFqUhDi)oD;r(ioY5x_qNG%H{YVA%k@ z0=kNhY6!kw0rSCY4A3he&qq1{vKxtqN-JPnHfEOaDry`Jys$^sZ8`!b`qC8JRD*4) z!8U|05>3wLgfrQflxOMr7~3&p-S`tsxWDqaz&J!Azv+wE?*nT*9F7De{RPMws4OP( zJdkTqSqad&yCRl5JY?gyAHt{80CV>&M4kqulA-S&uLFA(pmXOcI_gO9b?&x2*w+>!12VAX=J41nDNNFP+X0+KobIRTaFM0x;OhRPCvz5zFgEjxUk`D^%z ze$ZzM?}o&kfK<|T3jYG^F@R2?tLLcsZVLYj-irX8!Y!!03&?IS4k``5g>1_r;Z@Y! z6k;o@oAd=tdh5YOo2RRR@|!JM_99eQV;<$Tu{0%D19l#nQN{KSF;FtS|=6 zPw;8~4af)}eF64+KyE>0B_QczAiGfc8laD=8_R1Tmb$`^7b@)Vi|iEM-7|1965;6x zZ^7+QX+?y$;E|{d2B=I1^i<4(TXS=PS4Bp+u`Po90vcd!7oc)BU=d?eH5gRr12GdD zU^}b)g6To?@E&`SMESEsnWw-f!X^5QXS%`FLSKx@-f5j6WAw})>BpN|jWAY+*`YEF zQT~a-x@l%jdpwrg*;s$=g<#!_aBl&$D+7Xq*AjJMqG{o5XiZ4kOD}OH$;2+!XZj{G*TMGfca%LhH*aPaTMMtpzL63C#i6cLOOxr4=BPN>7WDr5=!)+pl5AzniV0 z%0P(s2WVpxQ5g#eZ4!<628C`F;;o1mP2ry?A@BUVrDFMul^(J9zF~Z4fW@P)xwL;F zklRqXiO7{eoV|7reMT9x7|^BE};zX&uHE8aWJSYWzd9H6rjxtdTb#1&0rT)f>*b z(EC$Bjz?u0kxf9(LFEiUySIVh4>ObgiSiZ@t_A4Ryj=NPHcLH&J;f|1JQueHy_tI% zB0P>VFV=l0?k(lkd=kh>j{jy?=Y7cYI7?+Rbf94nG$-taFV^JbcPvr1Zxw>Jl)X)lA-0?p#L0`}WLCZoa~ zhW$?0QL7`~mOB1bgT%v25Pt!n zJ#0bcT_W_b6O}KBFsc9_2>>KdGz`e}HR{{=vBO!H1GMBb{t>-O?1}Z5XKdr8umvsV<|EzfUh@eAfDQztNj!<3mn{#!| zZ_d>V62*Dq7e4=3HI=$&)IsdkT!JvQGLp=Q=$OcXp>E!ErkA*EvEe zV=DNO+{`B+mC*+VA~myKVf}72G*T;T7wi0utw`-Go{fx@-`HZiT5wb}XRB)1IQQ4R z*3$irt)oGz$Mc`VQy93)mY>)nVrA8P{C#pWx(*1?4D_#BK)K@F? zduqfs`n|NiqxE}heZOky{=U|mu71DN_bc>|(1>I7`)mD>)*qnt!>XnG>smE1xODtS zrG8qWKS(1Xqd!>dN45SCt)H%1-iKWAx3#82KU;oVi@#2yvgNn6E&&qC=GO=KZLM2? zM6fonWLEMY0Xhl$+W6zw4!Ok;KQh9&|(_3gmF0;?5#)1 z;D<_X3$!Dv$#>#oG+k*GmHYy#8EgW6Yl|5;ntxP`-`aWy_3oELcSxgup_*(X{Nz6a z?=uv4*5U}~Nj_+49JA&_2i!dc>=Ct!DBh7DpFptt=U9k_X<{G#hQzK^##cgh9VCsZ zF?{zst#8U1F|y`yE|^vvvk28x{E!44UFAxtR;Q%miO(s!b_mE2(4QD`<;iH3!=sAv zPB!z?7AtaVK!etJ0yta5tynEd6vsPt?86{22%-Z3O)hao-SZZeas=8l&I!_L={|n% zaQ%*RYEohbj7$Zj@-Sqa(}dxl1$-%>K|gq!?>dOp+*rmr?d{2sxDKML0rqGh52Nw` zpve+f&jcnn30O}lMSNpTd?g};WeU7N8QR~24k zodSC)B)){`r*uEd6|Kn2m&pD=$IoSAYq{xk)kK5CEj=H#433 zUqZ4q@B)A{Z(1oV6>$g*1wN2+&!G(ioo4fQV74S;{ffLkGPMFpn z0d_wi;*(JGafgmH6l5H3RiO@o+*QDPt^3`}5-2CrW=a6|yPFo3N{c3g$;&Fg70a-0 zQFkYc^>^Xx4S;S@cc&g>*aLhwK)0y7)0`te4{59g(9!oW(f0w~6@ciAP4qK>vGXGr zh+`f7?SiyLz@bOt5EDJ(riYYE(vVE)iED=Fc$e!>#(ipt@qnMrHeLW9X9M~!M1C7H zZ1${LO!+c^4%<(>uSaX{dBQ1s0F0oZq>%mgKa@=@IT zQUR@Bz{hrp#!|DeZD`}<*zbVa08keYB+<7Wwf=yP09+}*!1F!600+&6D@|jvF#ma3 zsaKI0Gbg$E3X1r<3*|@GD6x zgunZI5q2rRP-qJn%O6d%>Nr-()h2+X>i;Rptl;$v=c^3(vjlWGm*K~y0amPr zp{cKkldYHGt~6xp#~ zkx=gbQX2NXxnZIXOA_nnTDeokqNRMuK@F#QA9RpjBfmnxUjmvml9&(+zsDF`l|2v`E!uE-BwTh@jpyNPj|&*?T)k-t6yUvN8AB9xf615z6cX}45myDROB^j z)n7T#lE1`9N@I9k=JT_@MjBEdbzWAvgT10N1^n6^Gg*iw3Q#Glp>(3pEbuFbXyHd7 zz{@KC8`cjjD<}H0xU5Wo0>8L%Nsz%jUYEY5ReYa@Ux_og z+sN=BC;U~MZXGlcBP#5>w!#746%VIN1{uBn(=p1d-dm<9PG+iWXU*O+!{TJlb7gMc zTjr!VnLAyX8~2h4T_!S2j*j=X3ceq&K>bn+M@%*LPk!JYpkO0USV9DbpZlNOXP?KT-=Y`&@gZHH34pMYaiuH`4V`}5m*NR zdKtSd7Moi`7wYS1Uw8=g^Z@7u@nWj2cg1yRShv;+LHEC2Pal(xx73|bZ|h54Nh{oQ z4ugduwDPno0xKcRwQxJJ@&*>RXCRJ-B`=gFEzz&|>3aa)qUKE}yhp^3!wutG5udl0 zIJD=fI`TSaxR>OM@=Y-cX?}0{)D`z5!*MG0Wn5F`7^9Nns-QOl4UzS|oP1U5P_A{0zyBn$@}+<1T+bgQL9gzrL5u1U(1n_e&<*YEn$frgi zm@HpXFGQm^avwotJ0M7g-pHj5z;8u>BC5Sb)mC#Lk?l)b?5Z9E!9jo^8Cvx^V3ziTeb939s=y#lCA)=3dsqc%)^4rE)Sco3~+t{9+GXZklil&EvwK zwt|U{{KeM0;&0&hV?cm6D`nDGZy;`B0L*sftIJFk0c!!sY=xMQfq|qGVBPlRe+lMT zFh&E~9tlSONt334LAr{p6z6<`HrwKnLP3nMq3-3`Fi>L-ke z-S(PGD>q~;4jj>t-KHULL;7WaZpaU|9tX~m2oivX{9x;b)Bu(a$PBH$$ZB9$0C1%=gZA6D z-iqwJ*tCW}9?Z)se+7q|XwBPp26q)tLgfKKDi`6m?YaXgcNFpfnlo+oRM1+I)(*5r zfTSiE*6)~BUkv;#fX>7_wjS!Q1Ah^qhxNDO94}5n((bVB6$!(0R+j=@%I7N z9spH7OI&=3iQ7^)L*gsD)t%G>~=tE4#s2x1S#Pg07`pctpWL?fV@xYXjDdl zG6KM>;WsH*C2YN$i$cIEzo~}K^?EypRfv;5`Qj%w8}{4YxCUgP%DXr+$E>n_+*1U1v0CZGbleWbT2J zbFhJ}&vWE?m}+q7Td{MAe+n`;^V}hD2M?+?R2SGa7t}=V=YcaEx<>(mWcU_?atg3H zfSlDpE)zvC^<_iPcRd)lK;kBV%Ha`0|MQIfsE9SA*yCV41d;Vx><(b17w#=Klw#|^ z_#cQoN3j~`11l3TWJ_PZOF(=F?6)X_NpK8C;$yKUbwF^Z*xB!}NoC-C3aO6)_Iw~e zqOzOF3?L~-qoIJ%OQQS{h!`dQg-W(X`k|N)N6P;Jwpgy5t@^^rsdn~oWZ2#XPFt8M z1lXSe>4{1YK#)>C8_^C0HW*NYM?86w9rTdCd}$y~0(SzyR|`lfDzgE&!pBN%&o;&@ zCUD15d^%!YC-l~B4Nd&&ZMYfOp8&cI1?QWt+p7(agZn5zw_!6XF9C4rF;^~rEp-7bo@>|qn0`6t zeuUJwfFK!q%rzJTHvm26o)Sec^|cUsddv-h#2|nfbA2QtOlW;wOEHeQ5{OLHVjN8C zDh;M*D8>PG5=7=utOkeX^Oc6C9+qcW}^zZKsT^E2-WF z&u;;OWaw0<9fPwDfKK)KqUh%E1NhXbZVHJe0F}e!Og_ih59m~&EikVW)EOcjwHQ}{ zHOuy%-fbwx9vJ|UBPgb)cT@&)u2|E(F&6AG6p@*CkGQndOhkT_ow5PO^vs(BspA29 z)UHP53P6xjdem+N_81_aGw%*kIoo~!<$Hi0sgbd00>JeZi1~UH@|W4^E$fM|j*w~% z(7sMYWeOljDedb|z^(vjUthSswu7<_pnZLh$~OS|;zPp8GHP)Kk0CV0ZZ`?Oa(UVt zBthS^TaClk1t1gYR#CClJCK-aXSc7d%%EZ-0sgi26F- zPJfS%xPT9X$sqvUwI!%b1n6F!gUT#`3ZEkbgVXLuD4Gog9nR56!Ak4bKc6bJK_2%tt_&gmDBts8`2Y}thNK~Y*Y$o(srT(^g z8T9l!0$D2M1!S>}+2E+NOm99wHC$GCjRtzN)5gx>W@j7hZ2{=bP8+)kH#=$qZWEvl z;6|p<-N>w25}2=w%x<<0Bx(V|SBZHV4Fm9qiN6A0q9P9nLkF0`-_!rm(wpeAGfY4W z;hdLMepw?O(2rIP2Gj~>n*nq{KU(<==qTWQNJBh7TJ5NCD$u!r`cq0zQ9oI-*}7^` zzY?_lXDjJS$oN*QTNL2_=Vz-9H&pjSehmQa_}OYrN_ZkhARuWACdI!j{oL0Kczr-2 zkFQ^nXz`1LQiFMY*>+mAA-al3FQXtn0uX)671t*euzhiN-0#mcEw)I=%XA8JF{oLjf)n8z%wq5%u+F}fwVP_K{`jIOlF@ztLWOB|-6$gva zXMYtze!F+Jp*t(iTcrQ|d?Dt>F5&B;mpmCE=m~NwM8|amh9AsI8HxV>+6>4-aWhDF zD+eTRx2gPluCJ~7+-Uy;;k^gYd+Beiq=k8ieZ^4yK=!Q_{t}ATB-n*W_-L`l?OGln z)=hk1RpH6P=D}Cz7+Xaa3*AhYO}KZwV(Dl7b!BGooED3Ymhr6rij~6=oCU|J0B0d6 zE%^x00azOVzQ=pj($Ah_fDI;vKgaW`r5`w!0$)tpO!b->_m=>>2%u8_iR9d8+~K&9}fHg7TgwR5S-NNdn}S>>;qkZ!S}TtMcP-~koj%!h{l zwzC}A6@YM9TEh{w9!jQjRMUDwry(!QiZftfe#sw*ScwcR`Y!0nYKzjw?e+0w-Y%yu6FOrc;D_oL~!Sw<- z<1uoF1A=4}zXl3u+%wd`46@3th8IwhTZKy@buJ~zDdrc$FwTdf&tk^AfOEa&-$9i! zaPEcpJpjEy-GItph|B=zWmNtO2>mF^=KeZT|8>1NZ}IbC-jZ(c;h()Jb%W*ai&W@` z`7faTF3s^_zV8%tDj-NH{V+cl*mQt?m|s9DALefcWi0?#XsdXZ?X8|Us^O#Phbv4! ztVc$ya?XF`{tA=(ze4!|0CInYmB+K)o>Orr0hrU+SSntG@=7bRnc*^fcR=J?K#&Z5 zpZyBh`vCk}c4txJcUDCM;*ecXmt$3R*tj@G(eZIe9jLidO;3qqxI~r0AAP&XG;8zX z$|IX@(Zq|)$nG)?XLbNI@gg&_rve)f2!AZ99NEjYQ+@u?bdS(!sPf2e$p0?0*ti~| zGuj5j6Ydt9j9v}H=NNa3t%iJu>04l*kiyZt*o@}F>F7#8(g}FlUt;F%4B(RiI`eB! zH?6YNG&oseWe;p7nZFn!=Kz9a=*({bwjLnkcXv$nY)G7G`R}1B$M4q=+6mC(*E$Z9 zj0neX7LZgxC@4)g<9C$*bom*&$^$uF_$-NIdTk5c11DPg ze0?)?9|M>#gRS~pJql;wln|ivJ=5g-T;OK_biU6%&CR!sNM~BvkFY%)>32e8Eg(pS z&iCiQUI#$+D+v5ErrH1!^DKWogk$F-t7DGGVg#@wKo+60fQSNeAu8tpLf?w=k04^G zA>Z@N&qoyU3+BZbK6>47#cWjsAM-8$`Sj5Z-q*v*-89Q}V=F4}0D_d#=~gFT4+)A% zw`4QK*m3D}*M~%10Itw`5{;}Ou>(nLFgGFT-K@e>OqzOOrQn5kuUhHccQd&k3q!2| zsXuD*I$uJj_K7$^1|;!K&F+?d({Tpy&H%j|=wbTfu$gcJn7|E}!i_5I8^diSuFUmG zSg>0{etIc>-l~ot+%qA1Dj;bPT=lkU-vqfwfZqoQ)jHM0S%R63w1#~%#1fW}uy1+A zSJu9yKIX5PTvu@RJe+;h63*t$Py?-$Bskj%qaV@m_{xSKs?zY0`xxd=XZ1wBXn3fV z!ap)En1vk=AT(Q2AB(tZ!^8G5%-@b!Erv&1DOoUF0;6MS_v% z7?+KGdwKW2V~uohCdpMlGF=mXOeaU`8kOv z=!=2QA&G~sKSxP=66nJuHAiCprT6Kd0o?(p!#mg>{k+$s6t{LjP42A*OK`R-4&%MV zj9qPz4z8VNK;kq&kaWFvt^;-*0GjNnc`?oLkoYCDZXq<;LDor#nsWYcyWmzYV)(^L zh*?%-2IU;c6+o^Ypnzhxh#2l45bKhqCB}d|5&%x#ukBX4L8^E!z#78rT)&~U1_1y)^RA3{u0sTty2GO^bTZ@W2{On9F-%8alpWFeB z+W^tcZj(&A@lI}6r0H1>`UiqYM|l>WPB9Oj%_V6wR2~8xep(uY8a9XN{`0Wb02*Ox zSR3`+&~sv=o)doo=Mg~Glb8U{>7o4*(ANNZv_G#&r_aYt7m(EiQqQN;?4N+HA*l?L z^m+Zd^CLj-CyDdxfAsv?4Ri+}kMqm=A3eeJ#CkzbtdR>aD*-k6{gN}+^s=p9M8lrT zTH6k};8A}UJfF7%1WDH?l=uhHY676=YOteNK}JDVpGuw&>bU^blgEt(V3m@^1LV~p zU!_?*(&vBBxR5L!o9)w;5 z1WDKPywf6_eFHEeIM08KX}UGCcx}!Mx5ohDoL4nDiQCSTS*Y%Wv9}_<$<|Yy+^sS0 z)8KZ=(i~`VYR`}HUI*`^^rg_$Cog9qkfng=LRZ2X71TT1Mi?_S`OtT!aIl?&?kC}` z)a5i^3%%(35-Xe3Mo% z^`-ZI_kw#509P}<6_zJLcC6-3&TZ*$(JSZYMks6mUMgCjf)D_>j%onUk1RjQ1bu?0akk&s5nCJldd(yH=)f9P zzyw_(VwSoZGvrb862nO_bR0k@=SEbn1_UXfld~DvMu1MvTVlZ7Cg|k+2<~nGucJn! z;qkvv#3mXd!r?1sSbXl)yN~*(V$TZ5>W0aFpI$iT0i6TT{n#xQW*MURvwskjbw6GV ziE{xu)Q3>H84#q94mJ5S+zUa`p`I*80uqA`bvPsj18{|0FMOzFr_2NKSpKh8>$+7Ogee{L@^0n_dg)HFR9SG5&2#r4+HR z@#`_&WRFXAU(i%XK8FNd&Gou7S6A^*(N;%>LQ=0d zT~EiV4hWL2SDZ6}l>%`7aFuBBys+rDIAkHzkrRD3a@gZ>jH3UEL(1c%n!X*!a8*^W zDHxrXvjN4z&ZA>oRyp4oKm1t?m&5Qdy2=PV#f&N&A~NoHL|!N{&d5)HuF?|Z6l&**RW zd%k|2(|t~zP^V6XTeoiAYPpKu2x_yWsFCuT%o8AX0_6HPO0IuLK^|ffCzEH$H7~vz zvm8Jz+{%r~=AB$WP(1+6wsOA@K9H49^A0Az*>Vpy2O_fos#$j{2j}E7+R81GTdI|i zIa}oRTe)H@x7Ny?C3i^cAafbzvdR$IO3Pa#H#(bS zAaWN#W}nwtDHw!3JNtYS-2F798uAk5SdVlX^U5$j(hzkZm#Z%!|2ZI$=}DtqAc(3V zuT*DwiD@jK=JB~Wyq+d_)%p$UCjoNRieSDN0?1XX29P`^Tx9K-s}|3o<%$DGi^*Ko zIAPg1^~YjfHhNN6RyWFEr2)-yb)zki)+7{&K0tZ_LjSRIO?NS=mD*Bu+Msi}H35Eb1x>l@%4SCYQ~(T(d;SasYUK{kVVxhk;71#L#Ms#kLX+g%iJp+ggUZD)LgUPz1h9ACtTx2f5;XnK8vA-la?epy`r+Trx zZ~C&VVyJqX$k>%j#)npAS3@qN8nN9*tmAnU+saE7jczTW(Slj?rvPtKWptZJ_o$1G z;k&t*J)>AMzNLuw#whvaG;;~(iZpYHm@&RxQq9bz)y%9DGYHNTRGlx5@{W!A^Q$?! zKy+GiI>~vmZ<+Ks)soXeNmwCWOSR;zQW924A5uMpI9ECivats!u}o}4%w}9^RXoO< zcyuzyBC!IvpDt;SMUtAb$0D)nllE97T2q})L7Q+(D8pW0bV{`7$gxNznj@FdDbYrU zadrzRvo5Vuptpif+M|>vr*#UfPCg>#AI|*wSgAnHb{ei5u*N1#m=Bi7CFPu_;rb~I z@yTqshIBq*Ra3lI-&^r@*4}_t^t?5o72V;h@2xgq?sqYumG^qQ+Bga(lnxz1>O^@5 z{z?c&VDQueeA&kFQ1hn#TAN zQNqX9qJ8DDLm={fd@b77EaNzcVpTvdsqW%F7CzFdq|u6`S;jh#L5nW6EaMh3j)8ua z41Ov9kN9d!)c+*DnlLL-QU3RVMpy)2bGH%jDSR#3*RFu=0#(bm_#^f${zEW=T0M*= zR)>*lhH-_*lqy&G+XHXQgsBl8fRIsEvp0xoJOE(`kUA6aMG$#BI+6nrV)$1d^rU$( z!D>{UcmM)1U#Gpugk=hK;sFT65@-XkoY^YB1C(;F1KvD7F!4JGAIIbPpfDSU^0Dag z!Erwrq0CuR&rrji&goHFI#inItbh@a{b&(`oJ z_jClQU3_HX91y;D$Q>2?CvfG<#!XE8wAlS1LcXgJvH0lNJ`f4t_t1%-9{UkQzON_6 z&WMGfTI}nAqQ=L>N16W zHynyjNPGrHCf_2BPqbCi9-~NnQiKd&Ciim0r$mpzwM#Pj9~AMa87#s2OfKierwOsq zcNt?cU5Kr|55bSmkUG81#{*mAvvN+t+P%IVXs7YnlFv?GU+T;i;xQj4MJhf|>h!71 z>9D+@*oC(*n95!#jQyr1)0DK#HOkNbhVrw*{iVPnEL41vTLC=xCVV9lp-?B7@x6o! zOk`#}id@j+k&=ifp93CJ+1a3G@H7dxMf@0&vb!Ncy38aXGrLnIw>7eG-S+jjBS}i` zc8L8-j*siRZbu=skC%71Qx=CsM?&Xzjtqy2t8(Q$3HOxxAEzyJ%?uzM)6_VVj*OF=qDD!DmQ}gB;5h^XQeF+ z%&c8yVUQ3ZV_~pZNEi!4#6nU<_+Mtpg>nAzbQ6v?W+-DHRgpuWlZ)aT$lFGqdClKp(S&MwAO6%RIdoEcvSuG5{0@GV{StE4HC3%_f`~|JDS&ZEKq1iQg zR^lU+LI$(s3fprY2Pb*98O(eMu#@Lxu=6IQx{@m;hx|-#I8UyUA{P7d;BInlqzL(x z$!M57PsE!0W}yKm&#%F3+A05W{P^eLE5iJf7r4Y{UkmLZ-iSrY)q&b*ioNbZeyUe1 zpt@Hpl)+JvMX;TGFvfwPbAIyG@EKtG_!q&+*J{WWClmiyo7^vW$jARUP98{7I-%y| zCtvno2>E_Xrz}*jM;ig1djVa3Gl#1E@Sm55lFV3j9-4eI?1NPklV@#AUS>Ye3*qza zr6(`cq*TbqcWILQgh==rp^B1+gLExl`h4;|srKf+39y}fU#h*GkJXVpk_y8>S6@96 zA4=u)#b1q}WBJ*#&1LW^geQ5_rSI8U5YN2|foY!nIk6Um?>z`7f63sVuAz z8Po~pkmSrEq-&S4vG-^qZPD^m^O)|P!hS=Ggl~+RtkHVR!l3O5LsDmkp z9ZIqr6l>`RN0RIYb+k0UwDAtG#Zqfi>u6*@_rt)*xjdY>0P9hLlf*_P|4B@Ovj!d_~G5DDLTEbmAm@_kRB_EMvSDE9H~ z;?!wEl=%W^-Ko)u7ht)$YQi6L31NLG$*^--YK}jOe&OSIotj&d1Ge&g#^}t;odHI| z$NgEU`9kFT_~%Ng1yb?FDz_91Tg|gNB`D}SBMY6NbMivmm6>5Ft4o~cg@k;(r_VYi zt2-D8-!O`G6(Zla8wRqv31Oz1S>2_sFx8}2e*SZnzcIhs;w!?7T572)SB6s9$;UgF zk3lYT&a@RcTTfI~=JH8%RaP@0Legfkn&(j}q5Qm+i%>JGg-blQMGi|)k!T1F|67sB>FiAh|t%p4(==P+s}7N{CkM;=%WZLBCChX znB`XF!j-IEi4VcZoViqG^^Ou%z9I_sF@vFR3SI4+pq+&8K_T)eoZ zZ+R=&lakCR>`v6vVGB>=`LBz~E2Er9H^D8lD_<-Hrgr#hgD>Uh^v*ALS6E|ECBLEs z+4sp)xiJ*tAz$u9VpLRq4pwc+DH##QR+OJInXs08+Au;TkDxs|?c_hq>SaL{j;A$JM0?qB_|8yWGcVOT?5Ymhg?{+%|%v@tB-c$!#b^ zZWBqBS8|y@HYXrPxveC%g(vHZtu8ImCkL5q`gkl=vH)iCmS(WvlbI^c@kyA|ui$5mVFi3c-v1)MDv?*0 zUZ|lF#<|a^CDA0N{2YZAa)s(q#%4_U#{8gi z3MwdL(i8|ZB{~x;nG*pSOP3?5D~GvjK>h;|+B6(bC9DChDsZK8esk+6XgRyUdIK^C z0M6YYJ_7O~AbP8(fPDu1e+S(amiV^(UXP)A(9$1ntP?HG0PA}wehUbb6IhHCXDu8i zsFbJ28aK}nX!Y+WnEKB_h$_B;%=c~zjiBVv1Bc_YXCA} z_iMK=ud|&&wg+(2Dbj`?z|UyVBLErvALXyznQXvIKrdh#?^?fhm$p!N90K|ufM!dO z%{Q(LLR}kLC+@~rW1rX{9Nd?T)o1)*`;?q=iGR`sH5w&Y0Li1K1nZwRFGp6yV zvZL;Nj%cGm4`K`jGd~6<(5IaH#dXs@53|dj68zn4b58*=_)O{*v33o-YGA2Oyrmok-7L1HBKB0mol*7e0qN`2ysp0IA@8uG|%*EBIwonBe&+AV3QEib*R1 zT@w&GeKFW!E5ZJ6EkOl0St%Bpf5@92 zLuAJiwxOcd-?uUny2aNZs!n%T#^-x)G1cB5Eu9}-xw^yzue<5=L*Yty0E5@vbov`W zZU9K|x|>e_2IzehW3%sWI(_a1co4}nw*Bs=)8B=(s{wJGdeOtp+KQqzpE6nXbh9{> zb~mhFlUE;A*2_(C0@>+8-01+aW-Z0jAvg62E_K&}KA&mW3GVc9WxCSiBE$`lcQ%UF z*OjUII?(4ZZ6uq3se_L}zs0n3&{z7oS?t)CUyR*ffV_2RQT^Q{tG)guun)+~MnL%7w8>;tcA)MXw1C@@)?Q^gt7 z22()R;%O+`VB_DJNLT`B%3ZWqpd!NV#Kz-c6v_Ob8|PV9Uv`J7v3BE7h6ix_lQ$bd z9Ouf4!4@cA2^h+Mw~fo$B9@~PXWVKOITKLrmO#5U+FsrZaD9`}{tlX70zx|mVhfHH z$2(jQb+)(#Ct=gs1y<@GXj1^S^c7GCtzejL;^S;~V+}q5qrqW(!P?a*h?BO~m)6d3 z!{d3Cd;+X8SgHqb?gKFpNM8~+fmjS=E+9;uz&@mG0(B)IpEeKPWeTLzSP}EXr-hrX zX`V**L;O{MnEw#SzezCTAAx)i=tj$_AFZ{o5gzoRu$w<{vKYhlC+rSvVyb}yaHNBa z0XXb-wN-*xvFxg3n2SbW-fCHBVJ_2bJnq%|f~h z>(1~Xbm=JwMY^n88Nd78SVP=zJGX)rz6=fkoPU9+38V%fOtHX&NNEbHF(9-TgNtXz zr|zejq>g;RI2{736J$C7qAR?taN!9RD>bY>xaZkKCyk*b^2ycCKnM(i>HvV#6~uTT zV@b3Eu@K0706tQbws(5f_AGsP*i9bxigGT*R#A^d*#=}2AWShS${tXU1EeUP8J~LB z7UiEb!=fC9%-aA}ldgBS`8nz<2I~{UTli_PG9UnQ;oN z>marsP=j)BSvjTJKrYZOTSOiL`vCxqvHLx+!;4FA8oSu7v9%Dt>{-u3>S=)VxkEq> zl3;KA63FL(Fme0l5+AC#k*Fn4(IC zgU$zc8xO|p{dUjYGwAMeH|xzJ{PNVBa=1_eaQc8a3&>m&oj^Pcl-B0dX;qRU|G2@feW%0b!~H?nKHL zpgsizc7ljqiHRs6r)Xf6{gAqe_ODL0rTtFew1-GDfYThrd>~T+VM+!1A!Qq=e*yv{ zK)eRzML_5>5T45!>N%S1ufv(NSqav6kogi2Y-fA^bMWV6ZBs3Bex`1vQk$wV8T2)X zcB!^ks1n#RLm5s#wP~_bg>Tm3(}LY%dwMkRFkFx1qpy#hO>fvOlIsy{K=eLO9JgP6 zk=HktzC!X6!_oZo05$?|$?{N975u>F|2>NKl=aJ;0t#26(X`dHhBWcMw#_)|J;cYE z=H{GVj9)hKI`F0lAWghAkO~rP;{Aa10fea|O?*74QGnoBYmW`MH!S_7od#D}E<3oUBT?gbcfC_H07a*=7 zd<|LJ=l{jx;y1qP;)l$FUF_&U$^1Hhk(^sivb_p=sH>Hfe=oEbN1VU67WET6 z$M#*WZ;Tc>smb6~Hl4M$yn0S-KtXQ+;*HG}mdo_UHcIqwXLYTxJF%L79aV6l5Z=SZlrH^969fP2}HyY|T; zkieA&x$vVaC)URu0B*)YZVTRw-Mb!BW&m#h!c{i_5px6JZ0IW4E`$>PxzkRtLIY1h zXM4(6cGQoYht_j56vlREHdx6G7%BnII1uGP8Uex-3!I6R0igN;LYxg8vJT=e9(m{0 zM8}TS#V@BY;~{efpaG{aa{W99)R_QPlQ(Ujr&SA}+Ej-d@O}-S{5W#?!E$|RjF%pM z>bv2EbhQFf*TLE~0H+khEkJG}Q4_=?Kpp}Fx`KEf$g_ZG(w3TSOm6ITbL7X)ev`*Z zV_s)3bi?;CKQ2AJ1tV|JDp#G30XYg#!56Hv&tR9-YmiNw$9W1W=$U2%KUtlt+hG11 zc6Zs9s`?b#8%wtxX3(fJ*pdCY!A_RJ7CziC!fshpZxa3Y7M@{RxL4sgR=D~dt28(^ z32AV7Dw}O;_){sIXyYVoNoGo@+2HClFb(c!rx_dEe^B6W0a<8pzc_No+3qUL)Bw`d zT0lJPZnaG<*xlNTG(@~?i8jm(sMJ}Ok-k6p-=+E0`~{Y0)Akr~wwHwCk7BJ!WyKDZs~0Ll$5GJe>hx0X{JW*aY%gKwlmn{;4BNXU>MHGRNC!?YZhc z_LJ|O@Q27uCUESY@K+KH9JQ8DaX zjXQlv%H;7WE2q^*kn@byfk+Vmjc>kJ;yCX2V4|w=ZJ4Tpw|UvL!#pO>Fj^Zl%cBfYnPeWz3Iq;UkBt^4q)uwGO=3*auz@;zZ~ND%W1Fj9qSn@|3j0v zE0y2QGX8&5{@bSVJ)5@jnUPd}w#ufD-M2e<$H^(S1=zvB;G-*iKo&rFnG_?YJ zQt>WKm`YK7F1G2Z#u(yEy7cg_k6H%1zSr&5@}eYi-|EQPQt^GJc7~-}_Q^)3a9f@B zEZo`1dNH8yW7+U4-HcgTH=45E2JTishy&F+Yfr07a*@j;PWX8Q%Xt^9*CF#NzwGos?N1Y0LZAC1QKUL zK8x4U8gSBB4z=;Q%?Zz=0Y4&H4EfrCU|%cF@{I;J?Is7})KJT{F_vj_u)lSlPns_K ziwe8XT+96&oojoVtAd%<)Hqbv?rP~?G5Iv>jcVzWt^5(ZE%HTGdSa1Hmu}dqaW)FH z(P85#M56`TjTMU(LohlxYpw8xutWgOdtDpT0y>z%xiwI)XsUb)$T5Jv9iY?6 zk!QB_SAu^jpxOYg>@}%fCE7+0@Ry?s<<`BsTyxM(~EodCh ziEDyi&LQrHxjO+ehjk;BXF6 z4x|YQ-ivnz(h*?h5(CmEj_0BrSd`#gVhH$yC}ZaolhXcr7=eT7R*|(U+EZGxrh1KLkWy^m2nEp<=sS^SVvM z#;LrjHI5%3{~bW$>c1XK#Q=$G9*`UWJ|VWQg%5glT$l%u5l-yVa{O)vs|;fG0AX?h zcOaz~s8axeogiidnM&e05Elcv5YYa05EXfNRt_tHH$ZGe>NSAG7Ms&fbR88uU@6{p zw16ynGX9BDmH@-&j^l8F5GTfZNWQPV&B1_$_LSsUF;Z5#Xdi{08Jl5&;mkH=+swVd?~$Af+3qj(|X0 z5YvH-C(#4MCLrrb3<2>mkdH`=0r5MK??}u5(d(axEg-N2#05Ym1J1k(#GFTshtenK zTX(gRvvF%U;p5HV6#Hc4U(g0fpKJuA0U%5<>686I^#(|v+>kEyKfq_7e41w1CnrN@ zB0$>C5+I96uuq-`WG%q-$ve^}{sj|WpS%YAt0;rEa08sb9lS(yxUdz(b}+U95}R!u zNm~$yE_=ijQmb9iaDLFqQ=uge?S#g|0CDI=AbUyBp+i6p0#y6QVErX19%_LlsmDR^ z*@y&e!A@h?RqxYq(#fv@841|eP(4mtyb;R30Z-ikVTwt>I)G{g5dW^TW*l{rW)QIN zJ^#i)<}`r#w*tsA67=tCAXfrRz;>ifMDwcx_5k?zPzF+5x_-b)`BWjKQcjKxC$B)_ zMSvMj$dTdXD_#H=itUe7{vIN_!R7ZBZTGvYNgJ)At1_OT`M@Rm$- zA)gJ95|#p~Pl6?E52P)CA9=37#x_>1dclBG+wo_m5I`a-TZAWV+T1x^DsQnd3w z9E7{QU0xgTuyee*kdr(_Gyj3qVkk@nINyP|8_4Z|KzK0ryaIWaL>7q9CUhx#JBKm;euX0@}~Axn=V(szwfmOmf6s7vY&~e6Bfem z3+b`;@At09utbNaK}Wo&LBWC5^ap$Tzx+>qzqw(k(w|dJ{|Zn4p8u);>)-NEt+x6M z6HEX1%0Tb>4AaeGTW@$@++vs}%V(q$3$;cI(&)XfqxI|uI6p$=Lm>ZVbLwU_XujGM z;)P+jAlUfhLd5>k!>Q;=TZh5=0jggE!sG-#LQ39d^ko2A_X&_a(|v6vbr(3vyQ!Op zmdyY0Yz1(lAO-^&Na9Z@O#(6wkQ!>WFCAsdy&C@?jVAzWWzFK6bH|&)sbF(^@#U=g zdDu6FP{DzA{Aaxfa3Pg?zxsd1eVM5@Z{n#+-?RD!Mwhdy(#bYZKqCoV+}oL}2QhTd)(5twa%*S%zsgD+|{*En5-en5{d9wLH0x^U3}@ zTAu7T1-uInsyg8cd0Jk}(L;G1mBM_YbE*}_ zQY;*EPB=xpQBY=WleXk$y{5`$$xiKvqQ0!zUZjvOYgt@iQC=}cQKznHNFkJb=t8ZUVBE1m_e_0NDjFv!++lCRV|OH_iM2{C6mWjJTZqww3a! zE1A(^9p1%^c)#}(#C`zC{a)Zk+?oL7elH(LE+9-Dx#=qfRUZ)j!7IOaLEu8N2~FZA z(+V85g;_1p8E1FIFK6H#pxO!`p_vS1JRnRl3C($+Rstk6tUwkx+Tb*a^Ulm+J7x%$T7{ zZbu&kNT})nDI&pJ;|d@x0AcD#sJesd3WzSLmQ8xiU5(^km+LGmBDrH`uA`kWhppP} zB3oy+ri<|f9a^DtTR}>;&J05aLjcC}*Q}tcTr_p(Y#rM|L3%y|LQ??Z`2|2$lc49@ zfouVUsUx0025KiD`uTtLJpU5RD`(tnD!B^Fv1M4P!;L$`_O+0D16B?IT5wvqz^dpp z7PBh)cYiKbIK?~)@gvN9r6-Qs!E6oh1lWW{r<%^mM2X`0mf_9j*Xm)g_V*~R_w1=0 z2IpLzdp7gr2BdG1-!}mB={!YRxOm1sKQW=f%xgn z+gEJ}lTdnE)kE25vz6jT>MLOb-9naT6SrH2S)=QI@t?G73-bPb~V>iWdgMrwL25Q-IPk7$`>Pd zfZPJ8d096+(y#`!D#82)XXQEfBlRP&4+BQs3c{(xSK-ZQzW`a=4_J>K)fP(5&wg3{ z9}IS1Ph_GMK@vo~XEL+Fo(bS*<#6i$F1za0|0xE2tIGx6-&->T=R)aBKwT8W`F#jq z_S^~bZa@u+`qIVtk|F<3#wZrUq5I!K<~Tr#(c~6P6aZ3;Hde_|x>_;Dfqj}Mvfhed zaH&>|6=0tU;HT&fX85VphJF(H#pv~?;&qJPek$G;|3In|Z!@Q%Hm7CjoOVI0E?xw6-adsH-HS|a2h`?!b+rz14zFAklDig}R^t+ftKNIS%$h(j;7WP~On zlQWpPMCip1bm%=L1Ym6p#RnPq2mSLhX6xDO5RL?Ue8ciLOyRPIT_u8y< z=gwYy7iAN2`6qKa6^-XEo70KaZP428mb;tB!F&kNh7ItZd|Lek6xdNQXZO9Z5CL^#BDV;#I0tB{$m;q!GiF-g?4&*$*s@))RP8n8Z*RLkf z?)=2;UijgknLP%%T>xh&#elp72vaIB6Dh|*9R=iYTbActQ1Oql^ngTwR=C_2*n$2H zh`!+!02jy*CX+QHF!FCNQC&#AA%3SNQu83618^FECMJVS66)J=d@4kwgi8?Pk?9gD4n4~w8(G5j;3OcL32-g|Q39kG5FP9J1V?4hmK)iR z9+Ja}Upw2v9hF5}m09iB&N$htfNC>S z!vaB;?~f=XW6>i@s}Mb`?O@ zd#?a;IY0#;wGE%Iu+@UB3~wh^tDt9fW(s}SFk~@vg7u8Ew}Cc&6)Jd@O_vd=V-sjO z+hdv|hFr?Fx8X?A2xH2vGR&x=CwM8FU6aZBS&D%-y9?i}XvCpsjto7GKSP+Dxw6*M zn6K|Ta|`(j=xSLgxk0Pb`oPTCBb!avf=}|%l^o}5PX*zOZFm4bTTt2?0Co9FtuwYg z({_P=7*K)tk|&JiotJm_haFco|en z0JWdsym3&+W*F{I2R(#ouA~iO+6K@U0~*b3fp;}zyG^6HErH5g&pBN7yxuy1AhOuQ zA{~&Ita|Q+;*)?d8M5l>yAxqT3c4OupS7x5T|?F3k!7ChJP1w!gvk)qdqMpRfQI61 zH4(dN6sR*w*b2I3vQ+CWqbbGk(UnsNc;)U^mlD3a@CB&51bkc9XHHYPk6AlY<$Tvix7E4b!Qsa3T6}*V2^CC;&r-Ub&LXPH7sEB( z#N@@-cqFeTx&iZ2<&7|H);T(huXVpbJ6%meBNEEb_p4gfU{a>$Lm0!()J@11OPRWz zSUO`rf}{TwL+dx0hIk;Q6%ad_1` zDu_4ci~0I?V{D?}d3?`b74a<)z0Mfp{(LdEuAs`;x_VW{)-@AjeC1zXA!C>^e5Dvx zYZfQL7%Rq}vR#(vo$;e9e;jISbgUG57^mpv`=x$3=Kzz;RH| z0>-?LJjY9nr`?BZIiL-qKE4&zE(UczK-S0o!_d3jq4rT)y95fmaR{VYF^i;PZiHwh zU<@m0k<`!QAa?`8bs^3wI7`l1z)-->=9R@&ud?LhYrg@5&SG$0h0aUVBO|Z|DPMv* z27oFjv$eNDR6d_kb(+6Dq97C6?E5hQ17y0_8b}KgobC+=G8iD!J%Nfzd{;6#5x5d4`&9(?xJT@zQPN zZo2U^NeH%;?yCH!(Gi}2>5j{70o>*D$QVu~8&^8Wk3J|zi;d4h8F7V=!r@>~%uf_A za4{Y;8N}KdXyEgS(?s#9Pz25+Ee5NxJV4Sfr+sjmRLpZT{RR3B3i3Ql;H{8-@!786 zG+>TP^$pH;c~cPMfvLX1B?rhUD#DkqcMb`ct;leDH()|Bd!?^;OR-TjEd-*Ak>ssi zaqlP-8jx!wyRdW)(yz|YCzy|5PN~_0kq!>q9O|-5DUBj;wz+n3<$gdBK{!y7CF_LrC2SGZSQ(a=j-gHDi1>y%SV6jZ!-cJv-5R^fsO#xgH64g)p62T zo~QGpx&0jk*#VSSFg0>9kDlKBu88~|Z*h~>1l&gn|t&N*LzwFiDZ4hZ}V;yoaT05z%fAFG7NN{H6WIw0~V z!Tuf)W@0xgjmWWke5E~L{YQJp)=uESqyZDW^J~?XMi@?%4s}3kmjxIKGH{TdoK1TX zhY9oPJS`?1*Fxp_F+-bxsI7BwB$vnG;>fX*I9y%L*x@J${fxY;u z`#8Q}nupF7F(Jw$Rzq{M?qj++Vzrp*KLP5~QcwjH3R#y4-2zmvt3h`U`j}^;nVthnh3S_I+Hkg_LwFZy#e!9T` zj+hOKkP<==d{5`nBRL*4%9C-!`B_V#6XnUc;TqW&5x*N5g$uH;BF>X>!!@%v6F)l- z)pCYJB419)bsHsk__Cj;5g?yo#^7L<9Zs z)q`1y3O0WNjj{-CbN4|+y636*a@!T0iS&FqiZ(hh@dXI~FR&3E6z+^4bJA0EaC`vp zP>e^>Mu!L|5#v#`(V=NM0&!cFgr^U8`2>E#wZFF>O7l?%adt?(mJ@!6`d_Rw(jh+$v7DTb1 zN6|*d#3Ha$=I2qg(XkTd<|cCIL&zsz43`ZbkIfA*dkHSHGa{xs)_DwOZ5WJ!3f$r` z=!Rh|LL`0FEI;Xq&^ZxNfumj;eKcwk;J{B{L>Z0fI9CJDmosRi6A}j?7~{E!(TTP$ z{x=7f^Y@)bc`M>{rs&X-c~K z8Ws2icz`t>hy#nVP|-zhP2jzFtgNp^oSql`js(%Ig$VTKFro70SXp2D`s0x#h4FQW zody4te-`T8*HH-V=iJZNDU0KoBhm16j>Mqis(d+C)^|$%t!WEgGkHFzwa`rn$5`kt z7EC;Gq%ke{RlXc6>+4njXxc*W%=J|k`Uv4O7W#^Xkny3PSO}|pIaby;png4s*_2{n zW@VLyK|+L#g~4JWVJr+03rSVy2aH=8bGWXodcug01E-IT#x&qMJbEqTr%c9i0{Jow zkgw`oi(xCaJkExBHd*6P5k5Isx6XnbOfQyZQ105amJA*hS0gPkq%KdW4e;o`z(geU z;lX0@Ua^<|A}nLJ8FT71L>>Bm^3&p%6k?tF-T)(OwdsL}afDjq(X;cLDEWn)tqG%W9v;cPj zh~7Xt0ZLbZ;IT^Xg+SIIWf8#L0OCC$?*M{#)`QJMp6^rXyUzR%`i0&L&Q}om44@we zk=%_&00>daeFG_tL6rjB_d)ak(v8HYAcg}O3Mk)NAALA&e>pTi3G3ZRoCNL!fW8mJ zQXumIAqu#Ak+K2QIzV``Rc5<)FcV*cZyW{T;I#>}s;`2T4bY;FnKC%)BAEDH$8JT1 z>LatVONvg`@B2Xm46M4$e@>^#|zpK&%0> z3Q+47&jURovP6Z7>xGINRG`wzeuUKLmWeeL7(1#9bqWPr54|gBC;(y`kS#RyP1+ES z$wRfs^D|W=fJjE)_e$wuwzgEUlbnVjKxaYfK3KU2(2P~+3Hs8Qr?S8=HTe`Ip8!Zr zz6s=Y60FH%K#l^W62AxXEkG*qQtO9b?Uza%#jIJ0?&ClRti&uJNfNBYQXusKDzleW zmieM-XXQt|a(z^Y5zUFk*+bdR+CilaK)f3SWB>_zHy+4XK!_^h;(SnZ0pj9a)}*U` z0>7W18&|}|)sR>T5EriiaybdQcq5Rl02Q8NmH*Pt5*hCpFZo_~IUHmQT#4^ta>!cY zO3UtVSU9I)Re;rpco)`t*Qidc##4!QHuZtJ81t;b<;ebne;aA0GZUntQND=|-1o5I zXq8bLvvMbO5Ni4xa2|l;_pu}&gLnqW9zcjv?r%tW9n^jR>>Nf5pKfz@RBcF{>m=H9 zQRz51Uqk2^RmpI_LrT3Ta8eJz{R6~YAZL(>)I?hbvWrAEh);pM3n;A(LdM5NK-xTs z$3y_P4Tvp3)&Xj8{90yR&}nP{-NWZv9ey4+7&4&!0Pzz58PGDGf?og`%NhVF288dn zhP<(CHDYGRvNa0jWiLqBh-%fbHn!#JoW)!)V*~336Q=;AfsFz(f&?4b3?S10A*x6N zI}_A0fHbh%tw|T>x3htrL5u7Imq6kofHbgw0=b?98`xby?f~E)u&lCeV7?8%tO_7q ze0?|F8CJmXHXN%RhdzCM0=ka@#Md`~93UZG706LQh$`ai51_sSh_91AGR?-P)`_nH zTBNVOJ!oM7@iiMriUfTv1JVGX!bMj3zxle#@*K4thHucZmpotFL$@uB@d7az$UqYG zbpnuafDl#0*9D;F0mRo|tw~osBEH`5`ML%Ys{rEbl|a^!ps(A3Yy+t9p8xJ^;v?He z*mb{xL9~#-hPA5$EwRttcHg0P*o~nlpwoHXH?ZN7)q%Q>N?c<3?3DG53_E76r@S%Q z>cEX)Z4`6t2Sb3uL-h*EG1o~hDzJ}0Df7>i5p9w}^D0T(t^Ff>iWFd(;Aa((%1ca#JUWt@bpTTSbP$>;>`+Kt*UQ{GnIUND;>6tcyJZ zM8EbFmZx59LD z`qrE#o70pj&_!t9CHBTPh%hrNzh1VAngIh*rv2G5A%$T%KyD>LW4nPo0x-t* zrHy%*XY91xcRgcoLi}~=)7Wt!pOB!jUxEAtFvgCijd_@7?DX6+HZcY|>p5J+0b;Ba zNPQAC)*eV}fXe*XRw8dztZlDeeageoPvtYq|CnccIJAe-oP-d_OcJ!c3djmTxYOU- z#}c*=yqM%Q5J5+W-FD^U#k!+Umsw#sM}1G(QBBZ%=9u|TCCpyKd^j+@2xJcl4otrS z`3?}GvLq9gqu2aA0~I$bA5uqHdKr zh=y;r1aHK6eP3cClX${j-Fx6#c?qoBYkzpJo%Y^g?w$R!SX zP1s%A+=K&$gCh{nrs=_G8hj79_^$=HI1QZN;NG`@5E5qLgvfXp&Gmi44m-c>vmwRKENbvkKFH#tOfg(Tk_<7Z;w;L`@M@`^ejM4K2_S| zwBY^h>!6=!8rMUhN`u8O;0;qi>jN5tr4#1O=WNiE0d2VH=3VEGgJ#$W9%_JXDsLGA zRg7HsIpxc9k@;ufTnCM-03kBm?~(E_s5=2I5~bLFU=?xYmX8ZPHwTPkkT?oZEn0$_ zX*0v1FCXp%a4W$05hCAH&z^dx5vWeFGqU<8vU#Nw9DH2IM3l^eVIEU0w7gv}AzvjdFX7?N^_H-_JjT zd9rWRghUO1^o_ARdj zF&|6g!x;cSy7Dpv7wZgnId$3Y#v+%&fRf+QuM%M8&QcFMsm>7Hgyic1W%re0ecIZ= z2*#f%X7lYM$tX^(Un{)sflI3bxvO{`$hI46_C4F zUE!pt(gRd`fOMbRoEzV?-G}$4KX_TIX7Fyk6K(=)a(}u28uI{hf4UaPYCx?VtBldf z-k%;qY-p*%a&RKN#rT|npN&rZT+ixy7`ei;x)sP~TJ2iRYI~UjAb2!-u4Q0N67Fqs z3io-2?uFjno}oQJo}{4*su@b(K4&(tsnU$@vIK`GG)R1Rl0mB>Zg3hc22r0e%bK!m zvFhw(bCDD$5_fTA8MiIZ7j6&1YJ+U?tFXf~Syzp!A{uJg1a`lc69&0J0lQ!8^0eJ= zw6V+e`4d{!XOYLZTJorO4EDa$vIJaj9?X2NWt~?}LjPW8vE{0UFJMS`Q|$AO4))*F z4aNSXWoN0kw5%D|tB&456G$5CO!XF9U4!zN!`!a2ziW{#sgZdX!coj*Qyx#`>5TIlPir5}a zr`>Y=!Cu|~7{Hl0D-%0kG2ZZ&fCB?Bw)SrR_)1myxn-xI36^ie3o8RE{Q2ufiL(oH zb!Jm-h3jJ2U1+bv$nqOh$S0V1x8s$rM5kCzcf*O5r#^?+=n`Fs8*K3+cPgH*Wpf31 z+$-402?%nL?3b5KHi!;9Ypi1*zzZ2qS3~4%fQ+Zt0lA6<$J4uk+ztr;$10aJGCs1F#2Fq~oev^@t#+Jh~emd%$iwj|z_npte?9H^e4wB$y;W&^_ z0CGk68OV3lK-I01v1;X29DFWsgw6WTH^f`M7{t>yq(ve2#|PZ0Z9Tv zRFR<91yu(iL4U=X^s9ps^y_JnL9c*B3xEW@2as+g81&PCj0C9g8ms)*pyLl3UK;|o zc@8576mwVBKW#x7I?S_cjj}>gTjtEmLLmnr zWmx0|LG6a%5?h90U=IOE8Kwi7N`hrL6UZ_^h~iR)i$ProkTU#a&AI9z`2GCTkh7HG zdPrOgkTTo~NDy%=_hmU=rG69mO17!Vi zEs(PTvi`UU$Ugz$PppmqvHpmWmecYE=>g2c&NmsUH9A&|>w`?uAArI80J3!N3Hs8? zo{F8WKLg1<0I9G;Kn{{%g?$F(Q-IXfNgzK1q^@qVeqg39?Jdcy+4I7$qq_s7u4(|u zBf+|A3ZyYWWlpR%++kIFuf5WAf{kkZ3D+7`SZK$c;njF5(bJ}K5pA~Na1kvLv~y5) zuxrxkRoB+byx}S{+e*r%F?^fvJ8gK8b6FY1Myd^&aEEGTN z?yMSX{&HLHgnpB|a!(ttr`a}>zN0_wf2g_leQD~ zCCql1GVr4-Z$Q6kzeL?w!uxk_!u%F7>hK_l8=GLtp~fPqFQCJiFp@e`{2`Dx0~#;H z8wgbU1H=hH#}{L`lx9$^+ncxq0XlX=Np2QzR)JgsXuMqAlK*eW+y`O@Km|CBE4YPj zt}lni;WKZCF8VM=KIM*G`G0*H0mHu zON>U75!9F;(_GZ0^!y4&RWJVoenLzM3TK^ zrt&R|QA)MsDu*Pji1m^Lu8v5;s#t#}oF>G%u^}W>fZIg^+#nLz$}euyD7YWq_{N#M zxvFXZESuko?BG!#kD-NAOuJF zhrJQh+kU%5i)*obZoUDn&}>Exa<{5`Ag>!3j@hjmHoH|Fvp>}_`%@jWHPz99t>^-d z*^U|sxhtq=HkC$+XULvQr%~cH5I*j?Y#jRlsPb{kWs}&?Ktn$6xNI6rz`cZz8!pRZ z4T0zTxZko_Mtk7J%D)(*RMoBVrCb`6G@6h!%lOD+(4MB2W&BRYQhe1TgI~&B%dZ@u zG3FxD$}I;Pq~lI=_d*C{a;K%!uAmEl%x+!8<}mthyg#+-Wrf|X_TM@aw;+K2#yB38 z9OkZ)DXdEQc4so{Eh3LE6)3@1sY8iJJyGLmU?wW7NH~1Qp<3AjZzDLhgv0-;HR7p% zqmAk|fyBpV=;#EC{OHQ8-^gj2MZdi|KgBS?9fbCgeNZGi5`PVyejgy`C#IF>QS0BJ z-v?lj1Em&pMA^`!e1*7-OOrZ+WHzZkSQ`5oT8X+dttH>ImVDD%@=b%vH;pEP`@GpTwTMO0@|DB>Y z77_0ss(m|?1~ZSRYceUc7hkn`6@>%oUC$X8p>jg6=h1$~P)LW(4(JSagvfzBW&*!i z*~p$7wL@`~xwao)19H4=w{t-SczwmT+qw8rfny{F$N#`jC}FqVl9NbO-*yXg5F1vL z`o)2%B)o06AvWI(yX}^E5to8;yluB%fC$)aw_((t3fOJ8B_KipyY03kh(y3{yPXCi zKVY}r^52z<13gekY`eV*L|MRYyS))abCr8LZ2Ew@^2M;ZU*HQ57m#y^*^3CXGa`nY z30fG;+AtUc6)N=@qw*~BO+!e5PZ(s*<#%^5Zvom0K${TUkK68}|X=IX9utBr-yw#~>1T2^E@=nQ;}gRG=~XNk&`_f()smYrxOo z_W4+T)*!GmxP3lWBYProZl8}8VB!y)+vj67Wn2Bg>RWwfr#3rL5{iT9n9A|C`kqQB z7%6P^-Ghu&z;5*=p#yfSZzC`q2{pF*I#6*{jPriLmE&#oeLHQTcP9I*^`VatK4YP;SO^&(`iX@w-bzI2li2E810^@57?}BSm4!h< zgp7s3Vj*EH3=s=Sl_QtAV57uLSP1Yk7i=6m6SxZSIu~pbTMr@>;Ds*OG`55J1bC$j zmdEyj$Pe&R7i^ZnmRxK)5Y=s$qgCltv?6JivC?DEqVxdExRwldt;fmW7aq^yt2WWl z-T0C#bFjI~G7shjF4(T%Wu}+G`^<&$6Tq7)3{b}G?NG*ce$YesZ^7-ag$BpW%&VIq zEqo876>fzKmkzgr0Y_ylLQygwjIr5E+YB9p#hj}k*gW&+#8zkp-a|^}FBv;gb`>~@ z@63}Dfl#0Y^2q!(;{~K80)>cL=5IpeN86I4b^H^silcSOa&-JxP-Utq@0neGsnEUn z9{N1K5;`-e6U-yZ2~cK8*B%2uRZ9*A5iOlG6y;!$8PySv1{p1)G9QY*OC!ZP_j*uAqAl`4)zLEg9FI;VufBQGaUwc_R0Ay$ z`=!Glu+qq|FspBb%$w>|XLu6QxIp5!DTC>pt=7B#wbd_xI5EpZm)P;M%9M% z3!oLOyiC00&>cpK{zOX0{2VP8l%=edT=VotMR{&fW}cx!Q640enXjcKBvi*xP0jd6 zxgM8U%c@{IBGN*9fh5F%D(3(Oszm(3&{aqd)It>E5Bn9&sz6aK5RXJMKsc&sHr4o5 z!Me^Y*Dfo*;u2I^0>Q^Rf@^Oz}@iAuz#rpVm!dJivU-$-m2f}-9Qe5qzs<8-JE6JaC->Q1oa_zAu1pm%Tp@mC@CjZ{9hnd2+>ES3IrTyZ!APJR=QOYr zvQlX0l*UhoDPN!gi83Jqs@4?f=U$sZ&%cA3OGLgpsahYvA%895<>4yf%GY&iDY*)U zZUkL^7i{{AGN?cUz5bVU`HyhXUy#wk3eNh!f~wX>2zA~<$@Wt6#U;TQCneot#9W5; zUruZrB^VV|i+3G)(?xGjS}$E5RkjOuvo|@}ybK)j1XS5e4DB_J=<&oq_i6CW7yb}T zxiNexspr~chnQLI5E5%GLMih86va-IoD0EfUw4x11_u897LM1ZOs$JxB5$?mOb7k< z!i~HY;`#ULjBWUx3%D#TR5eJI9fiwzIa;hdoED(CvBwFzE5WLDKjM`4j|9iNchi!> z|H2bjwT>e)Zk`DFaV;=LZYN)aswB(#FvhK!paM;DJ?H;Jx+$e=BI|T|B5);B1jt%RW<9!wn898UKy{diRmUXkEIQb zejAqrJ=pP6=H8R$UU4(7X8h>N=~z>%IYkY28Z(pBK@5L@BnRoiP6uW;5Oh1Ht(UY> z?J&+h3HoM0VMC-1b)>7ceH$?WG+Z)C4RdPH@NkfW0fn_7Hr$DBr9Sc{8_<+6(L<~<&9@T7?rWUqpa z$WONH?9||sW7u-CaBK(49sSkh=Bgnm_$VjbD+QmQ1*b2Z=?-vqftU|uCLoJa!Tm_N z9@J%k8niOXI-=9q9b|NQi3#sRfV_HwDrd@YfJ`K}rWe!H*S6U2R=<)g%;YPMq(TJGEM&ERYxh za1tQq1DQ+02VxD7Re;C?R(Ehm6L&e#4K;$mGseRO#ct8HEykM?DE}C%BDMOQC0MJ) zC>rZdPLg-=cQjJD3svMTEA+oA_kGLX-O{Uk8_1)U;V2L5ZoSwL&SLGdtzLn0T+V_q zkeh*2l3-hX7|4SF3FLD?o&o$dkZ&U8b$|r2=#L>{-c^evkbY*tKpum{QGf*UcObu# zU?5}fpy2_O|5NKL!=ijOY-8jFw>iu(E-UdpLRY9rr)o?l!H!CuiJBa589I$2tnwM- zgjdj;3m{bs`4uqF)CN$qt&Wq%cq!y(oKyHXb#8=IW5_oI)LHChAr*xJ+}sr7hnJ|% zMZsq~;j^-!_Y^qYq0P@#NNf|0-_B~9SHX@D#WWYbzUtwescn*X=8gxzE5W{C1h$m;)Q>P#yS!=Nmm`A*iI zECxfi9QiB-sMtNA8d)7jJ%+3oI*pG>alyF|GUo&8RCs0)rqF!oH9{rL^b*y}&|B{K zduPM`FmSGe&NTq17l<7|ZYI$l#2z4z10wUR@@XAyYrsD`@Kq=2By*4h8^H0jXYV10 z=}ve)b6^P$!^YbHC1YLZbacOj+__H9jvUBwtosr&#{n`lh2BF`1Y}W4#=1tJY6E1f zTb;JzVGxtgr5Wu#gR>z$6Cei9267fa#ya0RtN%R8Sr78*fjjKRTAJ~q8G9%WsEJ%_ zWvlmb-w>O~UNTe+uz&a#S4*B@lUpfYh3%fq?&`m0_lIp4>FhdM+3MLT-*vW~Z>x`{ zTipULGQPDo_`T8TJ~r7(pT!jlkIxFNQ!?zewuHYCCKb4pr%Nt|?x@Bs|9{NAcbr{C z{r`W@ot=}rHM@K7rjleg2_dvi2uRB&^pZ_z(sly^QWB6Z38ZddLsJnpH2Ek7P{9@u z3kspA*n;I_527NVL5hkP{D9@7{+_S*%(?gOCP6+vzJL7o@i=?WnKR`*?|IL=&3oo- z@%HEOt>|0lpp?rF{Wgq0BzEGonG8x{JFKIfX5%8&)buvho2sR-jA9OGN1=y*^I3vx2qO3 ztb_79nTGW=)+(0)eNcWMHM}d&J1R{;ACx~xKp)QY!AcX*2j^!9=redem21}RZyi8s z552RgBe@}HhIjrku#?9z;_i@UMKH z$B%MNynqyQ7`QdRTseIQn!7ov6M$~br~0O++i53Yn~Xm~Cs$6t%AUu`DsgL`T{-mmw%Kz-o0n77mqpF19<=KaF^UEZ8^-tl&?A&O& zn{V0vf5P+I&br{t+{}D?EVtLc+Og3oGA>7-HYF`W`RmmG3fF!=h=sP-;H9(Q%KG6=AlUnV1FzNhFiho^Im`YZN`SN^dDwGhC z_4mnSCov$`W%Awxh`=we{mDCzb4F%KVzkl&GD410uMJ z%4I594^KyOnM$^Xn`^jCCHt?}Gw`1xb5zN`&fCYithS$VvyrQ)3{@)G=VQrCB@2Y5 zVcVKY_QNvh*&Q6k{vJze_ft2d(7Zr9&vONo{UVmh=dwE(ru}_68NXU(gtEVo|8=g8 z=dvb18Kj+S)pUL-ODx|_jdeVp_+gNa(ZR4y3^bR~!31u`=|Oa`8#lXh)wM(}l+Czc zjOugbW)tbdQ0-dcTuO51LBY=@jSc*mYIg;BmaEYEX;2?GcX1V!%T&7`@bq;qQ|(@f ztS!l9cb_(3ab7lT2V_=Z^YchsE~~JeoAF!~Gd3&f%5|)bb=+P%Om#@Nn?{jcRfnvv z{kWN>2U%Yya&tVFSzimdIg=||U-t)3!DXae!e!Ri;gQH(ZZ%yxclZMns7Th=4di$~ zmyOuRxw%^p8nFkt`65@{*|BUkVsF8WeJx_h^tlzWyv*1aXt&Ip$W)y zj0Wp&j_)&_a|PHkf53zBMLw6^of;9jruOF-A`j)}V6L2hG{P#h zT;jyc&E zFM`gO&Q`v!kne2roN4)P1kx8{z9jcWGSug5zodK*@#ekcxtc3~FAtyM<`a6ji-+~x zJjmt$91EW_lV;6)JS}qkB$wS`G27qglG@*?YJvI$g}=oW%G_2ilig+f?ct<$!o*nS z=j8vH%9z3S_Ohz6kxF;WkDfn?d@|VnNS>FtY!bG;z{qkHmCI)JY@TLt*{t3vjx0KL zyhE7S-+LNfR>P{WkK8M`titQLxsEFsZ2QDgvY>uSehsJb@~s$b2gJP9)LgS5c0=@# z&;t!S2HX3pl1Ig447TH|nmgE%%gt?Ju)Sj|&9Q7AS-K3iCDk?PyP`EqBcGPma(igj z9EZoikL9~UGSqyoD$iH8p2z<)=8nMCyyPYHusGb7?vX6DlBoHc8{B7N+@`2JPnBzXk%@A3VvJ%suRFOqKAXM8GTomdJKch@cA@oS|7hP; z`f<(_>&JzmABR(ZHkb9|!qAT;JYT?N{Wv97fQv5PW&K#5_&ur1`f(@O*K%1u?&sz{ zJ%|^5nVUzsLO+(3YrCx-k5cHzk9qw=u8u3Rw^=`QgxSf~j~~P?el`isa~|!E){m1D zGo)Xl{BvAm7hOt;0~G}`@+Ei+*SL?vG~SW4XsPF9o{#1_=|0kuQ^JaRbF0<~KK7R& zMUwK}L9wT2CA9-P&>e~YTPb`qmr1RAxcQhKB()yn<`FKFTHoX5J6us}{UC_{Uy|~3 zE|Xd>#P(e7FAV9q!~4~Qq}K1r@iLc5t(up)(Iu(X#!Znc=RX+>o78F)_LHcgW*1pl(V@E?#p6BF1H<} z&K-W9+7aAWlB1u?;J%%k59&d1-^CSoN4%7>6RqsYkCf=m#AG+E6CU*L zGuT^dW#yNc8r&K0nDlZj{`25>nRE*;c20_xN!H&kNzod}o$~fk!b|WXwf`Z^oe}wL zcHXk9&CVp5E|4E*@Yi#-Og3A4Z-iNHGtVz_O}vct`Fzr*5^l|deS6JmXYTC6i+7*J zw!6&#^M$^~zaV^;#g_89)5unrl%CoNBAWnGhZ?Dc>EyEB!Smjomv_rzX`|)OQA#O{&G*T%rd}s;jtJ z&1LiHW^Qieit{Nh7~W0FN4Y|Sr@fLfp6u>&wZ>n4(zpslSc4Cc|MOhd;5WJXx*pWv zGu%AQWext3n?G<3ZZP+IlxR|I0zVYnbGb{}HG%h46Pm!I$Tfn?Ch&A_I`yCld=NML zan(H*%Vrb!-`O45inZ>SDQ9Hrw5rFZAVV9*wUhAih|BovV8>R+}k!C^nUJWBvoA+`{F%s(M~GZ`(Z-9p?P0u@B-_ zHS?o9)mLfsw#61fGagy zW*D{9>)@-a@h^ow3XEO1%uI<&X8*RBSwra$j1Tg$)x14Eh|bT9)dZ=9qIz<5u`{ZR zT~bx-Lqm%#i!Y5PCa-{dC+`U~@HAOP1MjiWjwXd_B=4DV9s^*XUr62;hH`RVWtN39 z!=ZGQS+Ww*DjZwoCbb9+S>CudtEWbTYV)sX49 z+Gi;IoeA9Dei(ZOpta++7rcl30UsCFVIvS|$1BtAJl)1M=6i^RlV3QBB>g={*%O=p z7r^qr;>CmHxSy-2^kFZO@)w?-ofh(^@}l*Rh&HbLu{=!XrdRB3kwG=0PttEoOjajbTnGd0%BzvXPW25^R zx=FfS$^{7D%ed5)^lAy0KR)KWoAz^46szaA7pV%NO*_EC{PrUh3)r-uy_$S0Ot|TK zrk3A+y7J|wDB{aa)M#kEyGiF@x{39A*R+m&ZsN#KaX(T!7Tv_{HI7ZcU>dlIoyxQQ zCChSda-EWMhklgGhp~52Q4k}wcX3$UyEu6`C5Cm|A@WY<;z;&@k+8F7Qf{)oJTh$G zuwPMx-=yuM!}gtGwNCyV7-74m9-O?&BW=6oKM)bd7ivziNcY?nZMV!HET9w`0Kgoy z7Pea&@Z1~l+HR?Ie!4gwk}jqvi(us}Zqf$G^yK7mo|{B0x+i0kHb8Q308M#-Zl?PP zE3%_QnSByH6GyFArm}`I`@}NZXqnnZOSyVNnXu6^v@<5DBS$DRCY0Gtyz1z&vBXTf03JKxlGcxzDiYGgC+emQg-AzOX^`_n$~Ay?W~_LXU-k| zVbv{7YaaQ!xlGeKlbh4^AWdsAHhN-WkiPXet!rk; zOZ2yxu6gx*Odnz}O^c*&l4Lh|TrQ8YWo%irzpxiz|D9Lw1>}CN;l2|xTJuQXXcee= z`KW-_^4*Q``Dy>ztmyp|yN|1+qUJu%isj42u8PH;t-W2vgyFAHeD4iambh&@oD0Qm|jnX7?ba2@y&E#euJ!q7U z<_B@)q_8|?H6N!%onUlpxZ)z@hhpI{=F+e4j44PF`{RS%dxM0}@#KoB&YnC)70T8D7jG$6;K3wGJC8qwZ zIhu~=*Bl4Gej!4rk>K&?@$pc~`0HZ@0WGpC24c$U@>CE7tMlT&dJsE%lK;vpf#`edtS)n?i?=PilXOKr-_FIC<~pGV=ZsHxKARqJpF`gFpWP?%5S**>ez_Ls_v%vuodz#%cE7jTU!PzySqq8;qTDI*Jd64A1Z&1 ztE7&W)X9=Mw@`dFE615Nv97F!WNuPxJ*;_+4(XCxs>DsJ9@N8KxY>!zIyaM>eYgg9 zZXPLzbL}aK^+s&M<@RhBo3+V%CT~yYvdO!Gn`L^?P2e|ENcd~b=hKZwNm z9%_+iV8*{E{-};&L`_#`V?p+U9hbJqORmFsN>2SW; zQBba7hv$@tKP$Xtd&#(Dx8mEA2M_eekL>A4di{y@DpI#crGImb)@>2WA|?|$56!1w<`FN2>?;mXK+5&un-YU zoJ6#8K6d9kpy-XtsQts+eJ}ettUbdAd^x<0| zJW}7B>OnFpZtrk=7=d+Xz#A6W1RwC4bq30tXKcdeZHE&FI>Im=61;#uvIu6?#iJ@< ziOqoYqsuKb4(dgqk7KHF5r#f=Z-oK%_H1Z69vWs0i<*udR0K+^#>a8xo`+f2@lgK6 z4rb@^N*|nbLPi*%u0`EB(SR-wc~48SeN(aCO&B}j_>nD1Gu)50PMhw9Ty8#m7-Bn# z^|IW_HOcJydOBKR9PbdWROu-dmLd$DN_v??;vo~!;tr^8S#*Y^vvR&t;~6!~`=QO8 zIdTxKpJiiK?!kg`9pGH8FRUJf3yhe;Fq~a}!RYTW`kEw8-*bdEo3wlhD=@HkF?-Yl zs?_8;*LWw?abCF!8{q0uJU{Y_suw|CTrjvyU?dlc@>eIL1n@;RRjo0;xf5FkM78|x za$$qHy1`50YSP;1t@vdG4EdY^T76RqE>&vP^L#7%uMjQo!Ka_bi0bwRe z%C!s+I!Ln`V|~Z6lqsrpu%=MVxK$~G$CyWyDQ(r%D9${hK2np$Wn}h%bOi$jt>m2rlLko$npm)!%Nx??sDB7WeAKSf(nHw-vWyj zhCRvZEY~o(n#?4eo%*_cq(|hrdM!n2hnOTuHnrSrSye!wmlHEsB0hG?^qif8a|=Vb;t1!qZ!!yX@=uClcln} zb8zmES7Px#+J*8ms%+dJe!N9u{vmZk*pXA(i=H8mi+ zH3}|ts~xT3AsE7GU#UJb^U6cJOE&dn*_G!*XY5v-TG4i#HfR8l0akOlIi|vHWvtq0 z7}^EujI3n99XWT8lO~iNs&QcH#rfFLDAsL!_ibXMds>?j{D`c*f{@rd(=s3z&2=@r zZ>1U7A7WszSyT}b3||<$u7K6XvIv?r*iM|C)o4UsVLbcUC{`n5f02F^PzMB=Q5F;; z;)=)(jOC!MAP>1=bFZUnln=>-;i2JG)oeSg+@v}$8BsN1!1|o5gpC98B6K#Z0TP;P zOrk?6!FZb&j5kX#-7KpEmhAYB?BSQ0cNX zQcudZT!yzu6312P0A{*Xm_SFZ3Z7tEdIzwbXe7n>KnKuN;L<_Y>4{jwaI0jp`CJi| z^CLwL5(uIANde6guoVUV)p z0H0xy#K{rF=a~}3XJv9bSbFBT5_T32mc|64i<_TQHV5gDvb}3-Cgr(L{=;E-KXHzZpW;H(>0Dn`-R6Hhi?V`D*)P}E#graWL# zRtqY#EQ4Az)Viz)$DmbYnlj4?)#8CQr;5NIVQ;dW5icV%BXHDEWuu}#82wbdOiaclfyE1qDn>M%jxHV7{f-aT!0+3*JgYA@x=^#8pF69;6v zPlkl*PH)}J%$lpt`DSKjWtQ%XoE3AQy(M$sufp8-56t}laq_K>IsuCbt zy?l}36r*ow{_K@Xl_CjM&zrVtxZ>1(^EJ>QgjAo;1W7tnq7AE(dWG_E)Mjk5F4RHT zbu4H!qwyKK;#uZigXCfGkCt^G5Q*Rw3WtiiAjgKtpw@DwLQd79rg=?Gq)9z!8#x$@;=|h^lYuOMMv@%F%XSZOxub8?p_MXlt^Y_4=!gtA+Or-UYF80B;{1@AoDDQt*Q7!3S8*8cKLjp+Vh0<>57-j*Q42XRLoy)xQZ7G;N5xNNqlH>bj7y91Y#xYH{r3$m1=6 z&3F={n7dhtN@Zctws5=#&GIxG`iM4T-WaCJtxPf=V|?D;bXzp9o? zXPM6c;1^_ii|Sffre9;z=10!u&aTWSXyKzfAcZ(5_9IdRlH~9BP5GhAIWBG{q(r!K zsxm4L*HW$zaeaa-pG?RPC(bte`=M^0;!1w6JA$op_QjBVjcU?A*TBELK3$M&=U>fK z-A&`4-=BZUQF`pvzjx~2LjKiUq<>5F?{fX~2j@6Be*X}N=5FS*4M|PjH@N%y7WLF5 z{$Tf`B=J6-Tk<8xekt#Zyl!*nb60Bf4QW!&6^nJRrI=4$bK(oB?oRR}Q}<13X>{xR zx=C1=CaHToN!oak_~tH>=J`f$3*Ejp?e)#v)~0g{`}=X+P44dY$q_y6zA1GVwDZE% zC+iEHejmQJm>DmJ9#?*ZwN!)iU zK;JK*)vIlRX;5BdP}UlhM+(a310s4KTa}^ruYLVO+>!2@3VK(sq6=F?ujMj8|Jt_| z^aAHUa*12Ls*Kz>a=#51(JD8;+u7O01e*Hlqd$(^VizLWyxq8hU8+_go)?ohCsa*5kT@2RFU zRyW3PB> z_I`Gcf2X>A+JSMLZeLL*r+22qec@3c8S8%C7fJiBq|if$e!n$3>*?tpN=Y|C-0nuk zxoIJD;13mYx?bcY!uM$}Ews5GT8)}j)Zy++K%DzgUq+grp^7l2TwPC%14Z|c-?jO= zG+7s@_h)2ju?p8vamhCvPTlk0lmz?^>{0gV)B4bmubVTw9l~70TSw_4+An z^z($Iiw=rN`a(tyyE|4fzqcUjo&^EkDkc%|FiX7Q z7b4$CwuYB$H8VpeQxj1y4FP{i|JZz3c^I4 zvwY)BDlAdqv8g+_-zpaQADcD-OM^RfK=gR5+gDUQ)*ZT$rwMNMB6aqtt@U+FdPvQO8SC)QNn6^P77kL4sr$?-c)KsSALbZ=RAVjL_*mc$i63qVGFa|j)!j)}GW`-n z2nn_6jYb()kULO@;A<6wAiYjZLgYyaQi|Yf1jD^pjKkITL^N(eFKMAYeOHAUA2T36 z?cOfNW`0}-Y`y{Z-ZEe|t=<1bz}~k?vwkGcT?S})ZgYRmZM5g> zR%Ptu&j4;!i7G-LRaMEo9;bvsvD2U=2w|)|YmAZ#QQ${)eaTOG$n* z(;gw@)57Xv_7^D8r;myI^k~G4G@H_!d_4$n>hXN_Z_{qS@x$DO8=#NowP4k?6k3e| zx1_5f3>(MWl77up$+73*0ajRuTx~FkVoY%BSW)Q#8-t-Pz-A1Yu| zH+Hk%&h8RST~ZeKsrJ}y%r6gn)pLFw{}N=c@`{-$k&1Wj@%wP+(n>8e^*pqeo={7- zZ%Z%pqbT2&ek?zAq^6)B)x* zFT2e)s9#;tqoEs}y7h4D?WucWuiySG5_v@*=Yi`9A<5%_YfDa31GLm4So6PNq6Bu0ns5K3O%5o8SvuB+#<^$n$!0&^ zy~?n+rtZ=%zg_BfVve~Jx(7(FgYTtoi6u{E_PCy|wSN2<%|Q1OG+@(}xx##ED=dv9 zjCQZ6~_HXL)+}Wl?;fx-`eI|+`ZDPir^)TdxeBDl8U7CH9zdy|F})a%>6*bm0l&* z;~p~Vr`Mx3ug=O!eiQNPa8F;nH1#FL&apwxP-^}yI?0LPKbKpSD$AlS;a+|u( zn|xQf)V-{Z1kK>qfD;mbC-?*GV%$=`Ds>g^2~|ncx=W=G^NmNSkN9&qLT7w#2W84~Z1Pc+|zyb@^y&h=PeQvEeR__(?QP5U6k1O5JZ1u9qSJ_;^s ze205_h4|ouO1j&U+TAZglJN!VZ`44Lx8$Cp4~^+P%6msF{@jYL4Wu=BVO$l7tArb| z6;gg+uhwUoq&$2|nZga3l>2eZWQxTS@rqe zhpWw)7}J}YXnkB#5hQQoCs#crFlEf z{V&XZyAx1(+%?P^hcAAvpI z)ek`OMYk3;u6Z7Wxv%k}TO+Pl$69aJ^E&Haz{V|YO4)$^NS9lfmkbZRq_@(zlJ#qR z%lrNCc|6b3bMF<|T@Tvg-YVfwWwMWOFLRz-nSJ)A8w;|~HEZ(jugr8wj679tZUXtBz z1=I$-6l)>zr&bmgWyJ3by_G2;yFE;pz`(wU92eiDE8bnl;LV4JaStV$`J$;&i+{TRh#Q%S0)K7=ZDC67r1Zu~uqi6N*shVJ%eSCTF zTS!~dnA<4bBt6GnM~R?aZ7RsjtHp%X7#gFg%}*}IX*bJqzo(p=OwI0pYNRaHx%Vv> zDHh#pH5)_1`+IdAC#&uz$G^ zx`$>u@|>io*mRpNv%vVrir@xpIsr&C+Mi|CY%(j(?sM>EhS^~ zc4Pha;Fbrn=fL}2G6^nt?f0{fuxlDj*QvPi(2+Rt|xYxA$pk3#%uxSr^A zP01gKE4$$cqghe*@HHZ}E{O$xd&L>eDf7E!8mvZli{bt#s-~oXIKIqv{E|9i^xNs(4%FlSq_589PGeJ_E9MnKwmU9-ZhhPNt zNdfAS-p@5E?MU6Y^;9EMTrhXs!0nMR7E}CA zsk_I=MGYQWeB(4qE{@v69la8FJvfqn8*#aP+A{rc-+)4wE>444^{5TIcVF|iwvf7q zm!YzmJt=wsj&D@DHY#*&f_}PvDg1!_X#w5oXSUYQI6fym{D{$9qvq9O)Bt<}^ZoG4 zdAbx$UroJK4CNO<1V=;yeFp^kyste=Lu^YPLh!P2*jfm2Een!3`0k3y zt@gV(2z`1ax7EQ|r+ph^h7s;|lyYAzF=TD-bq!-le4R|s+t@a^4=t0DaWKz85`Acy z@p&Z#9zz1oG7ZDk3`3Mma!D^DZC(YTs{=w$^7YsI;Scd{wXK_MQpulbT}99`aU?bZ z;5S-rmFGv$3{gIgr$lg*RlU-x;wTv9vf#K56?{2@bBi@ydxUSfSnZm>(5H{k6fFiJ zgKBiFhD?B6YY0PRG~hWD6KY6rvR`mtG}wk;;aht>o62$P>=1HybDk;Xd(0c2Uq{{d zRz~$`7(trcwGa7cbB9CA)pxS^!TLrm_C$d8z6kBLq1z{=zeDaZqedoyG~U_iMnGB3 zNcLJS7$hm~G|1=tp2CZMPgg2z0@T*ke$P2H^IE8sWd*2mrf*eRVVaiv&4ny3I6vjX zyH;ZU99volcpo=k1sdl2RuJ9m$B`-_{k)Ye7oMHwcMt=kz1f4?qagj9>)R-(sWYVD z0cm~`o?8{1GS45N!3?lAoa|fo&Y*8BiG=!^<`+euR4JSuyzG|ZXA^ASdF$?oQ6W2LFlylX+-ceu(ql0NafQfKWV z|27HD^bWX9aRm=e3I%*P59@V_Ugc*^#HbJP4p2@Z_z_YVVF z`6fnd-NgL%;sc`%6kBPM13~jC)MR(=Mb)O;-~crB!QRZpK{s^_RZmad^~3N^!w2^O z0z5^(U$S17l6)8i_b>H=nIk)NyKb?Xg@(H3^hRKm);dl4VSs&e2D^HwMU+Xcsu2G) z^~rPPmLOn)r|a9Y&y@Cvy_CyqL;&YH11Ez;OP;`Z^DunROfW2SC+)A zH!5);l;6C>3_|s#*fcRe4KV&voxBs|ga~VunVubF&4BqeBOELB? zX*UCBN1g0r!wjjg$S#v8_^Z%C-{F&KEYOXG0>smseQn9_o+7Tg(_UJK4q91<#ZAu3 z*EIP2u13O3jNXJ6iqirjsMVq_ymTG1;YLyy@H%+0Q2>T7^5c5s9&!5w8KPm5m}@wS z#tZ#&;JAfa7E-0Ibs+FaoEi&mx)$t-G>Vy zAmulg1;YL?a)ErN^F4i;(2eed==f*>zK|Aq3o@4V+xzFr@0EB5IfQ3>&s~-30lrv? zt{p`m5;PRCfdkX~Dvmb+JjC%3LC=s1H>YRc2rt0ViO$9z(Z3vO46?RY=7v!8reX0;8ZF{Q=qsI7}S)$-`9?? z0cyT)5yfj079srX^v{)^fUc|~Vf_+OBebpe?=a>6{BlRs;ybq1;+aDFHd-917C9ix zyw_ee=H~2A)EiN9zse^PKK#EHF>;cTVwlPBD4T?*_D|T@cv=Q4~gy`AN8eFjvk} zr{f$r+kQ*wH@qJilfG@gBi&f&ui(zYY0hYJAWA?};&$!vySif)(X(q;d-nppJ*wO9 zKoi6F_d9&h4?mKmi^;BNJR92(jC8U!3$Mc-=Qeed1JB3^%fnxA#qwqrHWEYc8Yw*< z{w{4oY`&KWq>(4+M&sQg(w6lWl-E0LLZ~umpuc?q^mx44nm5_9j|_l~T4`u@6Bk(R zJHw)@DxaHGK9^ZYz(o?8R@<0AC;7JHX?T8-xEgmxg7-}TEp{#agR&hFvfWoq*K0nU zB?~xlJ(&r%K~YA{=fTh2_j2;g1*>#?TDadjK9_aimM*{JtgzD1BQXj3`Kf`uG}te! zLBH`)7E?_RW{w8@qA=iES4Z|q9=e0Lty;uF-b#ju{WQ4UqtrQSgUJ<3+byOYwq8P~ zTkfR>n0pXUbNWprS=wGPZLSIGkne2(+a^e!9SlhvAsnmjeP+0%>%`MiH_@P@AzTe2 ziZ)`DxZfDw-e;j+f`ixnyiOdXj5Xn!H%D}hNn6_e2tsizoT227SA|F{*OH&a;t;ur zQGg4p?5LzYbmPo*S_9$DETt0xV=vHedeK`U+AghvX$6vZle0ny0}xj!)RDb-XLqb^ zZYVK60iyK403Z#P+z}O^CTBpcHlUaU?ZLcHw15f8pJXdA+%3*B&=1-FmH`-#USP99 zS__DwN$OxZy_|(Qjwe>mKn*=7!;XV9AhJOXW$WAyowVETSYFEzMfNG`dJ!ddMd*b* z+auh^ZRjY4b6_K(Q8mOGd}@_R05mxS?S?p6h1?OMh=TiZuA6-0-MtLu#B8DYzljYf zwkaK7aEwj+aZZ2${B5g@5KsZFi4J%3s;>3aHNpLXu}@sP^e^xJ*@x0f_LlBSqiPc9 zzgboN1F`z=L^vK;Wq}g~_Z_R93U1HZBgBQ8I{=_dOBGb~j8zng_eNfhaMv3SiYfkg z%8tl5NL7!Yj4ge#y2p@hxyPT3AU&D&_|^=9R}6x7cOwv}`Z19OiM}*r0qNUS6@4~V z^nD`SgyYYy>Iw@B-_QE?!BqnkBU<8RP}i)m4xb*xB>V--7;puaM?cJxUGY7h?uhHg zuF6w^8J8ALhIoHtc?0inF03|of2Yh*aT(+8YgCLG+u(lQr}p4`_a^H}Xd~9t8iMBw zGF}jZYN|WBnsLVa`|t_Lb-}yuA!rp+`1!tWu}MxwL8Xzm z@Rt1|GDz;N2*qHGTAfY9WdfG#UhZ$ zE0JEmW+gLveN+|8B*;kgZ}wVJsy%0iac2V%8*e^T$hl} zn-T+{i$!-cI4N{1km0eu1xT95EtLDla^FPJ>RdND9`0K}?4e`9 zRZkD;iOKw(*o8RGA?BhdGOBE>CmrWozNJ!M4t0Dr)bS`!0rkwIID+N5KtOR-uZ!tA z4bj{!vazY6I-3T1?$CkmO@$GFMK6Olri5Ea%GJ6*uusN*>M(p zKvagNrMGFnUMo~FEp*!dc6{MxlGy7?6&v&xN7hzaAcR5~m8>EDp$kkZ1OvyN7!^Hi zq^Nh7s4m}01Z&9L>scQ2{aN!E(4VMZm!^|LsblQfy!H>u1*4?*LD!^myIh^>xMRik@8AJ+Chw309bHRgV+x>I*e9}LL-HCZ4gL3F+LB%uv;6^!=< z{0LLaHdoJCQeM$q?lu)^uffQn^54Psqh}`=^_?;j5L(yt4Hz<1uH@>?Q_5|xTbh}6 z3qP3QFcqpM3ROQ?8Bz7u3{|AJXsKl)D<_2T;M1Su6P(KvG<6zqbXbs0t}m1uU4`Eb zMt2dq!KB7sM?*N>{mIHI(|TQ&`rVZk3EiOZB|1gs|6XYk-Wrky_qiHZ1cm=&#{q1JH%UM)y#j)?}=HYo%$Zvd_x>c`7UM z?W+EKDU|4NPs9?EGC{FzbicCpOYS3mCK#0fVrGVR|3OevoQ;|L;Jx{zKROUL6MPuw zG2qe}I8XNOk1IO`6g`UmfPwf9vVD1FSD3>py_bL_|?6j=+j*^W#6{cXUg;{P=@N zU5pQosC}5PqT3Y6gVa(ew+hwkcR_gUjtfq#$JpD2;Vq&^GADtA{KBAo+hb3;5({JK z4v*5j_cP}Oi>7r_8E2t{;Mc3Q_z|N-ZPKipji>A|9)rUS0wq@?s6Wk5OV5ejQEy6q znp+YBQd6Rc)%IJ1pWp@qvWu5;hE81s?ti|kF6#X%aXnC(=mbzgD|EK}uqQM#Ix#C@YY$D_vi z5L4PfZDdJYYYmgID;4b$0@lMka*w+ZH}cquu70Q*vL%K+Y|s2e8D!~Zydgl@D(Y|- zX?FvDa!ck2qQZGyt^H+u#hUMF1i6Di;{a4=vvG(*n>IX34) zTi?yGd>)>t6czu@75$P-WMe1B&~BhGG-f_Q_BY8ZVNvR|_8Kq<)Yn81H&MR3(hUc5 z6O$Iy?=`5K-RnRtjw%szZ3eZ;G)^ptVE0l#u-yq-O78KTtt8fUX$ogBONsqqZWD+< zBSid!)q;_QO;ijDu3E7n+CAdkpx}AiG|}ij#6Al6_tF6-C`*GH=aP1dP;4Rt&mJk$ zLo$9XNGQz!sb2RnHkbqqW~2YSlYHy2dTDow0`mi1{J{ku)lIf@V}2BV!)Qz;+TATN zJ*(-ZSknhqbiroiG@`z2Q9`@QSW30+!Ih!K?N`;W^tvka@#@70^ldA;(!MHe@G5ke zK)x-p(d_;d%iYM!iTg%`Y#3bkuVbFIFbjE`;`&ROuH`}i&3|D8aat}ClG&Z#mfoc> zuEK)-xV^!)OoED{`}=Y+gwgJ*8Z0_x3wwb6YVnK3bi=l0kLYle`#X(j8=H=V7@Y?5 zr7h|^cTq)I>mBEQSrfG0k1g*}i-1NDBp{UBJw}R|7MKnc%x_zvNE=l0|BA-sSfh6( z3O2gi*%can^p8gz&1K1m&R@hd5{z7m6sZ(QCZk1mM#V?^A| zgAuoZo)_+_?zj+H!gJ!?VWG2`pC6K5A3DqCFsc;Aut#AxV;ID){B1eXKU?wQe1zyh z)WGS82W*vp7!^vTse!*BD|8oPQ);L#thUX4bNVUS1~N9$iZX%X$++J&=*yq0rk~O7 zJCS}K2=v1se>bAxOGDAXTpf-^kg0v^!=^RjwH3eOF6|cWQvP3|3juu42BVGsiSm?Z zk(XM8#@oeQ#6BOF^yvYoqqjyrZB7W))?F=l?#8}psY7ybByvZonAib7iB!fQ)z7?0q{LtFD57QOmRV}QAr>^m*eVbS z3@Ch9`ev{ZOYU1?hC?w;oKBEgF~+A7_bG;&H6$CdA1z-H-!7ykY@B zL>({h&t5{D-(J3;%F21ba5&O^XL(pw2>Cxx{@BpZmamKS9-JZoeUD`-u8TSDSuV0i zf%}ow)#2`2UgZdsFdobH3Q-^&dATV4XR1+($=EoC?Tn#bT&XD#UVtD-) zshTcdyu^>5)fsKP!6vEGu;#n`u@nbC4fQDRm z?z0+p-N}fwt%)qB5$KDNZtp+8Oy0^wezgp$|AsI^oKn!LZV7~eW2oAtMRhc+IW5mw z2S=3{aa;{?z*Mp|hX0N4nRqO-$5DG_nYM2l<9WoeZcd)E2Q03=|B|9|x=f3v^_^w1 zi{|q)Lo$50OnR|~Usq><{BElvzXtc)NPZt&-YI<`8rjcVDvaqKW_Dz@R0AQi1tY>k zZpStQu_rW7xkK0UNl_5EIqdQ~K=+H_`{$RZ*9fyIwYu>%EOk1T# z@vM~$J&TIXB#4x9Gh@Ow!zpRcX0K__K583Hr%|r{7kNa8S4TCrjzw}A44er;7hp5977?u`9-HumGr*pFwo=*Nft-}mFU zZ>b+sQ}^ktA4JD%x;|k&p^v=#98*G?<9{!cAwHKmjHg37R=%@(!ro`uMmTMqkQWof z2=rA&kS;SzN&F;GHaA~1+@gXv^YC8bl_ne9XS~cjPDH3T9IDQ&f)6%%k|ysgO%~)WvE073T#ZT*2o)V zpSPFo?t8o}-EK(_c%kJthPK#udPVp%9jOzjsv{UG9A)$!UkCy4@i3!}zVKaH@$P-g z#4lhQZ$L1z;I9qDgc$0{LO}ikg#=%G*ey`xI2@7bXqIx>q=6ULEh30fYky7aImPGQ z7BWAQ6&cOe-Me%s4F8F5o$40%<8xx#)ZS@Kxk0n)j*{*TocGvHh|%sZ3lQDCgx^4S;x_`J$HNU9C5r>7&Mwl ztzzCv?hPGlhAl!9*vRhzc6m~?$w0r!Y$5esILUYCsmMxemwLs`&UBO;`bh+wP#?B{ zHfkq>JmQV0X;ZNk=rAy6H9cZ*!(zo1WbF*T*ya3I@WsB$v}OGO z-BDz&Hkyr)iWrbWOkZksDT;gjx{0ysm#)-5baWCHx z*;*d+wHK#2y11`h)YD&BXEU*0`<VDQWG#nQVr~=vP99MCl5W=qNP6o2{Q1!zj+kB|b*7B9mI6h=JP(&nkC9a6^ zIi16&It@1YK|{ne8tXZxf3!+Ixo3%*5@~#t!z7TOBFwS4cN#P|6ZhhD06)boUe%u#MKb~R`ndm^1*Z6vi_dX<^=qxqF%VY_e)7D|w9 zEbI5;jgmsYziyY{izIPh765>5bLE#ueQv7r}PvHL=bky`oOr-1fv|w7_br z>mZ;_8@<}xBZfh+G&^-)8z!DM);&t(m!WbtNo?DbAGd*2<8;9Dbv7ly*QxZDq5;t4 z?&0vqQSRq>(eOjyFSO(qVmELDrtTwnAe!*C!x>)44e$=Eb}}t)2*yS$tVg0`9_^Ie zXAGhgzct=BS`yz6Lj##>!-1w<7K2|HFvIfbwXo#jijGm2N8jrw&Ge&t?LYL|hR1XC z@qP!52;Pvj0lN#LjC6J3=rYY7&gUo@o+vzqDp+`BAD`5?yt^dvZ_~}ceCMTpKOF-C z>BiiQuMDm{o)?+HdAD?fZNJRxuu6L&ISkF2S*PRo_Oxt=ECArU{jR{hxcr~lJDN>0 z+aL%#YpFT7gN#a~sEvl%OoAxJTp^fEG{Vo@T>B=B>r)r_j#+wY9Pr}~6x{QGTjF!< z5x(QF-V^8gStt5Q^Zl&L?f(g6nHLb5t|nI-t8$=?s9{&%!z^oalQG6!!vdmr-J%|% z%|?rsaH58h>(`u1-D8X$;R9^aQQ+eo?2$|XFpc59Fm)xJ6pd>+z7GLP)A{U@1#p+_ zXc^uitiDZkNUwezV~gPi>>HSAQ;oO?6QX(atFW1%g_ojrj@@e^FhT1_`KBmvY%HWU zohBAXW3aZ*u)_yzNIz4IQB-=*mLL)DoUWHze}MqhMn=dmJ>hs{FvJZ4sS4?&;hj_t8~sjOb@?L|2ddS}s|~ zsZRafJ?rwrD0aovuu8lXJV< zJDH=q<9g{^uMt75b(lNtHu_-_O3@|5JLCuO4*r3mv;7znS!p{#R>1JR<5)|wiGW8~GpR>#pgL^dWXS0@+0F)F&nQR_&=m-E4jmhav zdI8&_LKzTV#WP{CQ6bB@$}-CsEP92CQy(gA!!f=Cy%FJq+NjeqAcAHM2GyQ#)n;Xq zdEsr7^a|b@FzpJ>*YRTT3k^m=<0KjwE*iKeO-V2n}?$9AI#Y570p?Hby?vZW=?u-<0av6tEN?SbIk=dk-%Shs+sCFwg zDm>r{MR7;YWwvTKg5#KMacFaRjj%`bNZEgz?MHwYFcF_Jatn^XdiM!VZ!EZBG!-e+r*yaW=T^a3qCBnzJ9V93fCf~;Vj|U)=63##FDJT=oOvzfg z)#k=XLN3@P?;40wX_nHYMN@qF(yASL?s)y~1KhnObC!|0G5vB0QOyzW@8*6Ux0>Dy zrN&~5YH2^{ld?T*lBAE2gTomw)iRk|+T*8-^U+CFjv|0hyJrn>m)sn6H5~KFmea5{ zpWoH?{RO{We-}{pYIoWWJ^i{}Z@20ghm!~Nodmis?0-|-iMK>7ft4bQl8omV_Zfop z{Ph5pxCv`D1W)Jk6WOLQg8L>v@@n63s2}dof5(dtP2xz#b)Gd7LyoY}(7i}=3(BtT zlFmOzxENq-cK1Mt#eI%3ra7@dG7-FOy^g7}hDas$I->1i8pDqM6*{{% zq!O|w05~}mC=XBz!EHwT1GNKgD+Y49c#W9+d6*Ec#J*EdSD(VKZ z6-SicW$Q(^j&ZT1o!pOEX^2FkaC?jplBw~ZeaPJ6YNMsF)d3%8pa4wH{B`KZ{FuBWzJn{tr1i0>T$Uig;Ca^__F@ zs;0X^w{wBf_O5IDjAn13mbuu9;C7ZDEm!G6tgUb&jGLk08YDx=>{+THc*jdMKxw!_ zqcM-uH@SCvBz`HOTyCAV$QRsj0^AC3`1*IlL;Az6ek4fPR*TvQk2*1+E3lC#sVZS( zH85pCs5hAaseR2iTtOWiqXHZpRe&oL-$e&D-3WJT*rhxHCoTI}6i3Jx9oU6!9<7!x zC|N~{Jfb4i*?!R=nqlFi!=aMHQP69VXMrhvTNt~Pgl{XsDCySaYjt)6vlD;7`+bk! z5sg)}WC!q|8V0}Bkl9JZXPBK=23kUt4xODC@c(2%N+i*5tCTi7)wzFYNf0(G|M5=l zisfCVk^uAjgKrwjAM37L%Gru}1i+uo>bR9ea$LQX8SeguXQmNW+~9s<{%(btwYg6Q z5kSYHhNDAUqh>)jjBD#)@DKx|nb+$6hRLk(!mIlh#i{x?3K4D>%Kc2kmQja{bq$m{ zj(`zY$7@iSl+>gQ_ZxB)=#W+$aKy(YVw8&DV~r&(w3hrHX<0;|`Ei(WdZlqU8g&URuyj;J4@O=tTrw8`p zvr7lkf<%XT7Tt$cu`~#yx7Ca+z54kwb+?s6w?z1tg~TV9C1SaFj6cb6m)yK@E( zO&i%t2Dq;Sbb+mNy1(Cm`Dl=c^wrLzq`Pb|jorLSG8aFvBAMsf)FEt}#fEh4YI@57 z`ssS9AptkNHgy>%wph_%t$UCqd&p=54UXYV4eD?|#op~925?-GYO_Bm{~s`=^+XgW zu=I^avTn?5rxd3m5s3+AUoO=c!6^hCLXBE{nT;RVWpAt3}+v+G^9AQrruB zq*NG4@$<}(hV)YJ_vO55A|^(w9AB*H+Z;JyDP6$M84+%?`vjR!WMyx28Jqjm;z6{!`uNHKCz4j7SVh0CAnLY z43lBVPO@WoguuW|31+Ir&C~;iqd08jA#wbLnR$OiXSF?nx_RmJY1{>$Y-mTYo%`qkDM#=~-*dV}J zQwsB`h2WUlVTtPwKSKiO3Q}F&fT6114Xj*%0D3hq1@B(){(j*-3tT$MKw(aE$Rft@ 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

bUp!j;>qg(E^V?L(r{=8<|H8C*ziL`3 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Simulator.f90 b/Simulator.f90 index 1a81976..b5cf2ac 100644 --- a/Simulator.f90 +++ b/Simulator.f90 @@ -1,4 +1,5 @@ module Simulator + use RedisInterface use Bop use PumpsMain use RopMain @@ -35,144 +36,195 @@ module Simulator use CWellSurveyData use MudPropertiesModule + use CBitProblems + use CBopProblems + use CChokeProblems + use CDrillStemProblems + use CGaugesProblems + use CHoistingProblems + use CKickProblems + use CLostProblems + use CMudTreatmentProblems + use COtherProblems + use CPumpProblems + use CRotaryProblems + + use OperationScenariosModule + use PermissionsModule + use UnitySignalsModule + use :: json_module, rk => json_rk implicit none - real :: a1, a2, a3, a4 - real(kind=rk), allocatable :: x0(:) type(json_file) :: jsonfile + type(json_value),pointer :: jsonvalue + type(json_core) :: jsoncore logical :: is_found real T1,T2 -contains + character(len=:),allocatable::redisContent + + contains subroutine Simulate integer :: t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! t=0 + ! call initConnection() + ! print *,"redis exmaple program" + + ! call jsoncore%create_object(jsonvalue,'') + ! call ConfigurationToJson(jsonvalue) + ! call WarningsToJson(jsonvalue) + ! call ProblemsToJson(jsonvalue) + ! print *,"write starts" + ! call jsoncore%serialize(jsonvalue,redisContent) + ! ! s = "Test redis write!" + ! call setData(redisContent) + ! print *,"write ends len=",len(redisContent) + + ! call getData(s2) + ! print *,"len(read)=",len(s2) + ! print *, s2(1:10),' .... ', s2(len(s2)-10:len(s2)) + ! call deallocateData() + ! ! print *,"S2 = ",s2 + ! deallocate(s2) + + call jsoncore%create_object(jsonvalue,'') + call initConnection() call write_variables() + call read_variables() + ! print *,"s2=",redisContent + ! call deallocateData() + ! print *,"redisContent Deallocated!" + ! print *,"s2=",redisContent ! call init_modules() - call cpu_time(T1) - do while (t<0) - !!read variable from shared file - call read_variables() - exit - !! Tarmigh, Now merged with TorqueDrag (FluidFlow) - ! call Rop_Step() + ! call cpu_time(T1) + ! do while (t<0) + ! !!read variable from shared file + ! call read_variables() + ! exit + ! !! Tarmigh, Now merged with TorqueDrag (FluidFlow) + ! ! call Rop_Step() - !! Rafiee, nothing changed - call BopStack_Step() + ! !! Rafiee, nothing changed + ! call BopStack_Step() - !! Tarmigh, now is rewritten - call Pump1_Step() - !call Pump2_Step() + ! !! Tarmigh, now is rewritten + ! call Pump1_Step() + ! !call Pump2_Step() - !! Rafiee - call ChokeControl_Step() + ! !! Rafiee + ! call ChokeControl_Step() - !! Location ./Equipment/Rotarytable - !! Variables: - !! Does not have step function - !! Call RTable_StartUp in the start - !! Again has a loop in each step - !! Tarmigh, now is rewritten - call RotaryTable_Step() + ! !! Location ./Equipment/Rotarytable + ! !! Variables: + ! !! Does not have step function + ! !! Call RTable_StartUp in the start + ! !! Again has a loop in each step + ! !! Tarmigh, now is rewritten + ! call RotaryTable_Step() - !! Location ./Equipment/Drawworks - !! Variables: - !! Does not have step function - !! Call ..._StartUp in the start - !! Again has a loop in each step - !! Tarmigh, now is rewritten - call Drawworks_Step() + ! !! Location ./Equipment/Drawworks + ! !! Variables: + ! !! Does not have step function + ! !! Call ..._StartUp in the start + ! !! Again has a loop in each step + ! !! Tarmigh, now is rewritten + ! call Drawworks_Step() - !! Empty nothing called - !! Merged in FluidFlow - ! call TorqueDrag_Step() + ! !! Empty nothing called + ! !! Merged in FluidFlow + ! ! call TorqueDrag_Step() - !! Location: ./Equipment/MudSystem - !! Variables: MudSystem_variables.f90 and MudSystem.f90 - !! Step function simply calls LineupAndPath in MudSystem.f90 - !! had not startUp - !! Rafiee - call MudSystem_Step() - - !! Location ./Equipment/BopStack - !! Variables: VARIABLES,CBopStackVariables,CBopControlPanelVariables,CEquipmentsConstants - !! Step function added, only call PIPE_RAMS1 and 2 function - !! BOP_StartUp commented - !! Rafiee - call PipeRams1_Step() - call PipeRams2_Step() + ! !! Location: ./Equipment/MudSystem + ! !! Variables: MudSystem_variables.f90 and MudSystem.f90 + ! !! Step function simply calls LineupAndPath in MudSystem.f90 + ! !! had not startUp + ! !! Rafiee + ! call MudSystem_Step() + + ! !! Location ./Equipment/BopStack + ! !! Variables: VARIABLES,CBopStackVariables,CBopControlPanelVariables,CEquipmentsConstants + ! !! Step function added, only call PIPE_RAMS1 and 2 function + ! !! BOP_StartUp commented + ! !! Rafiee + ! call PipeRams1_Step() + ! call PipeRams2_Step() - !! Location ./Equipment/BopStack - !! Variables: VARIABLES,CBopStackVariables,CBopControlPanelVariables,CEquipmentsConstants,CAccumulatorVariables,CSimulationVariables - !! Step function added, only call PIPE_RAMS1 and PIPE_RAMS2 function - !! BOP_StartUp commented - !! Rafiee - call KillLine_Step() + ! !! Location ./Equipment/BopStack + ! !! Variables: VARIABLES,CBopStackVariables,CBopControlPanelVariables,CEquipmentsConstants,CAccumulatorVariables,CSimulationVariables + ! !! Step function added, only call PIPE_RAMS1 and PIPE_RAMS2 function + ! !! BOP_StartUp commented + ! !! Rafiee + ! call KillLine_Step() - !! Probably like other bopstack equipments - !! Rafiee - call ChokeLine_Step() - call BlindRams_Step() - call Annular_Step() + ! !! Probably like other bopstack equipments + ! !! Rafiee + ! call ChokeLine_Step() + ! call BlindRams_Step() + ! call Annular_Step() - !!Tarmigh. Step must rewrittem - call TopDrive_Step() + ! !!Tarmigh. Step must rewrittem + ! call TopDrive_Step() - !!Empty - ! call Geo_Step() + ! !!Empty + ! ! call Geo_Step() - !!Ahmadi - call PathFinding_Step() - !! Sheikh - !call FluidFlow_Step() + ! !!Ahmadi + ! call PathFinding_Step() + ! !! Sheikh + ! call FluidFlow_Step() - !! Ahmadi - call OperationScenarios_Step() + ! !! Ahmadi + ! call OperationScenarios_Step() - !! Write variables to shared files - call write_variables() - - print *,"t=",t - t = t + 1 - end do - call cpu_time(T2) - print *,"Total Execution Time =",t2-t1 + ! !! Write variables to shared files + ! call write_variables() + + ! print *,"t=",t + ! t = t + 1 + ! end do + ! call jsoncore%destroy(jsonvalue) + ! call cpu_time(T2) + ! print *,"Total Execution Time =",t2-t1 end subroutine Simulate - subroutine write_variables + subroutine write_variables() use CAccumulator + use json_module implicit none - type(json_core) :: json - type(json_value),pointer :: p + ! character(len=:),allocatable::s + + call ConfigurationToJson(jsonvalue) + call WarningsToJson(jsonvalue) + call ProblemsToJson(jsonvalue) + print *,"write starts" - call json%create_object(p,'') !create the root - call ConfigurationToJson(p) - call json%print(p,'test.json') !write it to a file - call json%destroy(p) !cleanup print *,"written" + call jsoncore%serialize(jsonvalue,redisContent) + ! s = "Test redis write!" + call setData(redisContent) print *,"write ends" end subroutine subroutine read_variables - type(json_core) :: json - call jsonfile%initialize() - print *,"Starting read" + call getData(redisContent) + call jsoncore%deserialize(jsonvalue,redisContent) + ! print *,"Read from Redix:",redisContent ! ! Load the file. - call jsonfile%load_file('config.json'); if (jsonfile%failed()) stop - print *,"read complete" - call jsonfile%get('t0', a1, is_found); if (.not. is_found) return - call jsonfile%get('dt', a2, is_found); if (.not. is_found) return - call jsonfile%get('tf', a3, is_found); if (.not. is_found) return - call jsonfile%get('mu', a4, is_found); if (.not. is_found) return - call jsonfile%get('x0', x0, is_found); if (.not. is_found) return - - if (is_found) then - print *, a1,a2,a3,a4 - print *, x0 - end if - - call jsonfile%destroy() + ! call jsonfile%load_file('config.json'); if (jsonfile%failed()) stop + ! print *,"read complete" + ! call jsonfile%get('t0', a1, is_found); if (.not. is_found) return + ! call jsonfile%get('dt', a2, is_found); if (.not. is_found) return + ! call jsonfile%get('tf', a3, is_found); if (.not. is_found) return + ! call jsonfile%get('mu', a4, is_found); if (.not. is_found) return + ! call jsonfile%get('x0', x0, is_found); if (.not. is_found) return + + ! if (is_found) then + ! print *, a1,a2,a3,a4 + ! print *, x0 + ! end if + + ! call jsonfile%destroy() end subroutine subroutine init_modules @@ -200,7 +252,7 @@ contains ! call Annular_Step() !! Sheikh - !call FluidFlow_Init() + call FluidFlow_Init() !! Ahmadi call PathFinding_Init() @@ -237,19 +289,154 @@ contains call json%add(parent,p) end subroutine + subroutine WarningsToJson(parent) + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'Warnings') + + ! 2. add member of data type to new node + call json%add(p,"PumpWithKellyDisconnected",data%Warnings%PumpWithKellyDisconnected) + call json%add(p,"PumpWithTopdriveDisconnected",data%Warnings%PumpWithTopdriveDisconnected) + call json%add(p,"Pump1PopOffValveBlown",data%Warnings%Pump1PopOffValveBlown) + call json%add(p,"Pump1Failure",data%Warnings%Pump1Failure) + call json%add(p,"Pump2PopOffValveBlown",data%Warnings%Pump2PopOffValveBlown) + call json%add(p,"Pump2Failure",data%Warnings%Pump2Failure) + call json%add(p,"Pump3PopOffValveBlown",data%Warnings%Pump3PopOffValveBlown) + call json%add(p,"Pump3Failure",data%Warnings%Pump3Failure) + call json%add(p,"DrawworksGearsAbuse",data%Warnings%DrawworksGearsAbuse) + call json%add(p,"RotaryGearsAbuse",data%Warnings%RotaryGearsAbuse) + call json%add(p,"HoistLineBreak",data%Warnings%HoistLineBreak) + call json%add(p,"PartedDrillString",data%Warnings%PartedDrillString) + call json%add(p,"ActiveTankOverflow",data%Warnings%ActiveTankOverflow) + call json%add(p,"ActiveTankUnderVolume",data%Warnings%ActiveTankUnderVolume) + call json%add(p,"TripTankOverflow",data%Warnings%TripTankOverflow) + call json%add(p,"DrillPipeTwistOff",data%Warnings%DrillPipeTwistOff) + call json%add(p,"DrillPipeParted",data%Warnings%DrillPipeParted) + call json%add(p,"TripWithSlipsSet",data%Warnings%TripWithSlipsSet) + call json%add(p,"Blowout",data%Warnings%Blowout) + call json%add(p,"UndergroundBlowout",data%Warnings%UndergroundBlowout) + call json%add(p,"MaximumWellDepthExceeded",data%Warnings%MaximumWellDepthExceeded) + call json%add(p,"CrownCollision",data%Warnings%CrownCollision) + call json%add(p,"FloorCollision",data%Warnings%FloorCollision) + call json%add(p,"TopdriveRotaryTableConfilict",data%Warnings%TopdriveRotaryTableConfilict) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine ProblemsToJson(parent) + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'Problems') + + ! 2. add member of data type to new node + call BitProblemsToJson(p) + call BopProblemsToJson(p) + call ChokeProblemsToJson(p) + call DrillStemProblemsToJson(p) + call GaugesProblemsToJson(p) + call HoistingProblemsToJson(p) + call KickProblemsToJson(p) + call LostProblemsToJson(p) + call MudTreatmentProblemsToJson(p) + call OtherProblemsToJson(p) + call PumpProblemsToJson(p) + call RotaryProblemsToJson(p) + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + + subroutine StateToJson(parent) + + type(json_value),pointer :: parent + type(json_core) :: json + type(json_value),pointer :: p + + ! 1. create new node + call json%create_object(p,'State') + + ! call OperationScenarioToJson(p) + call notificationsToJson(p) + ! call permissionsToJson(p) + ! call unitySignalsToJson(p) + ! call StudentStationToJson(p) + ! call BopStackInputToJson(p) + ! call BopStackAccToJson(p) + ! call RamLineToJson(p) + ! call AnnularComputationalToJson(p) + ! call AnnularToJson(p) + ! call PipeRam1ToJson(p) + ! call ShearRamToJson(p) + ! call PipeRam2ToJson(p) + ! call ChokeLineToJson(p) + ! call KillLineToJson(p) + ! call PumpsToJson(p) + ! call RAMToJson(p) + ! call RAMSToJson(p) + ! call ChokeToJson(p) + ! call AirDrivenPumpToJson(p) + ! call AirPumpLineToJson(p) + ! call CHOOKEToJson(p) + ! call DrawworksToJson(p) + ! call MudSystemToJson(p) + ! call MUDToJson(p) + ! call MPumpsToJson(p) + ! call PUMPToJson(p) + ! call RTableToJson(p) + ! call TDSToJson(p) + ! call GasType(3)ToJson(p) + ! call PressureDisplayToJson(p) + ! call FricPressDropToJson(p) + ! call ROP_SpecToJson(p) + ! call ROP_BitToJson(p) + ! call TDGeoToJson(p) + ! call F_String(:)ToJson(p) + ! call F_CountsToJson(p) + ! call F_Interval(:)ToJson(p) + ! call OD_Annulus(4)ToJson(p) + ! call TD_DrillStemToJson(p) + ! call TD_DrillStemsToJson(p) + ! call TD_StringToJson(p) + ! call TD_CountToJson(p) + ! call G_StringElementToJson(p) + ! call TD_VolToJson(p) + ! call TD_GeneralToJson(p) + ! call TD_BOPToJson(p) + ! call TD_BOPElement(4)ToJson(p) + ! call TD_StConnToJson(p) + ! call TD_LoadToJson(p) + ! call TD_WellElToJson(p) + ! call TD_CasingToJson(p) + ! call TD_LinerToJson(p) + ! call TD_OpenHoleToJson(p) + ! call TD_ROPHoleToJson(p) + ! call TD_WellGeneralToJson(p) + ! call TD_WellGeo(:)ToJson(p) + + ! 2. add member of data type to new node + + ! 3. add new node to parent + call json%add(parent,p) + end subroutine + !use this as a template - subroutine SomeDSToJson(parent) + subroutine notificationsToJson(parent) type(json_value),pointer :: parent type(json_core) :: json type(json_value),pointer :: p ! 1. create new node - call json%create_object(p,'Configuration') + call json%create_object(p,'Notifications') ! 2. add member of data type to new node - ! call FormationToJson(p) - ! call json%add(p,"",data%Configuration%Formation%Formations(i)%Abrasiveness) ! 3. add new node to parent call json%add(parent,p) diff --git a/Test/TestRedis.f90 b/Test/TestRedis.f90 index b9f1ef1..4560354 100644 --- a/Test/TestRedis.f90 +++ b/Test/TestRedis.f90 @@ -1,29 +1,29 @@ -module TestRedisModule - contains - subroutine testRedis - use iso_c_binding - use smartredis_client, only : client_type - - implicit none - include "..\sredis\enum_fortran.inc" - integer, parameter :: dim1 = 10 - integer, parameter :: dim2 = 20 - integer, parameter :: dim3 = 30 - real(kind=8), dimension(dim1, dim2, dim3) :: recv_array_real_64 - real(kind=c_double), dimension(dim1, dim2, dim3) :: send_array_real_64 - integer :: i, j, k, result - type(client_type) :: client - - call random_number(send_array_real_64) - ! Initialize a client - result = client%initialize(.true.)!, "smartredis_put_get_3D") ! Change .false. to .true. if not using a clustered database - if (result .ne. SRNoError) error stop 'client%initialize failed' - ! Send a tensor to the database via the client and verify that we can retrieve it - result = client%put_tensor("send_array", send_array_real_64, shape(send_array_real_64)) - if (result .ne. SRNoError) error stop 'client%put_tensor failed' - result = client%unpack_tensor("send_array", recv_array_real_64, shape(recv_array_real_64)) - if (result .ne. SRNoError) error stop 'client%unpack_tensor failed' - ! Done - call exit() - end subroutine +module TestRedisModule + contains + subroutine testRedis + use iso_c_binding + use smartredis_client, only : client_type + + implicit none + include "..\sredis\enum_fortran.inc" + integer, parameter :: dim1 = 10 + integer, parameter :: dim2 = 20 + integer, parameter :: dim3 = 30 + real(kind=8), dimension(dim1, dim2, dim3) :: recv_array_real_64 + real(kind=c_double), dimension(dim1, dim2, dim3) :: send_array_real_64 + integer :: i, j, k, result + type(client_type) :: client + + call random_number(send_array_real_64) + ! Initialize a client + result = client%initialize(.true.)!, "smartredis_put_get_3D") ! Change .false. to .true. if not using a clustered database + if (result .ne. SRNoError) error stop 'client%initialize failed' + ! Send a tensor to the database via the client and verify that we can retrieve it + result = client%put_tensor("send_array", send_array_real_64, shape(send_array_real_64)) + if (result .ne. SRNoError) error stop 'client%put_tensor failed' + result = client%unpack_tensor("send_array", recv_array_real_64, shape(recv_array_real_64)) + if (result .ne. SRNoError) error stop 'client%unpack_tensor failed' + ! Done + call exit() + end subroutine end module TestRedisModule \ No newline at end of file diff --git a/Test/a.out b/Test/a.out new file mode 100644 index 0000000000000000000000000000000000000000..43bc701e39a06bce5ae4d743213189bd90906ad6 GIT binary patch literal 590304 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

}DsCH$} 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\Z6J$*xoqc5H>B~y1 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 <#NYvgeTN(G7-6WD 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 + +void addnums( int* a, int* b ) +{ + int c = (*a) + (*b); /* convert pointers to values, then add them */ + printf("sum of %i and %i is %i\n", (*a), (*b), c ); +} \ No newline at end of file diff --git a/Test/redis_io.o b/Test/redis_io.o new file mode 100644 index 0000000000000000000000000000000000000000..0bed5932557724115f292124c35a6a888beb6db6 GIT binary patch literal 1568 zcmbtTy=xRv5TCuo#E&GNVj)Ci8zq8y+(rwvki+wmEsRCr>acgWF{keCu^*5KY9R>A z5x76W#{a=GASiZ%jpa4M6*gicau8>BXOhixD;;<{Gru>#dGlu8zHB~Ntr!M~7;qPk zJV628RF3R=X4YW==Hchr%fDN8`ptgz-L%u^V>?Yo_MkZ)RPj3+fbltPPBN2#@c;(v zlk|hVcY<=*>Bo1Z$MhL~dLJd88ElzXdZy!dN%bQ9o(5QJH13#7t#;zaiD_BthN>-F zN#vGv8uK%i`xrq$xlqrh;m1MQ?o??ow;ziI8dw#r?N8V-vjgRg=Iml&|aq0F#qLfFs_VoKsCE>A3WMC~1fJ*mxaSA4t8f;}QS5Y{u>Z(UR6h**ZW!+(hcda_ zn_Hpdxm?NrDHG{5n;9)loqg%AZ0m1-5jUtubqQcS;=mgFXHXL)Pvj!wR~eUg$1v=P zp=tg6>$p!j|CMhcmvSDPCHiu{)QM0g`uX&J2$Or}Q2=k*Py(N$zTjnN(@{0P p=#U%~`tRu+oliOS*&_t|%%}HR6owC>b7+Q}dU}UIgsb>Ji6 z4j`^)5oU)sTR~ literal 0 HcmV?d00001 diff --git a/Test/test.cpp b/Test/test.cpp new file mode 100644 index 0000000..25032b9 --- /dev/null +++ b/Test/test.cpp @@ -0,0 +1,8 @@ +// #include "Redis/redis_io.cpp" +#include "redis_io.h" +int main() +{ + int x=4,y=12; + addnums(&x,&y); + return 0; +} \ No newline at end of file diff --git a/Test/test.f90 b/Test/test.f90 new file mode 100644 index 0000000..b7c0019 --- /dev/null +++ b/Test/test.f90 @@ -0,0 +1,18 @@ +Module RedisInterface + Interface + SUBROUTINE addnums(a, b) BIND(C,name='addnums') + USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT + IMPLICIT NONE + INTEGER(C_INT) :: a, b + END SUBROUTINE addnums + End Interface +END Module RedisInterface +program test + use RedisInterface + ! external addnums + integer::x,y + x=5 + y=12 + call addnums(x,y) +end program + diff --git a/Test/test_redis.f90 b/Test/test_redis.f90 new file mode 100644 index 0000000..6bd733a --- /dev/null +++ b/Test/test_redis.f90 @@ -0,0 +1,38 @@ +module test_redis + + contains + SUBROUTINE test() + use RedisInterface + use SimulationVariables + use json_module + character(len=:),allocatable::s2 + character(len=:),allocatable::redisContent + type(json_value),pointer :: jsonvalue + type(json_core) :: jsoncore + + call initConnection() + print *,"redis exmaple program" + + call jsoncore%create_object(jsonvalue,'') + call ConfigurationToJson(jsonvalue) + call WarningsToJson(jsonvalue) + call ProblemsToJson(jsonvalue) + print *,"write starts" + call jsoncore%serialize(jsonvalue,redisContent) + ! s = "Test redis write!" + call setData(redisContent) + print *,"write ends len=",len(redisContent) + + call getData(s2) + print *,"len(read)=",len(s2) + print *, s2(1:10),' .... ', s2(len(s2)-10:len(s2)) + call deallocateData() + ! print *,"S2 = ",s2 + deallocate(s2) + end SUBROUTINE +end module test_redis + +program redis_example + use test_redis + call test() +end program redis_example diff --git a/Text1.txt b/Text1.txt index 84da2e1..c1aa096 100644 --- a/Text1.txt +++ b/Text1.txt @@ -1,7 +1,3 @@ - integer :: HoleType - real(8) :: Angle - real(8) :: Length - real(8) :: FinalAngle - real(8) :: TotalLength - real(8) :: MeasuredDepth - real(8) :: TotalVerticalDepth \ No newline at end of file + integer :: ElevatorConnection + integer :: StringUpdate + integer :: KellyConnection \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 b/TorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 index 61602be..9c92459 100644 --- a/TorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 +++ b/TorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 @@ -1,516 +1,516 @@ -subroutine MeshGeneration_FluidModule - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - Use GeoElements_FluidModule - use CPumpsVariables - use CPumps - Use CStringConfigurationVariables - Use CBopStackVariables - !use ConfigurationVariables !@ , only: Drawworks - - implicit none - - Integer :: ii , jj , semijj , kk , k , m , s - Integer :: ElementsCount , StringConfigCount - REAL(8) :: mm , nn , dl , StartAngle , EndAngle - REAL(8) :: A(30) !?????????10 - REAL(8) :: TD_ElementLength - - - - - A = 0.d0 - A(1) = data%Configuration%BopStack%AboveAnnularHeight ! WellHead[ft] - jj = 1 - - - - - - - -!==================================================== -! Mesh Generation of DrillStem Components -!==================================================== - - !data%State%TD_String%StringConfigurationCount = StringConfigurationCount !??????????? - StringConfigCount = data%State%TD_String%StringConfigurationCount - if (allocated(data%State%F_String)) Deallocate(data%State%F_String) - if (data%State%TD_DrillStem(1)%ComponentType==0) then - Allocate (data%State%F_String(StringConfigCount-1)) - else - Allocate (data%State%F_String(StringConfigCount)) - end if - - - if (data%State%TD_DrillStem(1)%ComponentType==0) then - ElementsCount = 1 - Do ii=1,(StringConfigCount-1) - data%State%F_String(ii)%ID = data%State%TD_DrillStem(ii+1)%Id*12.d0 ![inch] - data%State%F_String(ii)%OD = data%State%TD_DrillStem(ii+1)%Od*12.d0 ![inch] - data%State%F_String(ii)%FirstElement = ElementsCount+1 - data%State%F_String(ii)%LastElement = data%State%F_String(ii)%FirstElement+(data%State%TD_DrillStem(ii+1)%Numbs-1) - data%State%F_String(ii)%ElType = data%State%TD_DrillStem(ii+1)%ComponentType - ElementsCount = data%State%F_String(ii)%LastElement - End Do - StringConfigCount = StringConfigCount-1 - else - ElementsCount = 0 - Do ii=1,StringConfigCount - data%State%F_String(ii)%ID = data%State%TD_DrillStem(ii)%Id*12.d0 ![inch] - data%State%F_String(ii)%OD = data%State%TD_DrillStem(ii)%Od*12.d0 ![inch] - data%State%F_String(ii)%FirstElement = ElementsCount+1 - data%State%F_String(ii)%LastElement = data%State%F_String(ii)%FirstElement+(data%State%TD_DrillStem(ii)%Numbs-1) - data%State%F_String(ii)%ElType = data%State%TD_DrillStem(ii)%ComponentType - ElementsCount = data%State%F_String(ii)%LastElement - End Do - end if - - - Do ii=1,StringConfigCount - data%State%F_String(ii)%TopDepth = data%State%TD_DrillStems(data%State%F_String(ii)%LastElement)%TopDepthIni ![ft] - data%State%F_String(ii)%DownDepth = data%State%TD_DrillStems(data%State%F_String(ii)%FirstElement)%DownDepthIni ![ft] - - if (data%State%F_String(ii)%DownDepth>A(1)) then - jj = jj+1 - A(jj) = data%State%F_String(ii)%DownDepth - end if - End Do - - - - !=========> Removed Volume Calculation in DrillStem - TD_ElementLength = data%State%F_String(StringConfigCount)%DownDepth-data%State%F_String(StringConfigCount)%TopDepth - if ( StringConfigCount==data%State%TD_Vol%PreCount ) then - if ( data%State%TD_Vol%PreElementLength>TD_ElementLength ) then - data%State%TD_Vol%RemoveVolume = (data%State%TD_Vol%PreElementLength-TD_ElementLength)*((pi*((data%State%F_String(StringConfigCount)%ID/12.d0)**2))/4.d0) ![ft^3] - else - data%State%TD_Vol%RemoveVolume = 0.d0 - end if - else if ( StringConfigCount Out of Well Intervals - data%State%F_Interval(1)%StartTVD = 0.0d0 !?????????????? - data%State%F_Interval(1)%EndTVD = -data%State%TD_StConn%ConnectionHeight - data%State%F_Interval(1)%StartAngle = 0.d0 !??????????????????????? - data%State%F_Interval(1)%EndAngle = 0.d0 !??????????????????????? - data%State%F_Counts%OutOfWellIntervalCounts = 1 - Do ii= 2 , StringConfigCount+1 - if ( data%State%F_Interval(ii)%StartDepth<=0.d0 ) then - data%State%F_Interval(ii)%StartTVD = data%State%F_Interval(ii)%StartDepth - data%State%F_Interval(ii)%StartAngle = 0.0d0 - end if - if ( data%State%F_Interval(ii)%EndDepth<=0.d0 ) then - data%State%F_Interval(ii)%EndTVD = data%State%F_Interval(ii)%EndDepth - data%State%F_Interval(ii)%EndAngle = 0.0d0 - data%State%F_Counts%OutOfWellIntervalCounts = data%State%F_Counts%OutOfWellIntervalCounts+1 - end if - End Do - - - !=========> - if (allocated(data%State%TDGeo%TVD)) Deallocate(data%State%TDGeo%TVD) - Allocate (data%State%TDGeo%TVD(jj)) - if (allocated(data%State%TDGeo%Angle)) Deallocate(data%State%TDGeo%Angle) - Allocate (data%State%TDGeo%Angle(jj)) - data%State%TDGeo%TVD(1) = data%State%TD_WellGeneral%WellTotalVerticalLength !????? - !print*, 'data%State%TD_WellGeneral%WellTotalVerticalLength=' ,data%State%TD_WellGeneral%WellTotalVerticalLength - data%State%TDGeo%TVD(jj) = data%Configuration%BopStack%AboveAnnularHeight ! WellHead[ft] !0.d0 ???????????????? - - k = 1 - mm = 0.d0 - nn = 0.d0 - EndAngle = data%State%TD_WellGeo(1)%StartAngle !??????????????? - data%State%TDGeo%Angle(jj) = EndAngle - Do ii = jj-1,1,-1 !???1or2 - do kk = k, data%State%TD_WellGeneral%WellIntervalsCount - StartAngle = EndAngle - if ( data%State%TDGeo%MD(ii)>data%State%TD_WellGeo(kk)%TopDepth ) then - if ( data%State%TDGeo%MD(ii)>data%State%TD_WellGeo(kk)%DownDepth ) then - dl = data%State%TD_WellGeo(kk)%DownDepth-nn ![ft] - nn = data%State%TD_WellGeo(kk)%DownDepth - if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then - EndAngle = StartAngle - !print*, 'StartAngle1=' ,ii , kk, StartAngle - !print*, 'EndAngle1=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) ![ft] - data%State%TDGeo%Angle(ii) = EndAngle - !print*, 'data%State%TDGeo%TVD(ii)1=' ,ii , kk, data%State%TDGeo%TVD(ii) - else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then - EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????????????????? - !print*, 'StartAngle2=' ,ii , kk, StartAngle - !print*, 'EndAngle2=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) - !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) - data%State%TDGeo%Angle(ii) = EndAngle - !print*, 'data%State%TDGeo%TVD(ii)2=' , ii , kk, data%State%TDGeo%TVD(ii) - else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then - EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????????????????? - !print*, 'StartAngle22=' ,ii , kk, StartAngle - !print*, 'EndAngle22=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) - !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) - data%State%TDGeo%Angle(ii) = EndAngle - !print*, 'data%State%TDGeo%TVD(ii)22=' , ii , kk, data%State%TDGeo%TVD(ii) - end if - mm = data%State%TDGeo%TVD(ii) - else - dl = data%State%TDGeo%MD(ii)-nn - nn = data%State%TDGeo%MD(ii) - if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then - EndAngle = StartAngle - !print*, 'StartAngle3=' ,ii , kk, StartAngle - !print*, 'EndAngle3=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) - data%State%TDGeo%Angle(ii) = EndAngle - !print*, 'data%State%TDGeo%TVD(ii)3=' ,ii , kk, data%State%TDGeo%TVD(ii) - else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then - EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !??????????????????? - !print*, 'StartAngle4=' ,ii , kk, StartAngle - !print*, 'EndAngle4=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) - data%State%TDGeo%Angle(ii) = EndAngle - !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) - !print*, 'mm=' ,mm - !print*, 'data%State%TDGeo%TVD(ii)4=' ,ii , kk, data%State%TDGeo%TVD(ii) - else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then - EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !??????????????????? - !print*, 'StartAngle44=' ,ii , kk, StartAngle - !print*, 'EndAngle44=' ,ii , kk, EndAngle - data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) - data%State%TDGeo%Angle(ii) = EndAngle - !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) - !print*, 'mm=' ,mm , (data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) - !print*, 'data%State%TDGeo%TVD(ii)44=' ,ii , kk, data%State%TDGeo%TVD(ii) - end if - mm = data%State%TDGeo%TVD(ii) - k = kk - exit - end if - end if - end do - End Do - - - - !if (data%State%F_Counts%OutOfWellIntervalCounts==1) then - ! s = 2 - !else - ! s = data%State%F_Counts%OutOfWellIntervalCounts - !end if - ! - - Do ii = (data%State%F_Counts%OutOfWellIntervalCounts+1),data%State%F_Counts%IntervalsTotalCounts - do kk = jj,1,-1 - if ( data%State%F_Interval(ii)%StartDepth==data%State%TDGeo%MD(kk) ) then - data%State%F_Interval(ii)%StartTVD = data%State%TDGeo%TVD(kk) ![ft] - data%State%F_Interval(ii)%StartAngle = data%State%TDGeo%Angle(kk) ![rad] - end if - if ( data%State%F_Interval(ii)%EndDepth==data%State%TDGeo%MD(kk) ) then - data%State%F_Interval(ii)%EndTVD = data%State%TDGeo%TVD(kk) ![ft] - data%State%F_Interval(ii)%EndAngle = data%State%TDGeo%Angle(kk) ![rad] - end if - end do - End Do - - - - !Do ii=1,(data%State%F_Counts%IntervalsTotalCounts) - ! print*, 'data%State%F_Interval(ii)%StartTVD=' , ii , data%State%F_Interval(ii)%StartTVD - ! print*, 'data%State%F_Interval(ii)%EndTVD=' , ii , data%State%F_Interval(ii)%EndTVD - ! print*, 'data%State%F_Interval(ii)%StartAngle=' , ii , data%State%F_Interval(ii)%StartAngle - ! print*, 'data%State%F_Interval(ii)%EndAngle=' , ii , data%State%F_Interval(ii)%EndAngle - !end do - ! - ! - !Do ii=1,data%State%TD_WellGeneral%WellIntervalsCount - ! print*, 'data%State%TD_WellGeo(kk)%TopDepth=' , ii , data%State%TD_WellGeo(ii)%TopDepth - ! print*, 'data%State%TD_WellGeo(kk)%DownDepth=' , ii , data%State%TD_WellGeo(ii)%DownDepth - ! print*, 'data%State%TD_WellGeo(kk)%HoleType=' , ii , data%State%TD_WellGeo(ii)%HoleType - ! print*, 'data%State%TD_WellGeo(kk)%RCurvature=' , ii , data%State%TD_WellGeo(ii)%RCurvature - ! print*, 'data%State%TD_WellGeo(kk)%EndAngle=' , ii , data%State%TD_WellGeo(ii)%EndAngle - ! print*, 'data%State%TD_WellGeo(kk)%StartAngle=' , ii , data%State%TD_WellGeo(ii)%StartAngle - !end do - - - - - +subroutine MeshGeneration_FluidModule + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + Use GeoElements_FluidModule + use CPumpsVariables + use CPumps + Use CStringConfigurationVariables + Use CBopStackVariables + !use ConfigurationVariables !@ , only: Drawworks + + implicit none + + Integer :: ii , jj , semijj , kk , k , m , s + Integer :: ElementsCount , StringConfigCount + REAL(8) :: mm , nn , dl , StartAngle , EndAngle + REAL(8) :: A(30) !?????????10 + REAL(8) :: TD_ElementLength + + + + + A = 0.d0 + A(1) = data%Configuration%BopStack%AboveAnnularHeight ! WellHead[ft] + jj = 1 + + + + + + + +!==================================================== +! Mesh Generation of DrillStem Components +!==================================================== + + !data%State%TD_String%StringConfigurationCount = StringConfigurationCount !??????????? + StringConfigCount = data%State%TD_String%StringConfigurationCount + if (allocated(data%State%F_String)) Deallocate(data%State%F_String) + if (data%State%TD_DrillStem(1)%ComponentType==0) then + Allocate (data%State%F_String(StringConfigCount-1)) + else + Allocate (data%State%F_String(StringConfigCount)) + end if + + + if (data%State%TD_DrillStem(1)%ComponentType==0) then + ElementsCount = 1 + Do ii=1,(StringConfigCount-1) + data%State%F_String(ii)%ID = data%State%TD_DrillStem(ii+1)%Id*12.d0 ![inch] + data%State%F_String(ii)%OD = data%State%TD_DrillStem(ii+1)%Od*12.d0 ![inch] + data%State%F_String(ii)%FirstElement = ElementsCount+1 + data%State%F_String(ii)%LastElement = data%State%F_String(ii)%FirstElement+(data%State%TD_DrillStem(ii+1)%Numbs-1) + data%State%F_String(ii)%ElType = data%State%TD_DrillStem(ii+1)%ComponentType + ElementsCount = data%State%F_String(ii)%LastElement + End Do + StringConfigCount = StringConfigCount-1 + else + ElementsCount = 0 + Do ii=1,StringConfigCount + data%State%F_String(ii)%ID = data%State%TD_DrillStem(ii)%Id*12.d0 ![inch] + data%State%F_String(ii)%OD = data%State%TD_DrillStem(ii)%Od*12.d0 ![inch] + data%State%F_String(ii)%FirstElement = ElementsCount+1 + data%State%F_String(ii)%LastElement = data%State%F_String(ii)%FirstElement+(data%State%TD_DrillStem(ii)%Numbs-1) + data%State%F_String(ii)%ElType = data%State%TD_DrillStem(ii)%ComponentType + ElementsCount = data%State%F_String(ii)%LastElement + End Do + end if + + + Do ii=1,StringConfigCount + data%State%F_String(ii)%TopDepth = data%State%TD_DrillStems(data%State%F_String(ii)%LastElement)%TopDepthIni ![ft] + data%State%F_String(ii)%DownDepth = data%State%TD_DrillStems(data%State%F_String(ii)%FirstElement)%DownDepthIni ![ft] + + if (data%State%F_String(ii)%DownDepth>A(1)) then + jj = jj+1 + A(jj) = data%State%F_String(ii)%DownDepth + end if + End Do + + + + !=========> Removed Volume Calculation in DrillStem + TD_ElementLength = data%State%F_String(StringConfigCount)%DownDepth-data%State%F_String(StringConfigCount)%TopDepth + if ( StringConfigCount==data%State%TD_Vol%PreCount ) then + if ( data%State%TD_Vol%PreElementLength>TD_ElementLength ) then + data%State%TD_Vol%RemoveVolume = (data%State%TD_Vol%PreElementLength-TD_ElementLength)*((pi*((data%State%F_String(StringConfigCount)%ID/12.d0)**2))/4.d0) ![ft^3] + else + data%State%TD_Vol%RemoveVolume = 0.d0 + end if + else if ( StringConfigCount Out of Well Intervals + data%State%F_Interval(1)%StartTVD = 0.0d0 !?????????????? + data%State%F_Interval(1)%EndTVD = -data%State%TD_StConn%ConnectionHeight + data%State%F_Interval(1)%StartAngle = 0.d0 !??????????????????????? + data%State%F_Interval(1)%EndAngle = 0.d0 !??????????????????????? + data%State%F_Counts%OutOfWellIntervalCounts = 1 + Do ii= 2 , StringConfigCount+1 + if ( data%State%F_Interval(ii)%StartDepth<=0.d0 ) then + data%State%F_Interval(ii)%StartTVD = data%State%F_Interval(ii)%StartDepth + data%State%F_Interval(ii)%StartAngle = 0.0d0 + end if + if ( data%State%F_Interval(ii)%EndDepth<=0.d0 ) then + data%State%F_Interval(ii)%EndTVD = data%State%F_Interval(ii)%EndDepth + data%State%F_Interval(ii)%EndAngle = 0.0d0 + data%State%F_Counts%OutOfWellIntervalCounts = data%State%F_Counts%OutOfWellIntervalCounts+1 + end if + End Do + + + !=========> + if (allocated(data%State%TDGeo%TVD)) Deallocate(data%State%TDGeo%TVD) + Allocate (data%State%TDGeo%TVD(jj)) + if (allocated(data%State%TDGeo%Angle)) Deallocate(data%State%TDGeo%Angle) + Allocate (data%State%TDGeo%Angle(jj)) + data%State%TDGeo%TVD(1) = data%State%TD_WellGeneral%WellTotalVerticalLength !????? + !print*, 'data%State%TD_WellGeneral%WellTotalVerticalLength=' ,data%State%TD_WellGeneral%WellTotalVerticalLength + data%State%TDGeo%TVD(jj) = data%Configuration%BopStack%AboveAnnularHeight ! WellHead[ft] !0.d0 ???????????????? + + k = 1 + mm = 0.d0 + nn = 0.d0 + EndAngle = data%State%TD_WellGeo(1)%StartAngle !??????????????? + data%State%TDGeo%Angle(jj) = EndAngle + Do ii = jj-1,1,-1 !???1or2 + do kk = k, data%State%TD_WellGeneral%WellIntervalsCount + StartAngle = EndAngle + if ( data%State%TDGeo%MD(ii)>data%State%TD_WellGeo(kk)%TopDepth ) then + if ( data%State%TDGeo%MD(ii)>data%State%TD_WellGeo(kk)%DownDepth ) then + dl = data%State%TD_WellGeo(kk)%DownDepth-nn ![ft] + nn = data%State%TD_WellGeo(kk)%DownDepth + if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then + EndAngle = StartAngle + !print*, 'StartAngle1=' ,ii , kk, StartAngle + !print*, 'EndAngle1=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) ![ft] + data%State%TDGeo%Angle(ii) = EndAngle + !print*, 'data%State%TDGeo%TVD(ii)1=' ,ii , kk, data%State%TDGeo%TVD(ii) + else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then + EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????????????????? + !print*, 'StartAngle2=' ,ii , kk, StartAngle + !print*, 'EndAngle2=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) + !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) + data%State%TDGeo%Angle(ii) = EndAngle + !print*, 'data%State%TDGeo%TVD(ii)2=' , ii , kk, data%State%TDGeo%TVD(ii) + else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then + EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????????????????? + !print*, 'StartAngle22=' ,ii , kk, StartAngle + !print*, 'EndAngle22=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) + !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) + data%State%TDGeo%Angle(ii) = EndAngle + !print*, 'data%State%TDGeo%TVD(ii)22=' , ii , kk, data%State%TDGeo%TVD(ii) + end if + mm = data%State%TDGeo%TVD(ii) + else + dl = data%State%TDGeo%MD(ii)-nn + nn = data%State%TDGeo%MD(ii) + if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then + EndAngle = StartAngle + !print*, 'StartAngle3=' ,ii , kk, StartAngle + !print*, 'EndAngle3=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) + data%State%TDGeo%Angle(ii) = EndAngle + !print*, 'data%State%TDGeo%TVD(ii)3=' ,ii , kk, data%State%TDGeo%TVD(ii) + else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then + EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !??????????????????? + !print*, 'StartAngle4=' ,ii , kk, StartAngle + !print*, 'EndAngle4=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) + data%State%TDGeo%Angle(ii) = EndAngle + !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) + !print*, 'mm=' ,mm + !print*, 'data%State%TDGeo%TVD(ii)4=' ,ii , kk, data%State%TDGeo%TVD(ii) + else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then + EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !??????????????????? + !print*, 'StartAngle44=' ,ii , kk, StartAngle + !print*, 'EndAngle44=' ,ii , kk, EndAngle + data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) + data%State%TDGeo%Angle(ii) = EndAngle + !data%State%TDGeo%TVD(ii) = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))) + !print*, 'mm=' ,mm , (data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) + !print*, 'data%State%TDGeo%TVD(ii)44=' ,ii , kk, data%State%TDGeo%TVD(ii) + end if + mm = data%State%TDGeo%TVD(ii) + k = kk + exit + end if + end if + end do + End Do + + + + !if (data%State%F_Counts%OutOfWellIntervalCounts==1) then + ! s = 2 + !else + ! s = data%State%F_Counts%OutOfWellIntervalCounts + !end if + ! + + Do ii = (data%State%F_Counts%OutOfWellIntervalCounts+1),data%State%F_Counts%IntervalsTotalCounts + do kk = jj,1,-1 + if ( data%State%F_Interval(ii)%StartDepth==data%State%TDGeo%MD(kk) ) then + data%State%F_Interval(ii)%StartTVD = data%State%TDGeo%TVD(kk) ![ft] + data%State%F_Interval(ii)%StartAngle = data%State%TDGeo%Angle(kk) ![rad] + end if + if ( data%State%F_Interval(ii)%EndDepth==data%State%TDGeo%MD(kk) ) then + data%State%F_Interval(ii)%EndTVD = data%State%TDGeo%TVD(kk) ![ft] + data%State%F_Interval(ii)%EndAngle = data%State%TDGeo%Angle(kk) ![rad] + end if + end do + End Do + + + + !Do ii=1,(data%State%F_Counts%IntervalsTotalCounts) + ! print*, 'data%State%F_Interval(ii)%StartTVD=' , ii , data%State%F_Interval(ii)%StartTVD + ! print*, 'data%State%F_Interval(ii)%EndTVD=' , ii , data%State%F_Interval(ii)%EndTVD + ! print*, 'data%State%F_Interval(ii)%StartAngle=' , ii , data%State%F_Interval(ii)%StartAngle + ! print*, 'data%State%F_Interval(ii)%EndAngle=' , ii , data%State%F_Interval(ii)%EndAngle + !end do + ! + ! + !Do ii=1,data%State%TD_WellGeneral%WellIntervalsCount + ! print*, 'data%State%TD_WellGeo(kk)%TopDepth=' , ii , data%State%TD_WellGeo(ii)%TopDepth + ! print*, 'data%State%TD_WellGeo(kk)%DownDepth=' , ii , data%State%TD_WellGeo(ii)%DownDepth + ! print*, 'data%State%TD_WellGeo(kk)%HoleType=' , ii , data%State%TD_WellGeo(ii)%HoleType + ! print*, 'data%State%TD_WellGeo(kk)%RCurvature=' , ii , data%State%TD_WellGeo(ii)%RCurvature + ! print*, 'data%State%TD_WellGeo(kk)%EndAngle=' , ii , data%State%TD_WellGeo(ii)%EndAngle + ! print*, 'data%State%TD_WellGeo(kk)%StartAngle=' , ii , data%State%TD_WellGeo(ii)%StartAngle + !end do + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 b/TorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 index 2b7fa95..0d0acc7 100644 --- a/TorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 +++ b/TorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 @@ -1,316 +1,316 @@ -subroutine TD_AddComponents - - Use CStringConfigurationVariables - use UnitySignalVariables - use UnitySignalsModule - ! Use CStringUpdateVariables - ! Use CSafetyValveEnumVariables - ! use UnitySignalsModule - ! use UnitySignalsModuleVariables - ! use OperationScenariosModule - use OperationScenariosModule!, only: Get_ElevatorConnection - ! use OperationScenariosModule !!CElevator... - use CHoistingVariables - use SimulationVariables - ! use UnitySignalsModule - ! Use CTdsElevatorModesEnumVariables - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - - implicit none - - integer :: i , kk , TD_NumOfAddedComponents - - - - - - - -!==================================================== -! Add Single -!==================================================== - - if ( Get_StringUpdate() == STRING_UPDATE_ADD_SINGLE ) then - kk = 0 - Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - end if - End Do - ! DrillStems Array: - TD_NumOfAddedComponents = 1 - Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) - data%State%TD_DrillStems(i)%ComponentType = 3 - data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id - data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%Od - data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.d0 - data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.3d0/2.d0 - data%State%TD_DrillStems(i)%ToolJointRange = data%State%TD_String%ToolJointRange - data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStems(i)%LengthIni = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStems(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength - data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length - data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density - data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents - ! DrillStem Array: - i = data%State%TD_String%StringConfigurationCount+1 - data%State%TD_DrillStem(i)%ComponentType = 3 - data%State%TD_DrillStem(i)%Numbs = 1 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%Od ! [ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 - - - Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) - end if - - - - - -!==================================================== -! Add Stand -!==================================================== - - if ( Get_StringUpdate() == STRING_UPDATE_ADD_STAND ) then - kk = 0 - Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - end if - End Do - ! DrillStems Array: - TD_NumOfAddedComponents = 3 - Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) - data%State%TD_DrillStems(i)%ComponentType = 3 - data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id - data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%Od - data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 - data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.30d0/2.0d0 - data%State%TD_DrillStems(i)%ToolJointRange = data%State%TD_String%ToolJointRange - data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStems(i)%LengthIni = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStems(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength - data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length - data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density - data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents - - ! DrillStem Array: - i = data%State%TD_String%StringConfigurationCount+1 - data%State%TD_DrillStem(i)%ComponentType = 3 - data%State%TD_DrillStem(i)%Numbs = 3 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%Od ! [ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 - - - Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) - end if - - - - - - -!==================================================== -! Add IBOP -!==================================================== - - !if ( Get_Ibop()==IBOP_INSTALL ) then - ! data%State%TD_Count%IBOPNewAdd = 1 - !else - ! data%State%TD_Count%IBOPNewAdd = 0 - ! data%State%TD_Count%IBOPOldAdd = 0 - ! end if - - if ( Get_Ibop()==IBOP_INSTALL .and. data%State%TD_Count%IBOPOldAdd==0 ) then - kk = 0 - Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - end if - End Do - ! DrillStems Array: - TD_NumOfAddedComponents = 1 - Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) - data%State%TD_DrillStems(i)%ComponentType = 5 - data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id - data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint - data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 - data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(kk)%RtoolJoint - data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 - data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%IBOPLength ! [ft] - data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%IBOPLength ! [ft] - data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length - data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density !???????????? - data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule !???????????? - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents - - ! DrillStem Array: - i = data%State%TD_String%StringConfigurationCount+1 - data%State%TD_DrillStem(i)%ComponentType = 5 - data%State%TD_DrillStem(i)%Numbs = 1 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint ! [ft] - data%State%TD_DrillStem(i)%Length = 1.540d0 ! [ft] - data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 - - - !data%State%TD_Count%IBOPOldAdd = data%State%TD_Count%IBOPNewAdd - - if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStem(i)%Length - end if - - end if - - if ( Get_Ibop()==IBOP_INSTALL ) then - data%State%TD_Count%IBOPOldAdd = 1 - else - data%State%TD_Count%IBOPOldAdd = 0 - end if - - - - -!==================================================== -! Add Safety Valve & Kelly (OPERATION_DRILL) -!==================================================== - - if ( data%State%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() == KELLY_CONNECTION_STRING ) then - data%State%TD_Count%KellyNewAdd = 1 - else - data%State%TD_Count%KellyNewAdd = 0 - data%State%TD_Count%KellyOldAdd = 0 - end if - - if ( data%State%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() == KELLY_CONNECTION_STRING .and. data%State%TD_Count%KellyNewAdd/=data%State%TD_Count%KellyOldAdd ) then - ! DrillStems Array: - TD_NumOfAddedComponents = 1 - Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) - data%State%TD_DrillStems(i)%ComponentType = 6 - data%State%TD_DrillStems(i)%Id = data%State%TD_StConn%KellyElementID ! [ft] - data%State%TD_DrillStems(i)%Od = data%State%TD_StConn%KellyElementOD ! [ft] - data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 - data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.30d0/2.0d0 - data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 - data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%KellyElementConst ! [ft] - data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%KellyElementConst ! [ft] - data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length - data%State%TD_DrillStems(i)%Density = 7850.d0*0.06242796d0 ! [kg/m3]*0.06242796=[lb/ft3] - data%State%TD_DrillStems(i)%ElasticModule = 200.0d9*0.02088543d0 ! [lb/ft2] !200GPa=29Mpsi (steel) - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents - - ! DrillStem Array: - i = data%State%TD_String%StringConfigurationCount+1 - data%State%TD_DrillStem(i)%ComponentType = 6 - data%State%TD_DrillStem(i)%Numbs = 1 - data%State%TD_DrillStem(i)%Id = 3.0d0/12.d0 ! [ft] - data%State%TD_DrillStem(i)%Od = 5.90d0/12.d0 ! [ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_StConn%KellyElementConst ! [ft] - data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 - - - data%State%TD_Count%KellyOldAdd = data%State%TD_Count%KellyNewAdd - - end if - - - - - -!==================================================== -! Add Safety Valve (OPERATION_TRIP) -!==================================================== - - !if ( Get_OperationCondition()==OPERATION_TRIP .and. Get_SafetyValve()==SAFETY_VALVE_INSTALL ) then - ! data%State%TD_Count%SafetyValveNewAdd = 1 - !else - ! data%State%TD_Count%SafetyValveNewAdd = 0 - ! data%State%TD_Count%SafetyValveOldAdd = 0 - !end if - - if ( data%State%TD_StConn%KellyDriveTypeMode/=0 .and. data%State%TD_StConn%OldOperationCondition/=0 .and. Get_SafetyValve()==SAFETY_VALVE_INSTALL .and. data%State%TD_Count%SafetyValveOldAdd==0 ) then - kk = 0 - Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - end if - End Do - ! DrillStems Array: - TD_NumOfAddedComponents = 1 - Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) - data%State%TD_DrillStems(i)%ComponentType = 7 - data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id - data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint - data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 - data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(kk)%RtoolJoint - data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 - data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%SafetyValveLength ! [ft] - data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%SafetyValveLength ! [ft] - data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length - data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density !???????????? - data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule !???????????? - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents - - ! DrillStem Array: - i = data%State%TD_String%StringConfigurationCount+1 - data%State%TD_DrillStem(i)%ComponentType = 7 - data%State%TD_DrillStem(i)%Numbs = 1 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint ! [ft] - data%State%TD_DrillStem(i)%Length = 1.540d0 ! [ft] - data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 - - - !data%State%TD_Count%SafetyValveOldAdd = data%State%TD_Count%SafetyValveNewAdd - - if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStem(i)%Length - end if - - end if - - if ( Get_SafetyValve()==SAFETY_VALVE_INSTALL ) then - data%State%TD_Count%SafetyValveOldAdd = 1 - else - data%State%TD_Count%SafetyValveOldAdd = 0 - end if - - - +subroutine TD_AddComponents + + Use CStringConfigurationVariables + use UnitySignalVariables + use UnitySignalsModule + ! Use CStringUpdateVariables + ! Use CSafetyValveEnumVariables + ! use UnitySignalsModule + ! use UnitySignalsModuleVariables + ! use OperationScenariosModule + use OperationScenariosModule!, only: Get_ElevatorConnection + ! use OperationScenariosModule !!CElevator... + use CHoistingVariables + use SimulationVariables + ! use UnitySignalsModule + ! Use CTdsElevatorModesEnumVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + + implicit none + + integer :: i , kk , TD_NumOfAddedComponents + + + + + + + +!==================================================== +! Add Single +!==================================================== + + if ( Get_StringUpdate() == STRING_UPDATE_ADD_SINGLE ) then + kk = 0 + Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + end if + End Do + ! DrillStems Array: + TD_NumOfAddedComponents = 1 + Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) + data%State%TD_DrillStems(i)%ComponentType = 3 + data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id + data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%Od + data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.d0 + data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.3d0/2.d0 + data%State%TD_DrillStems(i)%ToolJointRange = data%State%TD_String%ToolJointRange + data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStems(i)%LengthIni = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStems(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength + data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density + data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents + ! DrillStem Array: + i = data%State%TD_String%StringConfigurationCount+1 + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = 1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%Od ! [ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 + + + Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) + end if + + + + + +!==================================================== +! Add Stand +!==================================================== + + if ( Get_StringUpdate() == STRING_UPDATE_ADD_STAND ) then + kk = 0 + Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + end if + End Do + ! DrillStems Array: + TD_NumOfAddedComponents = 3 + Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) + data%State%TD_DrillStems(i)%ComponentType = 3 + data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id + data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%Od + data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 + data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.30d0/2.0d0 + data%State%TD_DrillStems(i)%ToolJointRange = data%State%TD_String%ToolJointRange + data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStems(i)%LengthIni = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStems(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength + data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density + data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents + + ! DrillStem Array: + i = data%State%TD_String%StringConfigurationCount+1 + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = 3 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%Od ! [ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStems(kk)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 + + + Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) + end if + + + + + + +!==================================================== +! Add IBOP +!==================================================== + + !if ( Get_Ibop()==IBOP_INSTALL ) then + ! data%State%TD_Count%IBOPNewAdd = 1 + !else + ! data%State%TD_Count%IBOPNewAdd = 0 + ! data%State%TD_Count%IBOPOldAdd = 0 + ! end if + + if ( Get_Ibop()==IBOP_INSTALL .and. data%State%TD_Count%IBOPOldAdd==0 ) then + kk = 0 + Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + end if + End Do + ! DrillStems Array: + TD_NumOfAddedComponents = 1 + Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) + data%State%TD_DrillStems(i)%ComponentType = 5 + data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id + data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint + data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 + data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(kk)%RtoolJoint + data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 + data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%IBOPLength ! [ft] + data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%IBOPLength ! [ft] + data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density !???????????? + data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule !???????????? + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents + + ! DrillStem Array: + i = data%State%TD_String%StringConfigurationCount+1 + data%State%TD_DrillStem(i)%ComponentType = 5 + data%State%TD_DrillStem(i)%Numbs = 1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint ! [ft] + data%State%TD_DrillStem(i)%Length = 1.540d0 ! [ft] + data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 + + + !data%State%TD_Count%IBOPOldAdd = data%State%TD_Count%IBOPNewAdd + + if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStem(i)%Length + end if + + end if + + if ( Get_Ibop()==IBOP_INSTALL ) then + data%State%TD_Count%IBOPOldAdd = 1 + else + data%State%TD_Count%IBOPOldAdd = 0 + end if + + + + +!==================================================== +! Add Safety Valve & Kelly (OPERATION_DRILL) +!==================================================== + + if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() == KELLY_CONNECTION_STRING ) then + data%State%TD_Count%KellyNewAdd = 1 + else + data%State%TD_Count%KellyNewAdd = 0 + data%State%TD_Count%KellyOldAdd = 0 + end if + + if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() == KELLY_CONNECTION_STRING .and. data%State%TD_Count%KellyNewAdd/=data%State%TD_Count%KellyOldAdd ) then + ! DrillStems Array: + TD_NumOfAddedComponents = 1 + Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) + data%State%TD_DrillStems(i)%ComponentType = 6 + data%State%TD_DrillStems(i)%Id = data%State%TD_StConn%KellyElementID ! [ft] + data%State%TD_DrillStems(i)%Od = data%State%TD_StConn%KellyElementOD ! [ft] + data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 + data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(i)%Od*1.30d0/2.0d0 + data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 + data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%KellyElementConst ! [ft] + data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%KellyElementConst ! [ft] + data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Density = 7850.d0*0.06242796d0 ! [kg/m3]*0.06242796=[lb/ft3] + data%State%TD_DrillStems(i)%ElasticModule = 200.0d9*0.02088543d0 ! [lb/ft2] !200GPa=29Mpsi (steel) + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents + + ! DrillStem Array: + i = data%State%TD_String%StringConfigurationCount+1 + data%State%TD_DrillStem(i)%ComponentType = 6 + data%State%TD_DrillStem(i)%Numbs = 1 + data%State%TD_DrillStem(i)%Id = 3.0d0/12.d0 ! [ft] + data%State%TD_DrillStem(i)%Od = 5.90d0/12.d0 ! [ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_StConn%KellyElementConst ! [ft] + data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 + + + data%State%TD_Count%KellyOldAdd = data%State%TD_Count%KellyNewAdd + + end if + + + + + +!==================================================== +! Add Safety Valve (OPERATION_TRIP) +!==================================================== + + !if ( Get_OperationCondition()==OPERATION_TRIP .and. Get_SafetyValve()==SAFETY_VALVE_INSTALL ) then + ! data%State%TD_Count%SafetyValveNewAdd = 1 + !else + ! data%State%TD_Count%SafetyValveNewAdd = 0 + ! data%State%TD_Count%SafetyValveOldAdd = 0 + !end if + + if ( data%State%TD_StConn%KellyDriveTypeMode/=0 .and. data%State%TD_StConn%OldOperationCondition/=0 .and. Get_SafetyValve()==SAFETY_VALVE_INSTALL .and. data%State%TD_Count%SafetyValveOldAdd==0 ) then + kk = 0 + Do i= data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + end if + End Do + ! DrillStems Array: + TD_NumOfAddedComponents = 1 + Do i= (data%State%TD_String%DrillStemComponentsNumbs+1) , (data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents) + data%State%TD_DrillStems(i)%ComponentType = 7 + data%State%TD_DrillStems(i)%Id = data%State%TD_DrillStems(kk)%Id + data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint + data%State%TD_DrillStems(i)%Area = (pi*((data%State%TD_DrillStems(i)%Od**2)-(data%State%TD_DrillStems(i)%Id**2)))/4.0d0 + data%State%TD_DrillStems(i)%RtoolJoint = data%State%TD_DrillStems(kk)%RtoolJoint + data%State%TD_DrillStems(i)%ToolJointRange = 0.0d0 + data%State%TD_DrillStems(i)%Length = data%State%TD_StConn%SafetyValveLength ! [ft] + data%State%TD_DrillStems(i)%LengthIni = data%State%TD_StConn%SafetyValveLength ! [ft] + data%State%TD_DrillStems(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStems(i)%Weight = data%State%TD_DrillStems(i)%WeightperLength*data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Density = data%State%TD_DrillStems(kk)%Density !???????????? + data%State%TD_DrillStems(i)%ElasticModule = data%State%TD_DrillStems(kk)%ElasticModule !???????????? + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs+TD_NumOfAddedComponents + + ! DrillStem Array: + i = data%State%TD_String%StringConfigurationCount+1 + data%State%TD_DrillStem(i)%ComponentType = 7 + data%State%TD_DrillStem(i)%Numbs = 1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStems(kk)%Id ! [ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStems(kk)%RtoolJoint ! [ft] + data%State%TD_DrillStem(i)%Length = 1.540d0 ! [ft] + data%State%TD_DrillStem(i)%WeightperLength = 55.0d0 ! [lb/ft] + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount+1 + + + !data%State%TD_Count%SafetyValveOldAdd = data%State%TD_Count%SafetyValveNewAdd + + if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStem(i)%Length + end if + + end if + + if ( Get_SafetyValve()==SAFETY_VALVE_INSTALL ) then + data%State%TD_Count%SafetyValveOldAdd = 1 + else + data%State%TD_Count%SafetyValveOldAdd = 0 + end if + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 b/TorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 index ea3c7bf..0602714 100644 --- a/TorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 +++ b/TorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 @@ -1,181 +1,181 @@ -subroutine TD_BOPDiamCalculation - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - Use CBopStackVariables - use SimulationVariables - use DownHoleModule - - - Integer :: i , j , n , m , TD_Numbs - Real(8) :: TD_LimitUp , TD_LimitDown , TD_OldFillingValue , TD_AnnTjDiff , TD_AnnularFilling - Real(8) :: TD_ElToolJoints(2,2) - - - - - - !data%State%TD_String%ToolJointRange = 0.4005d0*3.28 ! [ft] - -!==================================================== -! Read BOP Data -!==================================================== - - data%State%TD_BOP%BOPHeight(5) = data%Configuration%BopStack%AboveAnnularHeight - data%State%TD_BOP%BOPHeight(1) = data%Configuration%BopStack%AnnularPreventerHeight - data%State%TD_BOP%BOPHeight(2) = data%Configuration%BopStack%UpperRamHeight - data%State%TD_BOP%BOPHeight(3) = data%Configuration%BopStack%BlindRamHeight - data%State%TD_BOP%BOPHeight(6) = data%Configuration%BopStack%KillHeight - data%State%TD_BOP%BOPHeight(4) = data%Configuration%BopStack%LowerRamHeight - - - data%State%TD_BOP%BOPRamDiam(1) = data%State%ShearRAM%IDAnnularfinal - data%State%TD_BOP%BOPRamDiam(2) = data%State%ShearRAM%IDPipeRam1final - data%State%TD_BOP%BOPRamDiam(3) = data%State%ShearRAM%IDshearBopfinal - data%State%TD_BOP%BOPRamDiam(4) = data%State%ShearRAM%IDPipeRam2final - - - - - - -!==================================================== -! Element Counts in BOPStack Domain -!==================================================== - - !if (data%State%TD_String%DrillStemComponentsNumbs>5) then - TD_Numbs = data%State%TD_String%DrillStemComponentsNumbs-7 ! 7 Elements from the Top of DrillStem - !else - ! TD_Numbs = 1 - !end if - - - - - - - - - -!==================================================== -! Determination of Elements Diameter in BOPStack Domain -!==================================================== - - data%State%TD_BOP%BOPDiam = 0.d0 - TD_OldFillingValue = 0.d0 - Do i = data%State%TD_String%DrillStemComponentsNumbs,TD_Numbs,-1 - - TD_LimitUp = data%State%TD_DrillStems(i)%TopDepth+data%State%TD_DrillStems(i)%ToolJointRange - TD_LimitDown = data%State%TD_DrillStems(i)%DownDepth-data%State%TD_DrillStems(i)%ToolJointRange - TD_ElToolJoints(1,1) = data%State%TD_DrillStems(i)%TopDepth ! TD_ElToolJoints(i,j) , i=top & down tooljoints of element , j=top & down tooljoints Depth - TD_ElToolJoints(1,2) = TD_LimitUp - TD_ElToolJoints(2,1) = TD_LimitDown - TD_ElToolJoints(2,2) = data%State%TD_DrillStems(i)%DownDepth - - - !===> che meghdar az fazaye annular ba tooljoint por mishavad (for BOP Module) - Do m = 1,2 - TD_AnnTjDiff = min(TD_ElToolJoints(m,2),(data%State%TD_BOP%BOPHeight(1)+data%State%TD_BOP%BOPThickness))-max(TD_ElToolJoints(m,1),(data%State%TD_BOP%BOPHeight(1)-data%State%TD_BOP%BOPThickness)) - if (TD_AnnTjDiff<0.) then ! tooljoint is not in the annular range - TD_AnnTjDiff = 0.d0 - end if - TD_AnnularFilling = TD_OldFillingValue+(TD_AnnTjDiff/(data%State%TD_BOP%BOPThickness*2.d0)) ! 0=TD_LimitUp .and. (data%State%TD_BOP%BOPHeight(j)+data%State%TD_BOP%BOPThickness)3 ) then - data%State%TD_DrillStem(i)%ComponentType = 3 - data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-3 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount - else if ( data%State%TD_DrillStem(i)%Numbs==3 ) then - data%State%TD_DrillStem(i)%ComponentType = 3 - data%State%TD_DrillStem(i)%Numbs = 0 - data%State%TD_DrillStem(i)%Id = 0. - data%State%TD_DrillStem(i)%Od = 0. - data%State%TD_DrillStem(i)%Length = 0. - data%State%TD_DrillStem(i)%WeightperLength = 0. - data%State%TD_DrillStem(i)%TotalLength = 0. - data%State%TD_DrillStem(i)%TotalWeight = 0. - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 - end if - - - - Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) - !print* , 'Remove Stand' - end if - - - - - - - - -!==================================================== -! Remove IBOP -!==================================================== - - !if ( Get_Ibop() == IBOP_REMOVE ) then - ! data%State%TD_Count%IBOPNewRemove = 1 - !else - ! data%State%TD_Count%IBOPNewRemove = 0 - ! data%State%TD_Count%IBOPOldRemove = 0 - !end if - if ( Get_Ibop() == IBOP_REMOVE .and. data%State%TD_Count%IBOPOldRemove==0 ) then - - TD_NumOfRemovedComponents = 1 - Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 - data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? - data%State%TD_DrillStems(i)%Id = 0. - data%State%TD_DrillStems(i)%Od = 0. - data%State%TD_DrillStems(i)%Area = 0. - data%State%TD_DrillStems(i)%RtoolJoint = 0. - data%State%TD_DrillStems(i)%ToolJointRange = 0. - data%State%TD_DrillStems(i)%Length = 0. - data%State%TD_DrillStems(i)%LengthIni = 0. - data%State%TD_DrillStems(i)%WeightperLength = 0. - data%State%TD_DrillStems(i)%Weight = 0. - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents - - - i = data%State%TD_String%StringConfigurationCount - if ( data%State%TD_DrillStem(i)%Numbs>1 ) then - data%State%TD_DrillStem(i)%ComponentType = 5 - data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length ![ft] - data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount - else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then - data%State%TD_DrillStem(i)%ComponentType = 5 - data%State%TD_DrillStem(i)%Numbs = 0 - data%State%TD_DrillStem(i)%Id = 0. - data%State%TD_DrillStem(i)%Od = 0. - data%State%TD_DrillStem(i)%Length = 0. - data%State%TD_DrillStem(i)%WeightperLength = 0. - data%State%TD_DrillStem(i)%TotalLength = 0. - data%State%TD_DrillStem(i)%TotalWeight = 0. - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 - end if - - - !data%State%TD_Count%IBOPOldRemove = data%State%TD_Count%IBOPNewRemove - - if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%IBOPLength - end if - !print* , 'Remove IBOP' - end if - - if ( Get_Ibop() == IBOP_REMOVE ) then - data%State%TD_Count%IBOPOldRemove = 1 - else - data%State%TD_Count%IBOPOldRemove = 0 - end if - - - - - - - - -!==================================================== -! Remove Safety Valve (OPERATION_TRIP) -!==================================================== - - !if ( data%State%TD_StConn%OldOperationCondition==1 .and. data%State%TD_StConn%KellyDriveTypeMode==1 .and. Get_SafetyValve() == SAFETY_VALVE_REMOVE ) then - ! data%State%TD_Count%SafetyValveNewRemove = 1 - !else - ! data%State%TD_Count%SafetyValveNewRemove = 0 - ! data%State%TD_Count%SafetyValveOldRemove = 0 - !end if - !print* , 'Get_SafetyValve()=' , Get_SafetyValve() - if ( data%State%TD_StConn%KellyDriveTypeMode/=0 .and. data%State%TD_StConn%OldOperationCondition/=0 .and. Get_SafetyValve() == SAFETY_VALVE_REMOVE .and. data%State%TD_Count%SafetyValveOldRemove==0 ) then - - TD_NumOfRemovedComponents = 1 - Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 - data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? - data%State%TD_DrillStems(i)%Id = 0. - data%State%TD_DrillStems(i)%Od = 0. - data%State%TD_DrillStems(i)%Area = 0. - data%State%TD_DrillStems(i)%RtoolJoint = 0. - data%State%TD_DrillStems(i)%ToolJointRange = 0. - data%State%TD_DrillStems(i)%Length = 0. - data%State%TD_DrillStems(i)%LengthIni = 0. - data%State%TD_DrillStems(i)%WeightperLength = 0. - data%State%TD_DrillStems(i)%Weight = 0. - End Do - data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents - - - i = data%State%TD_String%StringConfigurationCount - if ( data%State%TD_DrillStem(i)%Numbs>1 ) then - data%State%TD_DrillStem(i)%ComponentType = 7 - data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 - data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] - data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] - data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length ![ft] - data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length - data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount - else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then - data%State%TD_DrillStem(i)%ComponentType = 7 - data%State%TD_DrillStem(i)%Numbs = 0 - data%State%TD_DrillStem(i)%Id = 0. - data%State%TD_DrillStem(i)%Od = 0. - data%State%TD_DrillStem(i)%Length = 0. - data%State%TD_DrillStem(i)%WeightperLength = 0. - data%State%TD_DrillStem(i)%TotalLength = 0. - data%State%TD_DrillStem(i)%TotalWeight = 0. - data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 - end if - !print* , 'Get_OperationCondition()=' , Get_OperationCondition() - !print* , 'data%State%TD_StConn%OldOperationCondition=' , data%State%TD_StConn%OldOperationCondition - !print* , 'data%State%TD_Count%SafetyValveNewRemove=' , data%State%TD_Count%SafetyValveNewRemove - !print* , 'data%State%TD_Count%SafetyValveOldRemove=' , data%State%TD_Count%SafetyValveOldRemove - !data%State%TD_Count%SafetyValveOldRemove = data%State%TD_Count%SafetyValveNewRemove - - if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%SafetyValveLength - end if - - end if - - if ( Get_SafetyValve() == SAFETY_VALVE_REMOVE ) then - data%State%TD_Count%SafetyValveOldRemove = 1 - else - data%State%TD_Count%SafetyValveOldRemove = 0 - end if - - if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then - data%State%TD_StConn%OldOperationCondition = 1 - else - data%State%TD_StConn%OldOperationCondition = 0 - end if - - !print* , 'data%State%TD_StConn%KellyDriveTypeMode=' , data%State%TD_StConn%KellyDriveTypeMode - !print* , 'data%State%TD_StConn%OldOperationCondition2=' , data%State%TD_StConn%OldOperationCondition - !print* , 'data%State%TD_Count%SafetyValveNewRemove2=' , data%State%TD_Count%SafetyValveNewRemove - !print* , 'data%State%TD_Count%SafetyValveOldRemove2=' , data%State%TD_Count%SafetyValveOldRemove - - +subroutine TD_RemoveComponents + + Use CStringConfigurationVariables + use UnitySignalVariables + use UnitySignalsModule + ! Use CStringUpdateVariables + ! Use CSafetyValveEnumVariables + ! use UnitySignalsModule + ! use UnitySignalsModuleVariables + ! use OperationScenariosModule + ! use OperationScenariosModule !!CElevator... + use OperationScenariosModule + ! use UnitySignalsModule + ! Use CTdsElevatorModesEnumVariables + use CHoistingVariables + use SimulationVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + + + + implicit none + + integer :: i , TD_NumOfRemovedComponents + + + +!==================================================== +! Remove Safety Valve & Kelly (OPERATION_DRILL) +!==================================================== + + if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() /= KELLY_CONNECTION_STRING ) then + data%State%TD_Count%KellyNewRemove = 1 + else + data%State%TD_Count%KellyNewRemove = 0 + data%State%TD_Count%KellyOldRemove = 0 + end if + if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL .and. Get_KellyConnection() /= KELLY_CONNECTION_STRING .and. data%State%TD_Count%KellyNewRemove/=data%State%TD_Count%KellyOldRemove ) then + !print* , 'Remove Safety Valve & Kelly=' + TD_NumOfRemovedComponents = 1 + Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 + data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? + data%State%TD_DrillStems(i)%Id = 0. + data%State%TD_DrillStems(i)%Od = 0. + data%State%TD_DrillStems(i)%Area = 0. + data%State%TD_DrillStems(i)%RtoolJoint = 0. + data%State%TD_DrillStems(i)%ToolJointRange = 0. + data%State%TD_DrillStems(i)%Length = 0. + data%State%TD_DrillStems(i)%LengthIni = 0. + data%State%TD_DrillStems(i)%WeightperLength = 0. + data%State%TD_DrillStems(i)%Weight = 0. + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents + + + i = data%State%TD_String%StringConfigurationCount + if ( data%State%TD_DrillStem(i)%Numbs>1 ) then + data%State%TD_DrillStem(i)%ComponentType = 6 + data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length ![ft] + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount + else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then + data%State%TD_DrillStem(i)%ComponentType = 6 + data%State%TD_DrillStem(i)%Numbs = 0 + data%State%TD_DrillStem(i)%Id = 0. + data%State%TD_DrillStem(i)%Od = 0. + data%State%TD_DrillStem(i)%Length = 0. + data%State%TD_DrillStem(i)%WeightperLength = 0. + data%State%TD_DrillStem(i)%TotalLength = 0. + data%State%TD_DrillStem(i)%TotalWeight = 0. + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 + end if + + + data%State%TD_Count%KellyOldRemove = data%State%TD_Count%KellyNewRemove + !print* , 'Remove Safety Valve & Kelly (OPERATION_DRILL)' + end if + + + + + + + +!==================================================== +! Remove Single +!==================================================== + + if ( Get_StringUpdate() == STRING_UPDATE_REMOVE_SINGLE ) then + !print* , 'STRING_UPDATE_REMOVE_SINGLE=' + TD_NumOfRemovedComponents = 1 + Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 + data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? + data%State%TD_DrillStems(i)%Id = 0. + data%State%TD_DrillStems(i)%Od = 0. + data%State%TD_DrillStems(i)%Area = 0. + data%State%TD_DrillStems(i)%RtoolJoint = 0. + data%State%TD_DrillStems(i)%ToolJointRange = 0. + data%State%TD_DrillStems(i)%Length = 0. + data%State%TD_DrillStems(i)%LengthIni = 0. + data%State%TD_DrillStems(i)%WeightperLength = 0. + data%State%TD_DrillStems(i)%Weight = 0. + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents + + + i = data%State%TD_String%StringConfigurationCount + if ( data%State%TD_DrillStem(i)%Numbs>1 ) then + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount + else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = 0 + data%State%TD_DrillStem(i)%Id = 0. + data%State%TD_DrillStem(i)%Od = 0. + data%State%TD_DrillStem(i)%Length = 0. + data%State%TD_DrillStem(i)%WeightperLength = 0. + data%State%TD_DrillStem(i)%TotalLength = 0. + data%State%TD_DrillStem(i)%TotalWeight = 0. + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 + end if + + + Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) + !print* , 'Remove Single' + end if + + + + + + + + +!==================================================== +! Remove Stand +!==================================================== + + if ( Get_StringUpdate() == STRING_UPDATE_REMOVE_STAND ) then + + TD_NumOfRemovedComponents = 3 + Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 + data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? + data%State%TD_DrillStems(i)%Id = 0. + data%State%TD_DrillStems(i)%Od = 0. + data%State%TD_DrillStems(i)%Area = 0. + data%State%TD_DrillStems(i)%RtoolJoint = 0. + data%State%TD_DrillStems(i)%ToolJointRange = 0. + data%State%TD_DrillStems(i)%Length = 0. + data%State%TD_DrillStems(i)%LengthIni = 0. + data%State%TD_DrillStems(i)%WeightperLength = 0. + data%State%TD_DrillStems(i)%Weight = 0. + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents + + + i = data%State%TD_String%StringConfigurationCount + if ( data%State%TD_DrillStem(i)%Numbs>3 ) then + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-3 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount + else if ( data%State%TD_DrillStem(i)%Numbs==3 ) then + data%State%TD_DrillStem(i)%ComponentType = 3 + data%State%TD_DrillStem(i)%Numbs = 0 + data%State%TD_DrillStem(i)%Id = 0. + data%State%TD_DrillStem(i)%Od = 0. + data%State%TD_DrillStem(i)%Length = 0. + data%State%TD_DrillStem(i)%WeightperLength = 0. + data%State%TD_DrillStem(i)%TotalLength = 0. + data%State%TD_DrillStem(i)%TotalWeight = 0. + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 + end if + + + + Call Set_StringUpdate(STRING_UPDATE_NEUTRAL) + !print* , 'Remove Stand' + end if + + + + + + + + +!==================================================== +! Remove IBOP +!==================================================== + + !if ( Get_Ibop() == IBOP_REMOVE ) then + ! data%State%TD_Count%IBOPNewRemove = 1 + !else + ! data%State%TD_Count%IBOPNewRemove = 0 + ! data%State%TD_Count%IBOPOldRemove = 0 + !end if + if ( Get_Ibop() == IBOP_REMOVE .and. data%State%TD_Count%IBOPOldRemove==0 ) then + + TD_NumOfRemovedComponents = 1 + Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 + data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? + data%State%TD_DrillStems(i)%Id = 0. + data%State%TD_DrillStems(i)%Od = 0. + data%State%TD_DrillStems(i)%Area = 0. + data%State%TD_DrillStems(i)%RtoolJoint = 0. + data%State%TD_DrillStems(i)%ToolJointRange = 0. + data%State%TD_DrillStems(i)%Length = 0. + data%State%TD_DrillStems(i)%LengthIni = 0. + data%State%TD_DrillStems(i)%WeightperLength = 0. + data%State%TD_DrillStems(i)%Weight = 0. + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents + + + i = data%State%TD_String%StringConfigurationCount + if ( data%State%TD_DrillStem(i)%Numbs>1 ) then + data%State%TD_DrillStem(i)%ComponentType = 5 + data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length ![ft] + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount + else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then + data%State%TD_DrillStem(i)%ComponentType = 5 + data%State%TD_DrillStem(i)%Numbs = 0 + data%State%TD_DrillStem(i)%Id = 0. + data%State%TD_DrillStem(i)%Od = 0. + data%State%TD_DrillStem(i)%Length = 0. + data%State%TD_DrillStem(i)%WeightperLength = 0. + data%State%TD_DrillStem(i)%TotalLength = 0. + data%State%TD_DrillStem(i)%TotalWeight = 0. + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 + end if + + + !data%State%TD_Count%IBOPOldRemove = data%State%TD_Count%IBOPNewRemove + + if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%IBOPLength + end if + !print* , 'Remove IBOP' + end if + + if ( Get_Ibop() == IBOP_REMOVE ) then + data%State%TD_Count%IBOPOldRemove = 1 + else + data%State%TD_Count%IBOPOldRemove = 0 + end if + + + + + + + + +!==================================================== +! Remove Safety Valve (OPERATION_TRIP) +!==================================================== + + !if ( data%State%TD_StConn%OldOperationCondition==1 .and. data%State%TD_StConn%KellyDriveTypeMode==1 .and. Get_SafetyValve() == SAFETY_VALVE_REMOVE ) then + ! data%State%TD_Count%SafetyValveNewRemove = 1 + !else + ! data%State%TD_Count%SafetyValveNewRemove = 0 + ! data%State%TD_Count%SafetyValveOldRemove = 0 + !end if + !print* , 'Get_SafetyValve()=' , Get_SafetyValve() + if ( data%State%TD_StConn%KellyDriveTypeMode/=0 .and. data%State%TD_StConn%OldOperationCondition/=0 .and. Get_SafetyValve() == SAFETY_VALVE_REMOVE .and. data%State%TD_Count%SafetyValveOldRemove==0 ) then + + TD_NumOfRemovedComponents = 1 + Do i= data%State%TD_String%DrillStemComponentsNumbs , (data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents+1) , -1 + data%State%TD_DrillStems(i)%ComponentType = 0 !???????????? + data%State%TD_DrillStems(i)%Id = 0. + data%State%TD_DrillStems(i)%Od = 0. + data%State%TD_DrillStems(i)%Area = 0. + data%State%TD_DrillStems(i)%RtoolJoint = 0. + data%State%TD_DrillStems(i)%ToolJointRange = 0. + data%State%TD_DrillStems(i)%Length = 0. + data%State%TD_DrillStems(i)%LengthIni = 0. + data%State%TD_DrillStems(i)%WeightperLength = 0. + data%State%TD_DrillStems(i)%Weight = 0. + End Do + data%State%TD_String%DrillStemComponentsNumbs = data%State%TD_String%DrillStemComponentsNumbs-TD_NumOfRemovedComponents + + + i = data%State%TD_String%StringConfigurationCount + if ( data%State%TD_DrillStem(i)%Numbs>1 ) then + data%State%TD_DrillStem(i)%ComponentType = 7 + data%State%TD_DrillStem(i)%Numbs = data%State%TD_DrillStem(i)%Numbs-1 + data%State%TD_DrillStem(i)%Id = data%State%TD_DrillStem(i)%Id ![ft] + data%State%TD_DrillStem(i)%Od = data%State%TD_DrillStem(i)%Od ![ft] + data%State%TD_DrillStem(i)%Length = data%State%TD_DrillStem(i)%Length ![ft] + data%State%TD_DrillStem(i)%WeightperLength = data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_DrillStem(i)%TotalLength = data%State%TD_DrillStem(i)%Numbs*data%State%TD_DrillStem(i)%Length + data%State%TD_DrillStem(i)%TotalWeight = data%State%TD_DrillStem(i)%TotalLength*data%State%TD_DrillStem(i)%WeightperLength + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount + else if ( data%State%TD_DrillStem(i)%Numbs==1 ) then + data%State%TD_DrillStem(i)%ComponentType = 7 + data%State%TD_DrillStem(i)%Numbs = 0 + data%State%TD_DrillStem(i)%Id = 0. + data%State%TD_DrillStem(i)%Od = 0. + data%State%TD_DrillStem(i)%Length = 0. + data%State%TD_DrillStem(i)%WeightperLength = 0. + data%State%TD_DrillStem(i)%TotalLength = 0. + data%State%TD_DrillStem(i)%TotalWeight = 0. + data%State%TD_String%StringConfigurationCount = data%State%TD_String%StringConfigurationCount-1 + end if + !print* , 'Get_OperationCondition()=' , Get_OperationCondition() + !print* , 'data%State%TD_StConn%OldOperationCondition=' , data%State%TD_StConn%OldOperationCondition + !print* , 'data%State%TD_Count%SafetyValveNewRemove=' , data%State%TD_Count%SafetyValveNewRemove + !print* , 'data%State%TD_Count%SafetyValveOldRemove=' , data%State%TD_Count%SafetyValveOldRemove + !data%State%TD_Count%SafetyValveOldRemove = data%State%TD_Count%SafetyValveNewRemove + + if ( Get_ElevatorConnection() /= ELEVATOR_CONNECTION_STRING .or. (Get_TdsConnectionModes()/=TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()/=TDS_ELEVATOR_CONNECTION_STRING) ) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%SafetyValveLength + end if + + end if + + if ( Get_SafetyValve() == SAFETY_VALVE_REMOVE ) then + data%State%TD_Count%SafetyValveOldRemove = 1 + else + data%State%TD_Count%SafetyValveOldRemove = 0 + end if + + if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then + data%State%TD_StConn%OldOperationCondition = 1 + else + data%State%TD_StConn%OldOperationCondition = 0 + end if + + !print* , 'data%State%TD_StConn%KellyDriveTypeMode=' , data%State%TD_StConn%KellyDriveTypeMode + !print* , 'data%State%TD_StConn%OldOperationCondition2=' , data%State%TD_StConn%OldOperationCondition + !print* , 'data%State%TD_Count%SafetyValveNewRemove2=' , data%State%TD_Count%SafetyValveNewRemove + !print* , 'data%State%TD_Count%SafetyValveOldRemove2=' , data%State%TD_Count%SafetyValveOldRemove + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 b/TorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 index 15d8089..7271ac2 100644 --- a/TorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 +++ b/TorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 @@ -1,834 +1,834 @@ -subroutine TD_StringConnectionModes - - use CHoistingVariables - use SimulationVariables - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use UnitySignalVariables - use UnitySignalsModule -! use OperationScenariosModule -! use OperationScenariosModule !!CElevator... -! Use CSlipsEnumVariables -! use UnitySignalsModuleVariables - use SoftwareInputsVariables -! Use CZeroStringSpeed -! use UnitySignalsModule -! Use CTdsElevatorModesEnumVariables - use OperationScenariosModule - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - use SimulationVariables !@!, only: Drawworks - - - - implicit none - integer :: i , kk - Real(8) :: LengthSum - - - - - - - - !!=====> Read Data - !kk = 0 - !LengthSum = 0.d0 - ! - !Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - ! if (data%State%TD_DrillStems(i)%ComponentType==3) then - ! kk = i - ! exit - ! else if (data%State%TD_DrillStems(i)%ComponentType==5 .or. data%State%TD_DrillStems(i)%ComponentType==7) then - ! LengthSum = LengthSum+data%State%TD_DrillStems(i)%LengthIni - ! end if - !End Do - - - - - - - - !####C_Program -----> data%State%Hoisting%DriveType = - ! = 0 TopDrive_DriveType - ! = 1 Kelly_DriveType - - !####C_Program -----> data%State%TD_StConn%KellyDriveTypeMode = - ! = 0 Drill Mode (Kelly) - ! = 1 Trip Mode (Elevator) - ! = 2 TopDrive Mode - - if ( data%State%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL ) then - data%State%TD_StConn%KellyDriveTypeMode = 0 - else if ( data%State%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_TRIP ) then - data%State%TD_StConn%KellyDriveTypeMode = 1 - else if ( data%State%Hoisting%DriveType==0 ) then - data%State%TD_StConn%KellyDriveTypeMode = 2 - end if - - data%State%TD_StConn%HookHeight = data%State%Drawworks%TDHookHeight ! unit: [ft] - data%State%TD_StConn%ElevatorConst = 17.985d0 ! [ft] Elevator Length(14.84) ????????????????? adad ha daghigh shavand - data%State%TD_StConn%ElevatorECG = data%State%OperationScenario%ECG ! [ft] - data%State%TD_StConn%KellyConst = 63.280d0 ! [ft] Kelly Length(61.74) + Safety Valve Length(1.54) - data%State%TD_StConn%KellyElementConst = 41.840d0 ! [ft] Kelly Element Length(40.3) + Safety Valve Length(1.54) - data%State%TD_StConn%TDSLength = 24.08d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSToolJointLength = 0.77d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSElevatorLength = 26.837d0 !?????? ! TDS with Elevator Length [ft] - data%State%TD_StConn%TDSElevatorToolLength= 0.859d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSElevatorECG = 2.454d0 ! [ft] - data%State%TD_Load%NumOfCables = data%State%Hoisting%NumberOfLine - data%State%TD_Load%WeightTB = data%State%Hoisting%TravelingBlockWeight ! [lb] - data%State%TD_Load%WeightTD = data%State%Hoisting%TopDriveWeight ! [lb] - data%State%TD_Load%KellyWeight = data%State%Hoisting%KellyWeight ! [lb] - - - - - - - - - !=====> Velocity Calculation - data%State%TD_StConn%HookVelocity = (data%State%TD_StConn%HookHeight-data%State%TD_StConn%HookHeightOld)/data%State%TD_General%TimeStep ! [ft/s] - - - - - - - - - -!==================================================== -! Add or Remove DrillStem Components -!==================================================== - Call TD_AddComponents - - Call TD_RemoveComponents - - - !=====> Read Data - kk = 0 - LengthSum = 0.d0 - - Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - else if (data%State%TD_DrillStems(i)%ComponentType==5 .or. data%State%TD_DrillStems(i)%ComponentType==7) then - LengthSum = LengthSum+data%State%TD_DrillStems(i)%LengthIni - end if - End Do - !print*, 'kk' , kk - !print*, 'data%State%TD_DrillStems(kk)%LengthIni0=' , data%State%TD_DrillStems(kk)%LengthIni - - - - -!==================================================== -! String Connection Mode Determination -!==================================================== - - !####data%State%TD_StConn%StringConnectionMode = - ! = 0 Slips Set ??????? - ! = 1 Kelly Connected to String - ! = 2 Kelly Nothing Connected - ! = 3 Kelly Connected to Single - ! = 4 Elevator Connected to String - ! = 5 Elevator Nothing Connected - ! = 6 Elevator Connected to Stand - ! = 7 Elevator Connected to Single - ! = 8 Elevator Latch String - ! = 18 Elevator Latch Single - ! = 19 Elevator Latch Stand - ! = 9 TDS CONNECTION SPINE - ! = 10 TDS CONNECTION STRING - ! = 11 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH STRING - ! = 12 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION STRING - ! = 13 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION NOTHING - ! = 14 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION STAND - ! = 15 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION SINGLE - ! = 16 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH SINGLE - ! = 17 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH STAND - - - - - - !if (data%State%TD_String%DlTouch<=0.) then ![ft] - ! if(data%State%TD_StConn%HookVelocity<=0.) then - ! data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - ! data%State%TD_StConn%StringVelocity = 0.0d0 - ! return - ! end if - !end if - - - - !=====> Connection Height Determination - - if ( data%State%TD_StConn%KellyDriveTypeMode==0 ) then - - if(Get_KellyConnection() == KELLY_CONNECTION_STRING) then - data%State%TD_Count%KellyNewStatus(1) = 1 - else - data%State%TD_Count%KellyNewStatus(1) = 0 - !data%State%TD_Count%KellyOldStatus(1) = 0 - end if - - if(Get_KellyConnection()==KELLY_CONNECTION_NOTHING) then - data%State%TD_Count%KellyNewStatus(2) = 1 - else - data%State%TD_Count%KellyNewStatus(2) = 0 - !data%State%TD_Count%KellyOldStatus(2) = 0 - end if - - if(Get_KellyConnection()==KELLY_CONNECTION_SINGLE) then - data%State%TD_Count%KellyNewStatus(3) = 1 - else - data%State%TD_Count%KellyNewStatus(3) = 0 - !data%State%TD_Count%KellyOldStatus(3) = 0 - end if - - - if ( Get_KellyConnection() == KELLY_CONNECTION_STRING ) then - data%State%TD_StConn%StringConnectionMode = 1 - !print*, 'data%State%TD_StConn%ConnectionHeight10=' , data%State%TD_StConn%ConnectionHeight - !print*, 'data%State%TD_StConn%KellyElementConst1=' , data%State%TD_StConn%KellyElementConst - !print*, 'data%State%TD_DrillStems(kk)%LengthIni1=' , data%State%TD_DrillStems(kk)%LengthIni - if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(1)/=data%State%TD_Count%KellyOldStatus(1)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_StConn%KellyElementConst - data%State%TD_Count%KellyOldStatus(1) = data%State%TD_Count%KellyNewStatus(1) - data%State%TD_Count%KellyOldStatus(2) = 0 - else if (data%State%TD_Count%KellyOldStatus(3)==1 .and. data%State%TD_Count%KellyNewStatus(1)/=data%State%TD_Count%KellyOldStatus(1)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_StConn%KellyElementConst+30.d0 !data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_Count%KellyOldStatus(1) = data%State%TD_Count%KellyNewStatus(1) - data%State%TD_Count%KellyOldStatus(3) = 0 - end if - !print*, 'data%State%TD_StConn%ConnectionHeight1=' , data%State%TD_StConn%ConnectionHeight - if ( Get_Slips() == SLIPS_SET_END ) then - !!if ( data%State%TD_StConn%HookVelocity>0. ) then - !! Print*, '*** UnSet Slips ***' !????????? - !!end if - data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) !????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - else - !if (data%State%TD_String%DlTouch<=0. .and. data%State%TD_StConn%HookVelocity<=0.) then - ! data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - ! data%State%TD_StConn%StringVelocity = 0.0d0 - !else - data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) !?????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%KellyConnectionHeight - data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity - !end if - end if - - else if ( Get_KellyConnection() == KELLY_CONNECTION_NOTHING ) then - data%State%TD_StConn%StringConnectionMode = 2 - !print*, 'data%State%TD_StConn%ConnectionHeight20=' , data%State%TD_StConn%ConnectionHeight - !print*, 'data%State%TD_StConn%KellyElementConst2=' , data%State%TD_StConn%KellyElementConst - if (data%State%TD_Count%KellyOldStatus(1)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%KellyElementConst - data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) - data%State%TD_Count%KellyOldStatus(1) = 0 - else if (data%State%TD_Count%KellyOldStatus(3)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) - data%State%TD_Count%KellyOldStatus(3) = 0 - else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) - data%State%TD_Count%KellyOldStatus(5) = 0 - end if - !print*, 'data%State%TD_StConn%ConnectionHeight2=' , data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%KellyConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_KellyConnection() == KELLY_CONNECTION_SINGLE ) then - !print*, 'KELLY_CONNECTION_SINGLE' , data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringConnectionMode = 3 - !print*, 'data%State%TD_StConn%ConnectionHeight30=' , data%State%TD_StConn%ConnectionHeight - !print*, 'data%State%TD_StConn%KellyElementConst3=' , data%State%TD_StConn%KellyElementConst - !print*, 'data%State%TD_DrillStems(kk)%LengthIni3=' , data%State%TD_DrillStems(kk)%LengthIni - if (data%State%TD_Count%KellyOldStatus(1)==1 .and. data%State%TD_Count%KellyNewStatus(3)/=data%State%TD_Count%KellyOldStatus(3)) then - !print*, 'KELLY_CONNECTION_SINGLE1' , data%State%TD_StConn%ConnectionHeight - !print*, 'data%State%TD_StConn%KellyElementConst=' , data%State%TD_StConn%KellyElementConst - !print*, 'data%State%TD_DrillStems(kk)%LengthIni=' , data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%KellyElementConst-30.d0 !data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_Count%KellyOldStatus(3) = data%State%TD_Count%KellyNewStatus(3) - data%State%TD_Count%KellyOldStatus(1) = 0 - else if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(3)/=data%State%TD_Count%KellyOldStatus(3)) then - !print*, 'KELLY_CONNECTION_SINGLE2' , data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(3) = data%State%TD_Count%KellyNewStatus(3) - data%State%TD_Count%KellyOldStatus(2) = 0 - end if - !print*, 'data%State%TD_StConn%ConnectionHeight3=' , data%State%TD_StConn%ConnectionHeight - !print*, 'KELLY_CONNECTION_SINGLE3' , data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%KellyConst-data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - !print*, 'KELLY_CONNECTION_SINGLE4' , data%State%TD_StConn%ConnectionHeight - end if - !print*, 'KELLY_CONNECTION_SINGLE5' , data%State%TD_StConn%ConnectionHeight - - else if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then - - if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then - data%State%TD_Count%KellyNewStatus(4) = 1 - else - data%State%TD_Count%KellyNewStatus(4) = 0 - !data%State%TD_Count%KellyOldStatus(4) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING) then - data%State%TD_Count%KellyNewStatus(5) = 1 - else - data%State%TD_Count%KellyNewStatus(5) = 0 - !data%State%TD_Count%KellyOldStatus(5) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND) then - data%State%TD_Count%KellyNewStatus(6) = 1 - else - data%State%TD_Count%KellyNewStatus(6) = 0 - !data%State%TD_Count%KellyOldStatus(6) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) then - data%State%TD_Count%KellyNewStatus(7) = 1 - else - data%State%TD_Count%KellyNewStatus(7) = 0 - !data%State%TD_Count%KellyOldStatus(7) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then - data%State%TD_Count%KellyNewStatus(8) = 1 - else - data%State%TD_Count%KellyNewStatus(8) = 0 - !data%State%TD_Count%KellyOldStatus(8) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE) then - data%State%TD_Count%KellyNewStatus(18) = 1 - else - data%State%TD_Count%KellyNewStatus(18) = 0 - !data%State%TD_Count%KellyOldStatus(18) = 0 - end if - - if(Get_ElevatorConnection() == ELEVATOR_LATCH_STAND) then - data%State%TD_Count%KellyNewStatus(19) = 1 - else - data%State%TD_Count%KellyNewStatus(19) = 0 - !data%State%TD_Count%KellyOldStatus(19) = 0 - end if - - - if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING ) then - data%State%TD_StConn%StringConnectionMode = 4 - if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) - data%State%TD_Count%KellyOldStatus(6) = 0 - else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) - data%State%TD_Count%KellyOldStatus(7) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) - data%State%TD_Count%KellyOldStatus(8) = 0 - end if - if ( Get_Slips() == SLIPS_SET_END ) then - !if ( data%State%TD_StConn%HookVelocity>0. ) then - ! Print*, '*** UnSet Slips ***' !??????????????????? - !end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - else - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst+(LengthSum+data%State%TD_StConn%ElevatorECG) !(LengthSum+data%State%TD_DrillStems(kk)%ToolJointRange) - data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity - end if - - else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then - data%State%TD_StConn%StringConnectionMode = 5 - if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) - data%State%TD_Count%KellyOldStatus(4) = 0 - else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) - data%State%TD_Count%KellyOldStatus(6) = 0 - else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) - data%State%TD_Count%KellyOldStatus(7) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) - data%State%TD_Count%KellyOldStatus(8) = 0 - else if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) - data%State%TD_Count%KellyOldStatus(2) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND ) then - data%State%TD_StConn%StringConnectionMode = 6 - if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) - data%State%TD_Count%KellyOldStatus(4) = 0 - else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) - data%State%TD_Count%KellyOldStatus(7) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) - data%State%TD_Count%KellyOldStatus(8) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst-(3.*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then - data%State%TD_StConn%StringConnectionMode = 7 - if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) - data%State%TD_Count%KellyOldStatus(4) = 0 - else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) - data%State%TD_Count%KellyOldStatus(6) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) - data%State%TD_Count%KellyOldStatus(8) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst-data%State%TD_DrillStems(kk)%LengthIni - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_STRING ) then - data%State%TD_StConn%StringConnectionMode = 8 - if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) - data%State%TD_Count%KellyOldStatus(4) = 0 - else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) - data%State%TD_Count%KellyOldStatus(6) = 0 - else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) - data%State%TD_Count%KellyOldStatus(7) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then - data%State%TD_StConn%StringConnectionMode = 18 - if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) - data%State%TD_Count%KellyOldStatus(7) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) - data%State%TD_Count%KellyOldStatus(8) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_STAND ) then - data%State%TD_StConn%StringConnectionMode = 19 - if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) - data%State%TD_Count%KellyOldStatus(5) = 0 - else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) - data%State%TD_Count%KellyOldStatus(6) = 0 - else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) - data%State%TD_Count%KellyOldStatus(8) = 0 - end if - data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - end if - - else if ( data%State%TD_StConn%KellyDriveTypeMode==2 ) then - - if( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - data%State%TD_Count%KellyNewStatus(9) = 1 - else - data%State%TD_Count%KellyNewStatus(9) = 0 - !data%State%TD_Count%KellyOldStatus(9) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TD_Count%KellyNewStatus(10) = 1 - else - data%State%TD_Count%KellyNewStatus(10) = 0 - !data%State%TD_Count%KellyOldStatus(10) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then - data%State%TD_Count%KellyNewStatus(11) = 1 - else - data%State%TD_Count%KellyNewStatus(11) = 0 - !data%State%TD_Count%KellyOldStatus(11) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then - data%State%TD_Count%KellyNewStatus(12) = 1 - else - data%State%TD_Count%KellyNewStatus(12) = 0 - !data%State%TD_Count%KellyOldStatus(12) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%TD_Count%KellyNewStatus(13) = 1 - else - data%State%TD_Count%KellyNewStatus(13) = 0 - !data%State%TD_Count%KellyOldStatus(13) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then - data%State%TD_Count%KellyNewStatus(14) = 1 - else - data%State%TD_Count%KellyNewStatus(14) = 0 - !data%State%TD_Count%KellyOldStatus(14) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then - data%State%TD_Count%KellyNewStatus(15) = 1 - else - data%State%TD_Count%KellyNewStatus(15) = 0 - !data%State%TD_Count%KellyOldStatus(15) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then - data%State%TD_Count%KellyNewStatus(16) = 1 - else - data%State%TD_Count%KellyNewStatus(16) = 0 - !data%State%TD_Count%KellyOldStatus(16) = 0 - end if - - if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then - data%State%TD_Count%KellyNewStatus(17) = 1 - else - data%State%TD_Count%KellyNewStatus(17) = 0 - !data%State%TD_Count%KellyOldStatus(17) = 0 - end if - - if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then - data%State%TD_StConn%StringConnectionMode = 9 - if (data%State%TD_Count%KellyOldStatus(10)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) - data%State%TD_Count%KellyOldStatus(10) = 0 - else if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) - data%State%TD_Count%KellyOldStatus(11) = 0 - else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) - data%State%TD_Count%KellyOldStatus(13) = 0 - end if - if ( Get_Slips() == SLIPS_SET_END ) then - !if ( data%State%TD_StConn%HookVelocity>0. ) then - ! Print*, '*** UnSet Slips ***' !??????????????????? - !end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - else - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%TDSHeight - data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity - end if - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then - data%State%TD_StConn%StringConnectionMode = 10 - if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(10)/=data%State%TD_Count%KellyOldStatus(10)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(10) = data%State%TD_Count%KellyNewStatus(10) - data%State%TD_Count%KellyOldStatus(9) = 0 - end if - if ( Get_Slips() == SLIPS_SET_END ) then - !if ( data%State%TD_StConn%HookVelocity>0. ) then - ! Print*, '*** UnSet Slips ***' !??????????????????? - !end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - else - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%TDSHeight - data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity - end if - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then - data%State%TD_StConn%StringConnectionMode = 11 - if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) - data%State%TD_Count%KellyOldStatus(9) = 0 - else if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) - data%State%TD_Count%KellyOldStatus(12) = 0 - else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) - data%State%TD_Count%KellyOldStatus(13) = 0 - else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) - data%State%TD_Count%KellyOldStatus(16) = 0 - else if (data%State%TD_Count%KellyOldStatus(17)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) - data%State%TD_Count%KellyOldStatus(17) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then - data%State%TD_StConn%StringConnectionMode = 12 - if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) - data%State%TD_Count%KellyOldStatus(11) = 0 - else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) - data%State%TD_Count%KellyOldStatus(14) = 0 - else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) - data%State%TD_Count%KellyOldStatus(15) = 0 - end if - if ( Get_Slips() == SLIPS_SET_END ) then - !if ( data%State%TD_StConn%HookVelocity>0. ) then - ! Print*, '*** UnSet Slips ***' !??????????????????? - !end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - else - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength+(LengthSum+data%State%TD_StConn%TDSElevatorECG) !????????????? - data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity - end if - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then - data%State%TD_StConn%StringConnectionMode = 13 - if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(9) = 0 - else if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(11) = 0 - else if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(12) = 0 - else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(14) = 0 - else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(15) = 0 - else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) - data%State%TD_Count%KellyOldStatus(16) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then - data%State%TD_StConn%StringConnectionMode = 14 - if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) - data%State%TD_Count%KellyOldStatus(12) = 0 - else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) - data%State%TD_Count%KellyOldStatus(13) = 0 - else if (data%State%TD_Count%KellyOldStatus(17)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) - data%State%TD_Count%KellyOldStatus(17) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then - data%State%TD_StConn%StringConnectionMode = 15 - if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) - data%State%TD_Count%KellyOldStatus(12) = 0 - else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) - data%State%TD_Count%KellyOldStatus(13) = 0 - else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) - data%State%TD_Count%KellyOldStatus(16) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then - data%State%TD_StConn%StringConnectionMode = 16 - if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) - data%State%TD_Count%KellyOldStatus(11) = 0 - else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) - data%State%TD_Count%KellyOldStatus(13) = 0 - else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) - data%State%TD_Count%KellyOldStatus(15) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - - else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then - data%State%TD_StConn%StringConnectionMode = 17 - if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(17)/=data%State%TD_Count%KellyOldStatus(17)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(17) = data%State%TD_Count%KellyNewStatus(17) - data%State%TD_Count%KellyOldStatus(11) = 0 - else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(17)/=data%State%TD_Count%KellyOldStatus(17)) then - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) - data%State%TD_Count%KellyOldStatus(17) = data%State%TD_Count%KellyNewStatus(17) - data%State%TD_Count%KellyOldStatus(14) = 0 - end if - data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? - data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? - data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight - data%State%TD_StConn%StringVelocity = 0.0d0 - end if - - - end if - - !Print*, 'data%State%TD_StConn%StringConnectionMode=' , data%State%TD_StConn%StringConnectionMode - !print* , 'data%State%TD_StConn%ConnectionHeight=' , data%State%TD_StConn%ConnectionHeight - !Print*, 'data%State%TD_StConn%StringConnectionMode=' , data%State%TD_StConn%StringConnectionMode - !print*, 'data%State%TD_String%DrillStemComponentsNumbs=' , data%State%TD_String%DrillStemComponentsNumbs - !!Print*, 'data%State%TD_Count%KellyNewStatus(1)=' , data%State%TD_Count%KellyNewStatus(1) - !Print*, 'data%State%TD_Count%KellyOldStatus(1)=' , data%State%TD_Count%KellyOldStatus(1) - !Print*, 'data%State%TD_Count%KellyNewStatus(2)=' , data%State%TD_Count%KellyNewStatus(2) - !Print*, 'data%State%TD_Count%KellyOldStatus(2)=' , data%State%TD_Count%KellyOldStatus(2) - !Print*, 'data%State%TD_Count%KellyNewStatus(3)=' , data%State%TD_Count%KellyNewStatus(3) - !Print*, 'data%State%TD_Count%KellyOldStatus(3)=' , data%State%TD_Count%KellyOldStatus(3) - - - - - - - if ( (any(data%State%TD_StConn%StringConnectionMode==(/1,9,10/))) .or. data%EquipmentControl%DrillingConsole%CloseSafetyValve==.true. ) then !for fluid module - data%State%TD_StConn%FluidStringConnectionMode = 1 !string is connected - !else if ( (any(data%State%TD_StConn%StringConnectionMode==(/1,9,10/))) .or. data%EquipmentControl%DrillingConsole%CloseSafetyValve==.true. ) then - ! - else - data%State%TD_StConn%FluidStringConnectionMode = 0 !string is not connected - end if - - - - - - -!==================================================== -! Zero String Speed -!==================================================== - if ( abs(data%State%TD_StConn%StringVelocity)<=0.05d0 ) then ! [ft/s] - data%State%TD_Load%ZeroStringSpeed = 1 - Call Set_ZeroStringSpeed(.true.) - else - data%State%TD_Load%ZeroStringSpeed = 0 - Call Set_ZeroStringSpeed(.false.) - end if - - - - - - - +subroutine TD_StringConnectionModes + + use CHoistingVariables + use SimulationVariables + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use UnitySignalVariables + use UnitySignalsModule +! use OperationScenariosModule +! use OperationScenariosModule !!CElevator... +! Use CSlipsEnumVariables +! use UnitySignalsModuleVariables + use SoftwareInputsVariables +! Use CZeroStringSpeed +! use UnitySignalsModule +! Use CTdsElevatorModesEnumVariables + use OperationScenariosModule + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + use SimulationVariables !@!, only: Drawworks + + + + implicit none + integer :: i , kk + Real(8) :: LengthSum + + + + + + + + !!=====> Read Data + !kk = 0 + !LengthSum = 0.d0 + ! + !Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + ! if (data%State%TD_DrillStems(i)%ComponentType==3) then + ! kk = i + ! exit + ! else if (data%State%TD_DrillStems(i)%ComponentType==5 .or. data%State%TD_DrillStems(i)%ComponentType==7) then + ! LengthSum = LengthSum+data%State%TD_DrillStems(i)%LengthIni + ! end if + !End Do + + + + + + + + !####C_Program -----> data%Configuration%Hoisting%DriveType = + ! = 0 TopDrive_DriveType + ! = 1 Kelly_DriveType + + !####C_Program -----> data%State%TD_StConn%KellyDriveTypeMode = + ! = 0 Drill Mode (Kelly) + ! = 1 Trip Mode (Elevator) + ! = 2 TopDrive Mode + + if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_DRILL ) then + data%State%TD_StConn%KellyDriveTypeMode = 0 + else if ( data%Configuration%Hoisting%DriveType==1 .and. Get_OperationCondition()==OPERATION_TRIP ) then + data%State%TD_StConn%KellyDriveTypeMode = 1 + else if ( data%Configuration%Hoisting%DriveType==0 ) then + data%State%TD_StConn%KellyDriveTypeMode = 2 + end if + + data%State%TD_StConn%HookHeight = data%State%Drawworks%TDHookHeight ! unit: [ft] + data%State%TD_StConn%ElevatorConst = 17.985d0 ! [ft] Elevator Length(14.84) ????????????????? adad ha daghigh shavand + data%State%TD_StConn%ElevatorECG = data%State%OperationScenario%ECG ! [ft] + data%State%TD_StConn%KellyConst = 63.280d0 ! [ft] Kelly Length(61.74) + Safety Valve Length(1.54) + data%State%TD_StConn%KellyElementConst = 41.840d0 ! [ft] Kelly Element Length(40.3) + Safety Valve Length(1.54) + data%State%TD_StConn%TDSLength = 24.08d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSToolJointLength = 0.77d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSElevatorLength = 26.837d0 !?????? ! TDS with Elevator Length [ft] + data%State%TD_StConn%TDSElevatorToolLength= 0.859d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSElevatorECG = 2.454d0 ! [ft] + data%State%TD_Load%NumOfCables = data%Configuration%Hoisting%NumberOfLine + data%State%TD_Load%WeightTB = data%Configuration%Hoisting%TravelingBlockWeight ! [lb] + data%State%TD_Load%WeightTD = data%Configuration%Hoisting%TopDriveWeight ! [lb] + data%State%TD_Load%KellyWeight = data%Configuration%Hoisting%KellyWeight ! [lb] + + + + + + + + + !=====> Velocity Calculation + data%State%TD_StConn%HookVelocity = (data%State%TD_StConn%HookHeight-data%State%TD_StConn%HookHeightOld)/data%State%TD_General%TimeStep ! [ft/s] + + + + + + + + + +!==================================================== +! Add or Remove DrillStem Components +!==================================================== + Call TD_AddComponents + + Call TD_RemoveComponents + + + !=====> Read Data + kk = 0 + LengthSum = 0.d0 + + Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + else if (data%State%TD_DrillStems(i)%ComponentType==5 .or. data%State%TD_DrillStems(i)%ComponentType==7) then + LengthSum = LengthSum+data%State%TD_DrillStems(i)%LengthIni + end if + End Do + !print*, 'kk' , kk + !print*, 'data%State%TD_DrillStems(kk)%LengthIni0=' , data%State%TD_DrillStems(kk)%LengthIni + + + + +!==================================================== +! String Connection Mode Determination +!==================================================== + + !####data%State%TD_StConn%StringConnectionMode = + ! = 0 Slips Set ??????? + ! = 1 Kelly Connected to String + ! = 2 Kelly Nothing Connected + ! = 3 Kelly Connected to Single + ! = 4 Elevator Connected to String + ! = 5 Elevator Nothing Connected + ! = 6 Elevator Connected to Stand + ! = 7 Elevator Connected to Single + ! = 8 Elevator Latch String + ! = 18 Elevator Latch Single + ! = 19 Elevator Latch Stand + ! = 9 TDS CONNECTION SPINE + ! = 10 TDS CONNECTION STRING + ! = 11 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH STRING + ! = 12 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION STRING + ! = 13 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION NOTHING + ! = 14 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION STAND + ! = 15 TDS CONNECTION NOTHING .and. TDS ELEVATOR CONNECTION SINGLE + ! = 16 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH SINGLE + ! = 17 TDS CONNECTION NOTHING .and. TDS ELEVATOR LATCH STAND + + + + + + !if (data%State%TD_String%DlTouch<=0.) then ![ft] + ! if(data%State%TD_StConn%HookVelocity<=0.) then + ! data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + ! data%State%TD_StConn%StringVelocity = 0.0d0 + ! return + ! end if + !end if + + + + !=====> Connection Height Determination + + if ( data%State%TD_StConn%KellyDriveTypeMode==0 ) then + + if(Get_KellyConnection() == KELLY_CONNECTION_STRING) then + data%State%TD_Count%KellyNewStatus(1) = 1 + else + data%State%TD_Count%KellyNewStatus(1) = 0 + !data%State%TD_Count%KellyOldStatus(1) = 0 + end if + + if(Get_KellyConnection()==KELLY_CONNECTION_NOTHING) then + data%State%TD_Count%KellyNewStatus(2) = 1 + else + data%State%TD_Count%KellyNewStatus(2) = 0 + !data%State%TD_Count%KellyOldStatus(2) = 0 + end if + + if(Get_KellyConnection()==KELLY_CONNECTION_SINGLE) then + data%State%TD_Count%KellyNewStatus(3) = 1 + else + data%State%TD_Count%KellyNewStatus(3) = 0 + !data%State%TD_Count%KellyOldStatus(3) = 0 + end if + + + if ( Get_KellyConnection() == KELLY_CONNECTION_STRING ) then + data%State%TD_StConn%StringConnectionMode = 1 + !print*, 'data%State%TD_StConn%ConnectionHeight10=' , data%State%TD_StConn%ConnectionHeight + !print*, 'data%State%TD_StConn%KellyElementConst1=' , data%State%TD_StConn%KellyElementConst + !print*, 'data%State%TD_DrillStems(kk)%LengthIni1=' , data%State%TD_DrillStems(kk)%LengthIni + if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(1)/=data%State%TD_Count%KellyOldStatus(1)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_StConn%KellyElementConst + data%State%TD_Count%KellyOldStatus(1) = data%State%TD_Count%KellyNewStatus(1) + data%State%TD_Count%KellyOldStatus(2) = 0 + else if (data%State%TD_Count%KellyOldStatus(3)==1 .and. data%State%TD_Count%KellyNewStatus(1)/=data%State%TD_Count%KellyOldStatus(1)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_StConn%KellyElementConst+30.d0 !data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_Count%KellyOldStatus(1) = data%State%TD_Count%KellyNewStatus(1) + data%State%TD_Count%KellyOldStatus(3) = 0 + end if + !print*, 'data%State%TD_StConn%ConnectionHeight1=' , data%State%TD_StConn%ConnectionHeight + if ( Get_Slips() == SLIPS_SET_END ) then + !!if ( data%State%TD_StConn%HookVelocity>0. ) then + !! Print*, '*** UnSet Slips ***' !????????? + !!end if + data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) !????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + else + !if (data%State%TD_String%DlTouch<=0. .and. data%State%TD_StConn%HookVelocity<=0.) then + ! data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + ! data%State%TD_StConn%StringVelocity = 0.0d0 + !else + data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-(data%State%TD_StConn%KellyConst-data%State%TD_StConn%KellyElementConst) !?????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%KellyConnectionHeight + data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity + !end if + end if + + else if ( Get_KellyConnection() == KELLY_CONNECTION_NOTHING ) then + data%State%TD_StConn%StringConnectionMode = 2 + !print*, 'data%State%TD_StConn%ConnectionHeight20=' , data%State%TD_StConn%ConnectionHeight + !print*, 'data%State%TD_StConn%KellyElementConst2=' , data%State%TD_StConn%KellyElementConst + if (data%State%TD_Count%KellyOldStatus(1)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%KellyElementConst + data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) + data%State%TD_Count%KellyOldStatus(1) = 0 + else if (data%State%TD_Count%KellyOldStatus(3)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) + data%State%TD_Count%KellyOldStatus(3) = 0 + else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(2)/=data%State%TD_Count%KellyOldStatus(2)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(2) = data%State%TD_Count%KellyNewStatus(2) + data%State%TD_Count%KellyOldStatus(5) = 0 + end if + !print*, 'data%State%TD_StConn%ConnectionHeight2=' , data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%KellyConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_KellyConnection() == KELLY_CONNECTION_SINGLE ) then + !print*, 'KELLY_CONNECTION_SINGLE' , data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringConnectionMode = 3 + !print*, 'data%State%TD_StConn%ConnectionHeight30=' , data%State%TD_StConn%ConnectionHeight + !print*, 'data%State%TD_StConn%KellyElementConst3=' , data%State%TD_StConn%KellyElementConst + !print*, 'data%State%TD_DrillStems(kk)%LengthIni3=' , data%State%TD_DrillStems(kk)%LengthIni + if (data%State%TD_Count%KellyOldStatus(1)==1 .and. data%State%TD_Count%KellyNewStatus(3)/=data%State%TD_Count%KellyOldStatus(3)) then + !print*, 'KELLY_CONNECTION_SINGLE1' , data%State%TD_StConn%ConnectionHeight + !print*, 'data%State%TD_StConn%KellyElementConst=' , data%State%TD_StConn%KellyElementConst + !print*, 'data%State%TD_DrillStems(kk)%LengthIni=' , data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_StConn%KellyElementConst-30.d0 !data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_Count%KellyOldStatus(3) = data%State%TD_Count%KellyNewStatus(3) + data%State%TD_Count%KellyOldStatus(1) = 0 + else if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(3)/=data%State%TD_Count%KellyOldStatus(3)) then + !print*, 'KELLY_CONNECTION_SINGLE2' , data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(3) = data%State%TD_Count%KellyNewStatus(3) + data%State%TD_Count%KellyOldStatus(2) = 0 + end if + !print*, 'data%State%TD_StConn%ConnectionHeight3=' , data%State%TD_StConn%ConnectionHeight + !print*, 'KELLY_CONNECTION_SINGLE3' , data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%KellyConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%KellyConst-data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + !print*, 'KELLY_CONNECTION_SINGLE4' , data%State%TD_StConn%ConnectionHeight + end if + !print*, 'KELLY_CONNECTION_SINGLE5' , data%State%TD_StConn%ConnectionHeight + + else if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then + + if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING) then + data%State%TD_Count%KellyNewStatus(4) = 1 + else + data%State%TD_Count%KellyNewStatus(4) = 0 + !data%State%TD_Count%KellyOldStatus(4) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING) then + data%State%TD_Count%KellyNewStatus(5) = 1 + else + data%State%TD_Count%KellyNewStatus(5) = 0 + !data%State%TD_Count%KellyOldStatus(5) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND) then + data%State%TD_Count%KellyNewStatus(6) = 1 + else + data%State%TD_Count%KellyNewStatus(6) = 0 + !data%State%TD_Count%KellyOldStatus(6) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE) then + data%State%TD_Count%KellyNewStatus(7) = 1 + else + data%State%TD_Count%KellyNewStatus(7) = 0 + !data%State%TD_Count%KellyOldStatus(7) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_LATCH_STRING) then + data%State%TD_Count%KellyNewStatus(8) = 1 + else + data%State%TD_Count%KellyNewStatus(8) = 0 + !data%State%TD_Count%KellyOldStatus(8) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE) then + data%State%TD_Count%KellyNewStatus(18) = 1 + else + data%State%TD_Count%KellyNewStatus(18) = 0 + !data%State%TD_Count%KellyOldStatus(18) = 0 + end if + + if(Get_ElevatorConnection() == ELEVATOR_LATCH_STAND) then + data%State%TD_Count%KellyNewStatus(19) = 1 + else + data%State%TD_Count%KellyNewStatus(19) = 0 + !data%State%TD_Count%KellyOldStatus(19) = 0 + end if + + + if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_STRING ) then + data%State%TD_StConn%StringConnectionMode = 4 + if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) + data%State%TD_Count%KellyOldStatus(6) = 0 + else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) + data%State%TD_Count%KellyOldStatus(7) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(4)/=data%State%TD_Count%KellyOldStatus(4)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(4) = data%State%TD_Count%KellyNewStatus(4) + data%State%TD_Count%KellyOldStatus(8) = 0 + end if + if ( Get_Slips() == SLIPS_SET_END ) then + !if ( data%State%TD_StConn%HookVelocity>0. ) then + ! Print*, '*** UnSet Slips ***' !??????????????????? + !end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + else + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst+(LengthSum+data%State%TD_StConn%ElevatorECG) !(LengthSum+data%State%TD_DrillStems(kk)%ToolJointRange) + data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity + end if + + else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_NOTHING ) then + data%State%TD_StConn%StringConnectionMode = 5 + if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) + data%State%TD_Count%KellyOldStatus(4) = 0 + else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) + data%State%TD_Count%KellyOldStatus(6) = 0 + else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) + data%State%TD_Count%KellyOldStatus(7) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) + data%State%TD_Count%KellyOldStatus(8) = 0 + else if (data%State%TD_Count%KellyOldStatus(2)==1 .and. data%State%TD_Count%KellyNewStatus(5)/=data%State%TD_Count%KellyOldStatus(5)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(5) = data%State%TD_Count%KellyNewStatus(5) + data%State%TD_Count%KellyOldStatus(2) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_STAND ) then + data%State%TD_StConn%StringConnectionMode = 6 + if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) + data%State%TD_Count%KellyOldStatus(4) = 0 + else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) + data%State%TD_Count%KellyOldStatus(7) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(6)/=data%State%TD_Count%KellyOldStatus(6)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(6) = data%State%TD_Count%KellyNewStatus(6) + data%State%TD_Count%KellyOldStatus(8) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst-(3.*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_ElevatorConnection() == ELEVATOR_CONNECTION_SINGLE ) then + data%State%TD_StConn%StringConnectionMode = 7 + if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) + data%State%TD_Count%KellyOldStatus(4) = 0 + else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) + data%State%TD_Count%KellyOldStatus(6) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(7)/=data%State%TD_Count%KellyOldStatus(7)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(7) = data%State%TD_Count%KellyNewStatus(7) + data%State%TD_Count%KellyOldStatus(8) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst-data%State%TD_DrillStems(kk)%LengthIni + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_STRING ) then + data%State%TD_StConn%StringConnectionMode = 8 + if (data%State%TD_Count%KellyOldStatus(4)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) + data%State%TD_Count%KellyOldStatus(4) = 0 + else if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) + data%State%TD_Count%KellyOldStatus(6) = 0 + else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(8)/=data%State%TD_Count%KellyOldStatus(8)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(8) = data%State%TD_Count%KellyNewStatus(8) + data%State%TD_Count%KellyOldStatus(7) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_SINGLE ) then + data%State%TD_StConn%StringConnectionMode = 18 + if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(7)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) + data%State%TD_Count%KellyOldStatus(7) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(18)/=data%State%TD_Count%KellyOldStatus(18)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(18) = data%State%TD_Count%KellyNewStatus(18) + data%State%TD_Count%KellyOldStatus(8) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_ElevatorConnection() == ELEVATOR_LATCH_STAND ) then + data%State%TD_StConn%StringConnectionMode = 19 + if (data%State%TD_Count%KellyOldStatus(5)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) + data%State%TD_Count%KellyOldStatus(5) = 0 + else if (data%State%TD_Count%KellyOldStatus(6)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) + data%State%TD_Count%KellyOldStatus(6) = 0 + else if (data%State%TD_Count%KellyOldStatus(8)==1 .and. data%State%TD_Count%KellyNewStatus(19)/=data%State%TD_Count%KellyOldStatus(19)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(19) = data%State%TD_Count%KellyNewStatus(19) + data%State%TD_Count%KellyOldStatus(8) = 0 + end if + data%State%TD_StConn%ElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%ElevatorConst + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + end if + + else if ( data%State%TD_StConn%KellyDriveTypeMode==2 ) then + + if( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + data%State%TD_Count%KellyNewStatus(9) = 1 + else + data%State%TD_Count%KellyNewStatus(9) = 0 + !data%State%TD_Count%KellyOldStatus(9) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TD_Count%KellyNewStatus(10) = 1 + else + data%State%TD_Count%KellyNewStatus(10) = 0 + !data%State%TD_Count%KellyOldStatus(10) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then + data%State%TD_Count%KellyNewStatus(11) = 1 + else + data%State%TD_Count%KellyNewStatus(11) = 0 + !data%State%TD_Count%KellyOldStatus(11) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then + data%State%TD_Count%KellyNewStatus(12) = 1 + else + data%State%TD_Count%KellyNewStatus(12) = 0 + !data%State%TD_Count%KellyOldStatus(12) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%TD_Count%KellyNewStatus(13) = 1 + else + data%State%TD_Count%KellyNewStatus(13) = 0 + !data%State%TD_Count%KellyOldStatus(13) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then + data%State%TD_Count%KellyNewStatus(14) = 1 + else + data%State%TD_Count%KellyNewStatus(14) = 0 + !data%State%TD_Count%KellyOldStatus(14) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then + data%State%TD_Count%KellyNewStatus(15) = 1 + else + data%State%TD_Count%KellyNewStatus(15) = 0 + !data%State%TD_Count%KellyOldStatus(15) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then + data%State%TD_Count%KellyNewStatus(16) = 1 + else + data%State%TD_Count%KellyNewStatus(16) = 0 + !data%State%TD_Count%KellyOldStatus(16) = 0 + end if + + if( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then + data%State%TD_Count%KellyNewStatus(17) = 1 + else + data%State%TD_Count%KellyNewStatus(17) = 0 + !data%State%TD_Count%KellyOldStatus(17) = 0 + end if + + if ( Get_TdsConnectionModes()==TDS_CONNECTION_SPINE ) then + data%State%TD_StConn%StringConnectionMode = 9 + if (data%State%TD_Count%KellyOldStatus(10)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) + data%State%TD_Count%KellyOldStatus(10) = 0 + else if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) + data%State%TD_Count%KellyOldStatus(11) = 0 + else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(9)/=data%State%TD_Count%KellyOldStatus(9)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(9) = data%State%TD_Count%KellyNewStatus(9) + data%State%TD_Count%KellyOldStatus(13) = 0 + end if + if ( Get_Slips() == SLIPS_SET_END ) then + !if ( data%State%TD_StConn%HookVelocity>0. ) then + ! Print*, '*** UnSet Slips ***' !??????????????????? + !end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + else + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%TDSHeight + data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity + end if + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_STRING ) then + data%State%TD_StConn%StringConnectionMode = 10 + if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(10)/=data%State%TD_Count%KellyOldStatus(10)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(10) = data%State%TD_Count%KellyNewStatus(10) + data%State%TD_Count%KellyOldStatus(9) = 0 + end if + if ( Get_Slips() == SLIPS_SET_END ) then + !if ( data%State%TD_StConn%HookVelocity>0. ) then + ! Print*, '*** UnSet Slips ***' !??????????????????? + !end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + else + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSToolJointLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%TDSHeight + data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity + end if + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STRING ) then + data%State%TD_StConn%StringConnectionMode = 11 + if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) + data%State%TD_Count%KellyOldStatus(9) = 0 + else if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) + data%State%TD_Count%KellyOldStatus(12) = 0 + else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) + data%State%TD_Count%KellyOldStatus(13) = 0 + else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) + data%State%TD_Count%KellyOldStatus(16) = 0 + else if (data%State%TD_Count%KellyOldStatus(17)==1 .and. data%State%TD_Count%KellyNewStatus(11)/=data%State%TD_Count%KellyOldStatus(11)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(11) = data%State%TD_Count%KellyNewStatus(11) + data%State%TD_Count%KellyOldStatus(17) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STRING ) then + data%State%TD_StConn%StringConnectionMode = 12 + if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) + data%State%TD_Count%KellyOldStatus(11) = 0 + else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) + data%State%TD_Count%KellyOldStatus(14) = 0 + else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(12)/=data%State%TD_Count%KellyOldStatus(12)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(12) = data%State%TD_Count%KellyNewStatus(12) + data%State%TD_Count%KellyOldStatus(15) = 0 + end if + if ( Get_Slips() == SLIPS_SET_END ) then + !if ( data%State%TD_StConn%HookVelocity>0. ) then + ! Print*, '*** UnSet Slips ***' !??????????????????? + !end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + else + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength+(LengthSum+data%State%TD_StConn%TDSElevatorECG) !????????????? + data%State%TD_StConn%StringVelocity = data%State%TD_StConn%HookVelocity + end if + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_NOTHING ) then + data%State%TD_StConn%StringConnectionMode = 13 + if (data%State%TD_Count%KellyOldStatus(9)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(9) = 0 + else if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(11) = 0 + else if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(12) = 0 + else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(14) = 0 + else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(15) = 0 + else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(13)/=data%State%TD_Count%KellyOldStatus(13)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(13) = data%State%TD_Count%KellyNewStatus(13) + data%State%TD_Count%KellyOldStatus(16) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_STAND ) then + data%State%TD_StConn%StringConnectionMode = 14 + if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) + data%State%TD_Count%KellyOldStatus(12) = 0 + else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) + data%State%TD_Count%KellyOldStatus(13) = 0 + else if (data%State%TD_Count%KellyOldStatus(17)==1 .and. data%State%TD_Count%KellyNewStatus(14)/=data%State%TD_Count%KellyOldStatus(14)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(14) = data%State%TD_Count%KellyNewStatus(14) + data%State%TD_Count%KellyOldStatus(17) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_CONNECTION_SINGLE ) then + data%State%TD_StConn%StringConnectionMode = 15 + if (data%State%TD_Count%KellyOldStatus(12)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) + data%State%TD_Count%KellyOldStatus(12) = 0 + else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) + data%State%TD_Count%KellyOldStatus(13) = 0 + else if (data%State%TD_Count%KellyOldStatus(16)==1 .and. data%State%TD_Count%KellyNewStatus(15)/=data%State%TD_Count%KellyOldStatus(15)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(15) = data%State%TD_Count%KellyNewStatus(15) + data%State%TD_Count%KellyOldStatus(16) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_SINGLE ) then + data%State%TD_StConn%StringConnectionMode = 16 + if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) + data%State%TD_Count%KellyOldStatus(11) = 0 + else if (data%State%TD_Count%KellyOldStatus(13)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) + data%State%TD_Count%KellyOldStatus(13) = 0 + else if (data%State%TD_Count%KellyOldStatus(15)==1 .and. data%State%TD_Count%KellyNewStatus(16)/=data%State%TD_Count%KellyOldStatus(16)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_Count%KellyOldStatus(16) = data%State%TD_Count%KellyNewStatus(16) + data%State%TD_Count%KellyOldStatus(15) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + + else if ( Get_TdsConnectionModes()==TDS_CONNECTION_NOTHING .and. Get_TdsElevatorModes()==TDS_ELEVATOR_LATCH_STAND ) then + data%State%TD_StConn%StringConnectionMode = 17 + if (data%State%TD_Count%KellyOldStatus(11)==1 .and. data%State%TD_Count%KellyNewStatus(17)/=data%State%TD_Count%KellyOldStatus(17)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight-(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(17) = data%State%TD_Count%KellyNewStatus(17) + data%State%TD_Count%KellyOldStatus(11) = 0 + else if (data%State%TD_Count%KellyOldStatus(14)==1 .and. data%State%TD_Count%KellyNewStatus(17)/=data%State%TD_Count%KellyOldStatus(17)) then + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight+(3.d0*data%State%TD_DrillStems(kk)%LengthIni) + data%State%TD_Count%KellyOldStatus(17) = data%State%TD_Count%KellyNewStatus(17) + data%State%TD_Count%KellyOldStatus(14) = 0 + end if + data%State%TD_StConn%TDSHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSLength !????????????? + data%State%TD_StConn%TDSElevatorHeight = data%State%TD_StConn%HookHeight-data%State%TD_StConn%TDSElevatorLength !????????????? + data%State%TD_StConn%ConnectionHeight = data%State%TD_StConn%ConnectionHeight + data%State%TD_StConn%StringVelocity = 0.0d0 + end if + + + end if + + !Print*, 'data%State%TD_StConn%StringConnectionMode=' , data%State%TD_StConn%StringConnectionMode + !print* , 'data%State%TD_StConn%ConnectionHeight=' , data%State%TD_StConn%ConnectionHeight + !Print*, 'data%State%TD_StConn%StringConnectionMode=' , data%State%TD_StConn%StringConnectionMode + !print*, 'data%State%TD_String%DrillStemComponentsNumbs=' , data%State%TD_String%DrillStemComponentsNumbs + !!Print*, 'data%State%TD_Count%KellyNewStatus(1)=' , data%State%TD_Count%KellyNewStatus(1) + !Print*, 'data%State%TD_Count%KellyOldStatus(1)=' , data%State%TD_Count%KellyOldStatus(1) + !Print*, 'data%State%TD_Count%KellyNewStatus(2)=' , data%State%TD_Count%KellyNewStatus(2) + !Print*, 'data%State%TD_Count%KellyOldStatus(2)=' , data%State%TD_Count%KellyOldStatus(2) + !Print*, 'data%State%TD_Count%KellyNewStatus(3)=' , data%State%TD_Count%KellyNewStatus(3) + !Print*, 'data%State%TD_Count%KellyOldStatus(3)=' , data%State%TD_Count%KellyOldStatus(3) + + + + + + + if ( (any(data%State%TD_StConn%StringConnectionMode==(/1,9,10/))) .or. data%EquipmentControl%DrillingConsole%CloseSafetyValve==.true. ) then !for fluid module + data%State%TD_StConn%FluidStringConnectionMode = 1 !string is connected + !else if ( (any(data%State%TD_StConn%StringConnectionMode==(/1,9,10/))) .or. data%EquipmentControl%DrillingConsole%CloseSafetyValve==.true. ) then + ! + else + data%State%TD_StConn%FluidStringConnectionMode = 0 !string is not connected + end if + + + + + + +!==================================================== +! Zero String Speed +!==================================================== + if ( abs(data%State%TD_StConn%StringVelocity)<=0.05d0 ) then ! [ft/s] + data%State%TD_Load%ZeroStringSpeed = 1 + Call Set_ZeroStringSpeed(.true.) + else + data%State%TD_Load%ZeroStringSpeed = 0 + Call Set_ZeroStringSpeed(.false.) + end if + + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 b/TorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 index 69f4a11..22c13ef 100644 --- a/TorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 +++ b/TorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 @@ -1,28 +1,28 @@ -subroutine TD_WellElementsConfiguration - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i, j - - -!==================================================== -! Modified Well Elements Data -!==================================================== - - Do i = 1 , data%State%TD_WellEl%ROPHoleNumbs - !data%State%TD_ROPHole(i)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth - data%State%TD_ROPHole(i)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth - data%State%TD_ROPHole(i)%Length = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength - data%State%TD_ROPHole(i)%Id = data%State%TD_ROPHole(i)%Id !!??????????? - End Do - - - - - +subroutine TD_WellElementsConfiguration + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i, j + + +!==================================================== +! Modified Well Elements Data +!==================================================== + + Do i = 1 , data%State%TD_WellEl%ROPHoleNumbs + !data%State%TD_ROPHole(i)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth + data%State%TD_ROPHole(i)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth + data%State%TD_ROPHole(i)%Length = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength + data%State%TD_ROPHole(i)%Id = data%State%TD_ROPHole(i)%Id !!??????????? + End Do + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 b/TorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 index 8b348da..734434f 100644 --- a/TorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 +++ b/TorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 @@ -1,52 +1,52 @@ -subroutine TD_WellGeoConfiguration - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use sROP_Variables - use CDataDisplayConsole - use SimulationVariables - use CWarnings - - - - implicit none - - -!==================================================== -! Well Geometry Data Modification -!==================================================== - - -!=====> ROP Calculation - if ( data%State%TD_DrillStems(1)%ComponentType==0 .and. data%Warnings%MaximumWellDepthExceeded==.false. ) then - Call ROP_MainCalculation - else - data%State%ROP_Bit%RateOfPenetration = 0.d0 - Call Set_ROP(data%State%ROP_Bit%RateOfPenetration) - end if - - - - -!=====> ROPHole Data correction - data%State%TD_WellEl%ROP = (data%State%ROP_Bit%RateOfPenetration/3600.d0) ! [ft/s] - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth++((data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep)*cos(data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle)) - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength+(data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep) !????????check - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth+data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength - - - - - -!=====> Well Total Length Calculation - data%State%TD_WellGeneral%WellTotalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth - data%State%TD_WellGeneral%WellTotalVerticalLength = data%State%TD_WellGeneral%WellTotalVerticalLength+((data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep)*cos(data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle)) - - Call Set_TotalDepth(real(data%State%TD_WellGeneral%WellTotalLength,8)) - - - - +subroutine TD_WellGeoConfiguration + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use sROP_Variables + use CDataDisplayConsole + use SimulationVariables + use CWarnings + + + + implicit none + + +!==================================================== +! Well Geometry Data Modification +!==================================================== + + +!=====> ROP Calculation + if ( data%State%TD_DrillStems(1)%ComponentType==0 .and. data%Warnings%MaximumWellDepthExceeded==.false. ) then + Call ROP_MainCalculation + else + data%State%ROP_Bit%RateOfPenetration = 0.d0 + Call Set_ROP(data%State%ROP_Bit%RateOfPenetration) + end if + + + + +!=====> ROPHole Data correction + data%State%TD_WellEl%ROP = (data%State%ROP_Bit%RateOfPenetration/3600.d0) ! [ft/s] + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth++((data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep)*cos(data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle)) + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength+(data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep) !????????check + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth+data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength + + + + + +!=====> Well Total Length Calculation + data%State%TD_WellGeneral%WellTotalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth + data%State%TD_WellGeneral%WellTotalVerticalLength = data%State%TD_WellGeneral%WellTotalVerticalLength+((data%State%TD_WellEl%ROP*data%State%TD_General%TimeStep)*cos(data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle)) + + Call Set_TotalDepth(real(data%State%TD_WellGeneral%WellTotalLength,8)) + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 b/TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 index a81f59d..40211f4 100644 --- a/TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 +++ b/TorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 @@ -1,78 +1,78 @@ -subroutine TVD_Calculator(MeasuredDepth,VerticalDepth) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - - - implicit none - - Integer :: kk - REAL(8) :: MeasuredDepth , VerticalDepth - REAL(8) :: mm , nn , dl , StartAngle , EndAngle - - - - - - if ( MeasuredDepth<=0. ) then - VerticalDepth = MeasuredDepth - !data%State%TDGeo%Angle(ii) = 0.d0 - return - end if - - - - mm = 0.d0 !last vertical depth - nn = 0.d0 !last measured depth - EndAngle = data%State%TD_WellGeo(1)%StartAngle - !data%State%TDGeo%Angle(jj) = EndAngle - - do kk = 1, data%State%TD_WellGeneral%WellIntervalsCount - StartAngle = EndAngle - if ( MeasuredDepth>data%State%TD_WellGeo(kk)%TopDepth ) then - if ( MeasuredDepth>data%State%TD_WellGeo(kk)%DownDepth ) then - dl = data%State%TD_WellGeo(kk)%DownDepth-nn ![ft] - nn = data%State%TD_WellGeo(kk)%DownDepth - if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then - EndAngle = StartAngle - VerticalDepth = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) ![ft] - !data%State%TDGeo%Angle(ii) = EndAngle - else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then - EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? - VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) - !data%State%TDGeo%Angle(ii) = EndAngle - else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then - EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? - VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) - !data%State%TDGeo%Angle(ii) = EndAngle - end if - mm = VerticalDepth - else - dl = MeasuredDepth-nn - nn = MeasuredDepth - if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then - EndAngle = StartAngle - VerticalDepth = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) - !data%State%TDGeo%Angle(ii) = EndAngle - else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then - EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? - VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) - !data%State%TDGeo%Angle(ii) = EndAngle - else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then - EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? - VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) - !data%State%TDGeo%Angle(ii) = EndAngle - end if - mm = VerticalDepth - exit - end if - end if - end do - - - - - +subroutine TVD_Calculator(MeasuredDepth,VerticalDepth) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + + + implicit none + + Integer :: kk + REAL(8) :: MeasuredDepth , VerticalDepth + REAL(8) :: mm , nn , dl , StartAngle , EndAngle + + + + + + if ( MeasuredDepth<=0. ) then + VerticalDepth = MeasuredDepth + !data%State%TDGeo%Angle(ii) = 0.d0 + return + end if + + + + mm = 0.d0 !last vertical depth + nn = 0.d0 !last measured depth + EndAngle = data%State%TD_WellGeo(1)%StartAngle + !data%State%TDGeo%Angle(jj) = EndAngle + + do kk = 1, data%State%TD_WellGeneral%WellIntervalsCount + StartAngle = EndAngle + if ( MeasuredDepth>data%State%TD_WellGeo(kk)%TopDepth ) then + if ( MeasuredDepth>data%State%TD_WellGeo(kk)%DownDepth ) then + dl = data%State%TD_WellGeo(kk)%DownDepth-nn ![ft] + nn = data%State%TD_WellGeo(kk)%DownDepth + if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then + EndAngle = StartAngle + VerticalDepth = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) ![ft] + !data%State%TDGeo%Angle(ii) = EndAngle + else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then + EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? + VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) + !data%State%TDGeo%Angle(ii) = EndAngle + else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then + EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? + VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) + !data%State%TDGeo%Angle(ii) = EndAngle + end if + mm = VerticalDepth + else + dl = MeasuredDepth-nn + nn = MeasuredDepth + if ( data%State%TD_WellGeo(kk)%HoleType==0 ) then + EndAngle = StartAngle + VerticalDepth = mm+(dl*cos(data%State%TD_WellGeo(kk)%StartAngle)) + !data%State%TDGeo%Angle(ii) = EndAngle + else if ( data%State%TD_WellGeo(kk)%HoleType==1 ) then + EndAngle = StartAngle+(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? + VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(EndAngle)-abs(StartAngle))*cos(abs(StartAngle)))-(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(EndAngle)-abs(StartAngle)))*sin(abs(StartAngle))) + !data%State%TDGeo%Angle(ii) = EndAngle + else if ( data%State%TD_WellGeo(kk)%HoleType==2 ) then + EndAngle = StartAngle-(dl/data%State%TD_WellGeo(kk)%RCurvature) !????? + VerticalDepth = mm+(data%State%TD_WellGeo(kk)%RCurvature*sin(abs(abs(EndAngle)-abs(StartAngle)))*cos(abs(StartAngle)))+(data%State%TD_WellGeo(kk)%RCurvature*(1.-cos(abs(abs(EndAngle)-abs(StartAngle))))*sin(abs(StartAngle))) + !data%State%TDGeo%Angle(ii) = EndAngle + end if + mm = VerticalDepth + exit + end if + end if + end do + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 b/TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 index 5984047..6bec8e7 100644 --- a/TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 +++ b/TorqueDrag/TD_Forces/TD_BouyancyFactor.f90 @@ -1,32 +1,32 @@ -subroutine TD_BouyancyFactor (i) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - - - - -!==================================================== -! Bouyancy Factor Calculation -!==================================================== - - if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then - data%State%TD_DrillStems(i)%BouyancyFactor = 0.d0 - else - data%State%TD_DrillStems(i)%BouyancyFactor = 1.d0-( ((data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%Od**2)/4.0d0) & - -(data%State%TD_DrillStems(i)%MudDensityIn*(data%State%TD_DrillStems(i)%Id**2)/4.0d0)) & - /(data%State%TD_DrillStems(i)%Density*((data%State%TD_DrillStems(i)%Od**2-data%State%TD_DrillStems(i)%Id**2))/4.0d0) ) - end if - - - - - +subroutine TD_BouyancyFactor (i) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + + + + +!==================================================== +! Bouyancy Factor Calculation +!==================================================== + + if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then + data%State%TD_DrillStems(i)%BouyancyFactor = 0.d0 + else + data%State%TD_DrillStems(i)%BouyancyFactor = 1.d0-( ((data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%Od**2)/4.0d0) & + -(data%State%TD_DrillStems(i)%MudDensityIn*(data%State%TD_DrillStems(i)%Id**2)/4.0d0)) & + /(data%State%TD_DrillStems(i)%Density*((data%State%TD_DrillStems(i)%Od**2-data%State%TD_DrillStems(i)%Id**2))/4.0d0) ) + end if + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 index 737b6d6..cc0683a 100644 --- a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 +++ b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 @@ -1,65 +1,65 @@ -subroutine TD_ForceDownB(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = (data%State%TD_DrillStems(1)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - & - (data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%RCurvature * & - (sin(data%State%TD_DrillStems(1)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef) * & - (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle)) * & - sin(data%State%TD_DrillStems(1)%StartAngle)))) - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & - (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - end if - - - - return - End If - - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - & - (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & - sin(data%State%TD_DrillStems(i)%StartAngle)))) - - - - ! - ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - - data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & - (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - +subroutine TD_ForceDownB(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = (data%State%TD_DrillStems(1)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - & + (data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%RCurvature * & + (sin(data%State%TD_DrillStems(1)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef) * & + (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle)) * & + sin(data%State%TD_DrillStems(1)%StartAngle)))) + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & + (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end if + + + + return + End If + + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - & + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & + sin(data%State%TD_DrillStems(i)%StartAngle)))) + + + + ! + ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + + data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & + (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 index 85e271d..8a41613 100644 --- a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 +++ b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 @@ -1,56 +1,56 @@ -subroutine TD_ForceDownBRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & - data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & - ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & - (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - ! - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - - +subroutine TD_ForceDownBRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & + (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & + data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & + ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & + (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & + (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + ! + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 index bc7fcf4..aafc9e2 100644 --- a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 +++ b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 @@ -1,75 +1,75 @@ -subroutine TD_ForceUpB(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = (data%State%TD_DrillStems(1)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - & - (((data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)**2)) * & - (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(1)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle)) * sin(data%State%TD_DrillStems(1)%StartAngle))))) - & - (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(1)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))* & - cos(data%State%TD_DrillStems(1)%StartAngle))))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & - (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - end if - - - return - End If - - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - & - (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & - (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & - (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & - cos(data%State%TD_DrillStems(i)%StartAngle))))) - ! - ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & - (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - - !!if (data%State%TD_DrillStems(i)%Torque>500.) then - ! print* , 'data%State%TD_String%TotalTorqueb=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque , data%State%TD_String%WeightOnBit , sin(30.) , sin(3.14/6.) - ! print* , 'torquepropertiesb=' , data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint , (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - ! data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) , abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle), & - ! 2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & - ! data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature , (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle)) - ! print* , 'propertiesb=' , data%State%TD_DrillStems(i)%Force2 , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef , data%State%TD_DrillStems(i)%RCurvature - ! !end if - - +subroutine TD_ForceUpB(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = (data%State%TD_DrillStems(1)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - & + (((data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)**2)) * & + (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(1)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle)) * sin(data%State%TD_DrillStems(1)%StartAngle))))) - & + (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(1)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))* & + cos(data%State%TD_DrillStems(1)%StartAngle))))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & + (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end if + + + return + End If + + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - & + (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & + (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & + (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & + cos(data%State%TD_DrillStems(i)%StartAngle))))) + ! + ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) + & + (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + + !!if (data%State%TD_DrillStems(i)%Torque>500.) then + ! print* , 'data%State%TD_String%TotalTorqueb=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque , data%State%TD_String%WeightOnBit , sin(30.) , sin(3.14/6.) + ! print* , 'torquepropertiesb=' , data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint , (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + ! data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) , abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle), & + ! 2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & + ! data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature , (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle)) + ! print* , 'propertiesb=' , data%State%TD_DrillStems(i)%Force2 , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef , data%State%TD_DrillStems(i)%RCurvature + ! !end if + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 index c9e7b0a..be2aa4a 100644 --- a/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 +++ b/TorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 @@ -1,56 +1,56 @@ -subroutine TD_ForceUpBRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & - (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & - data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & - ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & - (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & - (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - ! - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - - +subroutine TD_ForceUpBRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & + (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & + data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & + ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & + (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & + (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + ! + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_CombinedMotionData.f90 b/TorqueDrag/TD_Forces/TD_CombinedMotionData.f90 index 8f53f17..80940af 100644 --- a/TorqueDrag/TD_Forces/TD_CombinedMotionData.f90 +++ b/TorqueDrag/TD_Forces/TD_CombinedMotionData.f90 @@ -1,21 +1,21 @@ -subroutine TD_CombinedMotionData (i) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - - - - data%State%TD_DrillStems(i)%CombVelRatio = atan( data%State%TD_String%DrillStemAxialVelocity/data%State%TD_String%DrillStemRotVelocity ) - - - - - +subroutine TD_CombinedMotionData (i) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + + + + data%State%TD_DrillStems(i)%CombVelRatio = atan( data%State%TD_String%DrillStemAxialVelocity/data%State%TD_String%DrillStemRotVelocity ) + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 index cbcdcde..4acdb6f 100644 --- a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 +++ b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 @@ -1,61 +1,61 @@ -subroutine TD_ForceDownD(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & - (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & - sin(data%State%TD_DrillStems(i)%StartAngle)))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & - (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & - (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & - sin(data%State%TD_DrillStems(i)%StartAngle)))) - ! - ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & - (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - +subroutine TD_ForceDownD(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & + sin(data%State%TD_DrillStems(i)%StartAngle)))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & + (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * & + sin(data%State%TD_DrillStems(i)%StartAngle)))) + ! + ! Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = (TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & + (2.0d0 * TD_SemiMudVisc * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 index 1015e9d..0d6337e 100644 --- a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 +++ b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 @@ -1,56 +1,56 @@ -subroutine TD_ForceDownDRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & - data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & - ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & - (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & - (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - ! - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - - +subroutine TD_ForceDownDRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & + (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & + data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & + ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & + (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & + (exp(-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + ! + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 index 7b7d331..51ecf7d 100644 --- a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 +++ b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 @@ -1,69 +1,69 @@ -subroutine TD_ForceUpD(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & - (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & - (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & - (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & - cos(data%State%TD_DrillStems(i)%StartAngle))))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & - (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - end if - - - - return - End If - - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & - (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & - (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & - (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & - (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & - cos(data%State%TD_DrillStems(i)%StartAngle))))) - - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & - data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & - (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) - !return - +subroutine TD_ForceUpD(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & + (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & + (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & + (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & + cos(data%State%TD_DrillStems(i)%StartAngle))))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & + (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + end if + + + + return + End If + + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = (data%State%TD_DrillStems(i)%Force1 * exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + & + (((data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature) / (1 + (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)) * & + (((1-(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)**2)*(sin(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) * sin(data%State%TD_DrillStems(i)%StartAngle))))) - & + (2.0d0* (TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(cos(data%State%TD_DrillStems(i)%EndAngle) - & + (exp((TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))* & + cos(data%State%TD_DrillStems(i)%StartAngle))))) + + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = (data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * (data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * & + data%State%TD_DrillStems(i)%RCurvature * sin(data%State%TD_DrillStems(i)%StartAngle))) * & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)) - & + (2.0d0 * data%State%TD_DrillStems(i)%MudViscosity * data%State%TD_DrillStems(i)%RtoolJoint * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (cos(data%State%TD_DrillStems(i)%EndAngle) - cos(data%State%TD_DrillStems(i)%StartAngle))) + !return + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 index df7933e..9b4aa58 100644 --- a/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 +++ b/TorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 @@ -1,55 +1,55 @@ -subroutine TD_ForceUpDRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & - (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & - data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & - ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & - (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & - (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & - sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & - (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) - ! - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & - abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) - - +subroutine TD_ForceUpDRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(1)%Force2 = data%State%TD_DrillStems(1)%Force1 + (data%State%TD_DrillStems(1)%Force1 * & + (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(1)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(1)%CombVelRatio )) + (data%State%TD_DrillStems(1)%BouyancyFactor * & + data%State%TD_DrillStems(1)%WeightperLength * data%State%TD_DrillStems(1)%Length * & + ((sin(data%State%TD_DrillStems(1)%EndAngle)-sin(data%State%TD_DrillStems(1)%StartAngle))/ & + (data%State%TD_DrillStems(1)%EndAngle-data%State%TD_DrillStems(1)%StartAngle))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%Force1 * & + (exp(+(TD_SemiMudVisc*data%State%TD_DrillStems(i)%MudVisCorrectCoef)*abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))-1.0d0) * & + sin(data%State%TD_DrillStems(i)%CombVelRatio )) + (data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + ((sin(data%State%TD_DrillStems(i)%EndAngle)-sin(data%State%TD_DrillStems(i)%StartAngle))/ & + (data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle))) + ! + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc*data%State%TD_DrillStems(i)%RtoolJoint*data%State%TD_DrillStems(i)%Force1* & + abs(data%State%TD_DrillStems(i)%EndAngle-data%State%TD_DrillStems(i)%StartAngle)*cos(data%State%TD_DrillStems(i)%CombVelRatio) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_ForceCalculation.f90 b/TorqueDrag/TD_Forces/TD_ForceCalculation.f90 index 6e0d2e7..c27c62e 100644 --- a/TorqueDrag/TD_Forces/TD_ForceCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_ForceCalculation.f90 @@ -1,138 +1,138 @@ -subroutine TD_ForceCalculation - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc - - - - - if (data%State%TD_String%DrillStemForceType == 1) then - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity - if (data%State%TD_DrillStems(i)%HoleType == 0) then - Call TD_ForceUpS(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - Call TD_ForceUpB(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - Call TD_ForceUpD(i,TD_SemiMudVisc) - end if - Call TD_StrainCalculation(i) - Call TD_TorqueCalculation(i) - End Do - - else if (data%State%TD_String%DrillStemForceType == 2) then - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity - if (data%State%TD_DrillStems(i)%HoleType == 0) then - Call TD_ForceUpSRot(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - Call TD_ForceUpBRot(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - Call TD_ForceUpDRot(i,TD_SemiMudVisc) - end if - Call TD_StrainCalculation(i) - Call TD_TorqueCalculation(i) - End Do - - else if (data%State%TD_String%DrillStemForceType == 3) then - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity - if (data%State%TD_DrillStems(i)%HoleType == 0) then - Call TD_ForceDownS(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - Call TD_ForceDownB(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - Call TD_ForceDownD(i,TD_SemiMudVisc) - end if - Call TD_StrainCalculation(i) - Call TD_TorqueCalculation(i) - End Do - - else if (data%State%TD_String%DrillStemForceType == 4) then - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity - if (data%State%TD_DrillStems(i)%HoleType == 0) then - Call TD_ForceDownSRot(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - Call TD_ForceDownBRot(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - Call TD_ForceDownDRot(i,TD_SemiMudVisc) - end if - Call TD_StrainCalculation(i) - Call TD_TorqueCalculation(i) - End Do - - else if (data%State%TD_String%DrillStemForceType == 5) then - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - TD_SemiMudVisc = 0.0d0 - if (data%State%TD_DrillStems(i)%HoleType == 0) then - Call TD_ForceUpS(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - Call TD_ForceUpB(i,TD_SemiMudVisc) - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - Call TD_ForceUpD(i,TD_SemiMudVisc) - end if - Call TD_StrainCalculation(i) - Call TD_TorqueCalculation(i) - End Do - - end if - - - -!----------------------------------------------------------------------------------- -! - !if (data%State%TD_String%DrillStemAxialVelocity>0.) then - ! - ! i = 1 - ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag - ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl - ! - ! do i = 2 , data%State%TD_String%DrillStemComponentsNumbs - ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag - ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl - ! end do - ! !print*, 'i=' ,i - ! !print*, 'data%State%TD_String%DrillStemComponentsNumbs=' ,data%State%TD_String%DrillStemComponentsNumbs - ! - !else if (data%State%TD_String%DrillStemAxialVelocity<0.) then - ! i = 1 - ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag - ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl - ! - ! do i = 2 , data%State%TD_String%DrillStemComponentsNumbs - ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag - ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl - ! end do - !end if - - - data%State%TD_String%DlTotal = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%DlTotal - - - - -!!=====> Modified Length of the Drill Stem -! do i = 1 , data%State%TD_String%DrillStemComponentsNumbs -! data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Dl -! end do - - +subroutine TD_ForceCalculation + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc + + + + + if (data%State%TD_String%DrillStemForceType == 1) then + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity + if (data%State%TD_DrillStems(i)%HoleType == 0) then + Call TD_ForceUpS(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + Call TD_ForceUpB(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + Call TD_ForceUpD(i,TD_SemiMudVisc) + end if + Call TD_StrainCalculation(i) + Call TD_TorqueCalculation(i) + End Do + + else if (data%State%TD_String%DrillStemForceType == 2) then + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity + if (data%State%TD_DrillStems(i)%HoleType == 0) then + Call TD_ForceUpSRot(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + Call TD_ForceUpBRot(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + Call TD_ForceUpDRot(i,TD_SemiMudVisc) + end if + Call TD_StrainCalculation(i) + Call TD_TorqueCalculation(i) + End Do + + else if (data%State%TD_String%DrillStemForceType == 3) then + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity + if (data%State%TD_DrillStems(i)%HoleType == 0) then + Call TD_ForceDownS(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + Call TD_ForceDownB(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + Call TD_ForceDownD(i,TD_SemiMudVisc) + end if + Call TD_StrainCalculation(i) + Call TD_TorqueCalculation(i) + End Do + + else if (data%State%TD_String%DrillStemForceType == 4) then + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + TD_SemiMudVisc = data%State%TD_DrillStems(i)%MudViscosity + if (data%State%TD_DrillStems(i)%HoleType == 0) then + Call TD_ForceDownSRot(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + Call TD_ForceDownBRot(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + Call TD_ForceDownDRot(i,TD_SemiMudVisc) + end if + Call TD_StrainCalculation(i) + Call TD_TorqueCalculation(i) + End Do + + else if (data%State%TD_String%DrillStemForceType == 5) then + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + TD_SemiMudVisc = 0.0d0 + if (data%State%TD_DrillStems(i)%HoleType == 0) then + Call TD_ForceUpS(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + Call TD_ForceUpB(i,TD_SemiMudVisc) + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + Call TD_ForceUpD(i,TD_SemiMudVisc) + end if + Call TD_StrainCalculation(i) + Call TD_TorqueCalculation(i) + End Do + + end if + + + +!----------------------------------------------------------------------------------- +! + !if (data%State%TD_String%DrillStemAxialVelocity>0.) then + ! + ! i = 1 + ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag + ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl + ! + ! do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag + ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl + ! end do + ! !print*, 'i=' ,i + ! !print*, 'data%State%TD_String%DrillStemComponentsNumbs=' ,data%State%TD_String%DrillStemComponentsNumbs + ! + !else if (data%State%TD_String%DrillStemAxialVelocity<0.) then + ! i = 1 + ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag + ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl + ! + ! do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + ! data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag + ! data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%Force2 * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + ! data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl + ! end do + !end if + + + data%State%TD_String%DlTotal = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%DlTotal + + + + +!!=====> Modified Length of the Drill Stem +! do i = 1 , data%State%TD_String%DrillStemComponentsNumbs +! data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%Length + data%State%TD_DrillStems(i)%Dl +! end do + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 b/TorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 index 52ecb03..fd54f5c 100644 --- a/TorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 @@ -1,289 +1,289 @@ -subroutine TD_HookLoadCalculation - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - use SimulationVariables !@, only: Drawworks - use CDataDisplayConsole - use SimulationVariables - use CHoistingVariables - use SimulationVariables -! Use CSlipsEnumVariables - use UnitySignalVariables - use UnitySignalsModule - Use CBopStackVariables - use SimulationVariables - Use CUnityInputs - - - implicit none - - Integer :: i , kk - Real(8) :: TD_eConst=0.98d0 , TD_SumWeight - - - - -!==================================================== -! Torque & Hook Load Calculation -!==================================================== - -!=========> HookLoad - data%State%TD_String%HookLoad = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%Force2 ! [lb] - !print* , 'data%State%TD_String%HookLoad1=' , data%State%TD_String%HookLoad - - if ( data%State%Drawworks%motion==1 ) then - if ( data%State%PipeRam1%Situation_forTD==1 ) then !Upper Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag - end if - if ( data%State%PipeRam2%Situation_forTD==1 ) then !Lower Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag - end if - if ( data%State%RamLine%ShearBop_Situation_forTD==1 ) then !Blind Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag !???????????????????? - end if - if ( data%State%Annular%Annular_Situation_forTD==1 ) then !Annular Preventer - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+(data%State%AnnularComputational%p_annular*data%Configuration%BopStack%AnnularStringDrag) - end if - else if ( data%State%Drawworks%motion==-1 ) then - if ( data%State%PipeRam1%Situation_forTD==1 ) then !Upper Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag - end if - if ( data%State%PipeRam2%Situation_forTD==1 ) then !Lower Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag - end if - if ( data%State%RamLine%ShearBop_Situation_forTD==1 ) then !Blind Ram - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag !???????????????????? - end if - if ( data%State%Annular%Annular_Situation_forTD==1 ) then !Annular Preventer - data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-(data%State%AnnularComputational%p_annular*data%Configuration%BopStack%AnnularStringDrag) - end if - end if - - !print* , 'data%State%TD_String%HookLoad2=' , data%State%TD_String%HookLoad - - - - - - !if ( UpperRamClose_withPossibility==1 ) then - ! if ( data%State%Drawworks%motion==1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag - ! else if ( data%State%Drawworks%motion==-1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag - ! end if - !end if - !if ( LowerRamClose_withPossibility==1 ) then - ! if ( data%State%Drawworks%motion==1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag - ! else if ( data%State%Drawworks%motion==-1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag - ! end if - !end if - !if ( BlindRamClose_withPossibility==1 ) then - ! if ( data%State%Drawworks%motion==1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag - ! else if ( data%State%Drawworks%motion==-1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag - ! end if - !end if - !if ( AnnularPreventerClose_withPossibility==1 ) then - ! if ( data%State%Drawworks%motion==1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+AnnularStringDrag - ! else if ( data%State%Drawworks%motion==-1 ) then - ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-AnnularStringDrag - ! end if - !end if - - - - - - - - -!=========> Torque - data%State%TD_String%StringTorque = data%State%TD_String%TotalTorque ![lb.ft] ?????????? - !print* , 'data%State%TD_String%StringTorque=' , data%State%TD_String%StringTorque - - - - - -!==================================================== -! Weight Indicator Calculation -!==================================================== - - kk = 0 - Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 - if (data%State%TD_DrillStems(i)%ComponentType==3) then - kk = i - exit - end if - End Do - - - - - - if ( data%State%TD_StConn%KellyDriveTypeMode==0 ) then - - if ( data%State%TD_StConn%StringConnectionMode == 1 ) then - if ( Get_Slips() == SLIPS_SET_END ) then - TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight - else - TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight ! data%State%TD_String%HookLoad = String Weight - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 2 ) then - if ( Get_JointConnectionPossible() ) then - TD_SumWeight = data%State%TD_Load%WeightTB - else - TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 3 ) then - if ( Get_JointConnectionPossible() ) then - TD_SumWeight = data%State%TD_Load%WeightTB - else - TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight+data%State%TD_DrillStems(kk)%Weight - end if - - end if - - else if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then - - if ( data%State%TD_StConn%StringConnectionMode == 4 ) then - if ( Get_Slips() == SLIPS_SET_END ) then - TD_SumWeight = data%State%TD_Load%WeightTB - else - TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTB - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 5 ) then - TD_SumWeight = data%State%TD_Load%WeightTB - - else if ( data%State%TD_StConn%StringConnectionMode == 6 ) then - if ( Get_JointConnectionPossible() ) then - TD_SumWeight = data%State%TD_Load%WeightTB - else - TD_SumWeight = data%State%TD_Load%WeightTB+(3.d0*data%State%TD_DrillStems(kk)%Weight) - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 7 ) then - if ( Get_JointConnectionPossible() ) then - TD_SumWeight = data%State%TD_Load%WeightTB - else - TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_DrillStems(kk)%Weight - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 8 ) then - TD_SumWeight = data%State%TD_Load%WeightTB - - else if ( data%State%TD_StConn%StringConnectionMode == 18 ) then - TD_SumWeight = data%State%TD_Load%WeightTB - - else if ( data%State%TD_StConn%StringConnectionMode == 19 ) then - TD_SumWeight = data%State%TD_Load%WeightTB - - end if - - else if ( data%State%TD_StConn%KellyDriveTypeMode==2 ) then - - if ( data%State%TD_StConn%StringConnectionMode == 9 ) then - if ( Get_Slips() == SLIPS_SET_END ) then - TD_SumWeight = data%State%TD_Load%WeightTD - else - TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 10 ) then - if ( Get_Slips() == SLIPS_SET_END ) then - TD_SumWeight = data%State%TD_Load%WeightTD - else - TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 11 ) then - TD_SumWeight = data%State%TD_Load%WeightTD - - else if ( data%State%TD_StConn%StringConnectionMode == 12 ) then - if ( Get_Slips() == SLIPS_SET_END ) then - TD_SumWeight = data%State%TD_Load%WeightTD - else - TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD - end if - - else if ( data%State%TD_StConn%StringConnectionMode == 13 ) then - TD_SumWeight = data%State%TD_Load%WeightTD - - else if ( data%State%TD_StConn%StringConnectionMode == 14 ) then - TD_SumWeight = data%State%TD_Load%WeightTD+(3.d0*data%State%TD_DrillStems(kk)%Weight) - - else if ( data%State%TD_StConn%StringConnectionMode == 15 ) then - TD_SumWeight = data%State%TD_Load%WeightTD+(data%State%TD_DrillStems(kk)%Weight) - - else if ( data%State%TD_StConn%StringConnectionMode == 16 ) then - TD_SumWeight = data%State%TD_Load%WeightTD - - else if ( data%State%TD_StConn%StringConnectionMode == 17 ) then - TD_SumWeight = data%State%TD_Load%WeightTD - - end if - - end if - - - - !print* , 'data%State%TD_String%HookLoad3=' , data%State%TD_String%HookLoad - - - - - !if ( data%State%Hoisting%DriveType==1 ) then !==> Kelly_DriveType - ! - ! if ( data%State%TD_String%DrillStemForceType==1 .or. data%State%TD_String%DrillStemForceType==2 ) then - ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(TD_eConst-1.d0)*(TD_SumWeight) )& - ! /( TD_eConst*(1.d0-(1.d0/(TD_eConst**data%State%TD_Load%NumOfCables))) ) - ! else if ( data%State%TD_String%DrillStemForceType==3 .or. data%State%TD_String%DrillStemForceType==4 ) then - ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(1.d0-TD_eConst)*(TD_SumWeight) )& - ! /( 1.d0-(TD_eConst**data%State%TD_Load%NumOfCables) ) - ! else if ( data%State%TD_String%DrillStemForceType==5 ) then - data%State%TD_Load%WeightIndicator = TD_SumWeight - ! end if - ! - ! - !else if ( data%State%Hoisting%DriveType==0 ) then !==> TopDrive_DriveType ?????????????? - ! - ! if ( data%State%TD_String%DrillStemForceType==1 .or. data%State%TD_String%DrillStemForceType==2 ) then - ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(TD_eConst-1.d0)*(TD_SumWeight) )& - ! /( TD_eConst*(1.d0-(1.d0/(TD_eConst**data%State%TD_Load%NumOfCables))) ) - ! else if ( data%State%TD_String%DrillStemForceType==3 .or. data%State%TD_String%DrillStemForceType==4 ) then - ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(1.d0-TD_eConst)*(TD_SumWeight) )& - ! /( 1.d0-(TD_eConst**data%State%TD_Load%NumOfCables) ) - ! else if ( data%State%TD_String%DrillStemForceType==5 ) then - ! data%State%TD_Load%WeightIndicator = TD_SumWeight - ! end if - ! - !!else - !!data%State%TD_Load%WeightIndicator = 0. !????????????????? - ! - !end if - - - - - - data%State%TD_Load%DrawworksLoadInput = data%State%TD_Load%WeightIndicator/(sngl(data%State%TD_Load%NumOfCables)) ! [lb] - !print* , 'data%State%TD_String%HookLoad4=' , data%State%TD_String%HookLoad - !HookLoadPointer = data%State%TD_Load%WeightIndicator/1.0d3 ! [klb] - call Set_HookLoad ((1-data%State%TD_General%WeightIndicatorMalf)*AINT(data%State%TD_Load%WeightIndicator/1.0d3)) ! [klb] - - - - - - +subroutine TD_HookLoadCalculation + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + use SimulationVariables !@, only: Drawworks + use CDataDisplayConsole + use SimulationVariables + use CHoistingVariables + use SimulationVariables +! Use CSlipsEnumVariables + use UnitySignalVariables + use UnitySignalsModule + Use CBopStackVariables + use SimulationVariables + Use CUnityInputs + + + implicit none + + Integer :: i , kk + Real(8) :: TD_eConst=0.98d0 , TD_SumWeight + + + + +!==================================================== +! Torque & Hook Load Calculation +!==================================================== + +!=========> HookLoad + data%State%TD_String%HookLoad = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%Force2 ! [lb] + !print* , 'data%State%TD_String%HookLoad1=' , data%State%TD_String%HookLoad + + if ( data%State%Drawworks%motion==1 ) then + if ( data%State%PipeRam1%Situation_forTD==1 ) then !Upper Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag + end if + if ( data%State%PipeRam2%Situation_forTD==1 ) then !Lower Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag + end if + if ( data%State%RamLine%ShearBop_Situation_forTD==1 ) then !Blind Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+data%Configuration%BopStack%RamStringDrag !???????????????????? + end if + if ( data%State%Annular%Annular_Situation_forTD==1 ) then !Annular Preventer + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+(data%State%AnnularComputational%p_annular*data%Configuration%BopStack%AnnularStringDrag) + end if + else if ( data%State%Drawworks%motion==-1 ) then + if ( data%State%PipeRam1%Situation_forTD==1 ) then !Upper Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag + end if + if ( data%State%PipeRam2%Situation_forTD==1 ) then !Lower Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag + end if + if ( data%State%RamLine%ShearBop_Situation_forTD==1 ) then !Blind Ram + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-data%Configuration%BopStack%RamStringDrag !???????????????????? + end if + if ( data%State%Annular%Annular_Situation_forTD==1 ) then !Annular Preventer + data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-(data%State%AnnularComputational%p_annular*data%Configuration%BopStack%AnnularStringDrag) + end if + end if + + !print* , 'data%State%TD_String%HookLoad2=' , data%State%TD_String%HookLoad + + + + + + !if ( UpperRamClose_withPossibility==1 ) then + ! if ( data%State%Drawworks%motion==1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag + ! else if ( data%State%Drawworks%motion==-1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag + ! end if + !end if + !if ( LowerRamClose_withPossibility==1 ) then + ! if ( data%State%Drawworks%motion==1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag + ! else if ( data%State%Drawworks%motion==-1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag + ! end if + !end if + !if ( BlindRamClose_withPossibility==1 ) then + ! if ( data%State%Drawworks%motion==1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+RamStringDrag + ! else if ( data%State%Drawworks%motion==-1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-RamStringDrag + ! end if + !end if + !if ( AnnularPreventerClose_withPossibility==1 ) then + ! if ( data%State%Drawworks%motion==1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad+AnnularStringDrag + ! else if ( data%State%Drawworks%motion==-1 ) then + ! data%State%TD_String%HookLoad = data%State%TD_String%HookLoad-AnnularStringDrag + ! end if + !end if + + + + + + + + +!=========> Torque + data%State%TD_String%StringTorque = data%State%TD_String%TotalTorque ![lb.ft] ?????????? + !print* , 'data%State%TD_String%StringTorque=' , data%State%TD_String%StringTorque + + + + + +!==================================================== +! Weight Indicator Calculation +!==================================================== + + kk = 0 + Do i = data%State%TD_String%DrillStemComponentsNumbs , 1 , -1 + if (data%State%TD_DrillStems(i)%ComponentType==3) then + kk = i + exit + end if + End Do + + + + + + if ( data%State%TD_StConn%KellyDriveTypeMode==0 ) then + + if ( data%State%TD_StConn%StringConnectionMode == 1 ) then + if ( Get_Slips() == SLIPS_SET_END ) then + TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight + else + TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight ! data%State%TD_String%HookLoad = String Weight + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 2 ) then + if ( Get_JointConnectionPossible() ) then + TD_SumWeight = data%State%TD_Load%WeightTB + else + TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 3 ) then + if ( Get_JointConnectionPossible() ) then + TD_SumWeight = data%State%TD_Load%WeightTB + else + TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_Load%KellyWeight+data%State%TD_DrillStems(kk)%Weight + end if + + end if + + else if ( data%State%TD_StConn%KellyDriveTypeMode==1 ) then + + if ( data%State%TD_StConn%StringConnectionMode == 4 ) then + if ( Get_Slips() == SLIPS_SET_END ) then + TD_SumWeight = data%State%TD_Load%WeightTB + else + TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTB + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 5 ) then + TD_SumWeight = data%State%TD_Load%WeightTB + + else if ( data%State%TD_StConn%StringConnectionMode == 6 ) then + if ( Get_JointConnectionPossible() ) then + TD_SumWeight = data%State%TD_Load%WeightTB + else + TD_SumWeight = data%State%TD_Load%WeightTB+(3.d0*data%State%TD_DrillStems(kk)%Weight) + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 7 ) then + if ( Get_JointConnectionPossible() ) then + TD_SumWeight = data%State%TD_Load%WeightTB + else + TD_SumWeight = data%State%TD_Load%WeightTB+data%State%TD_DrillStems(kk)%Weight + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 8 ) then + TD_SumWeight = data%State%TD_Load%WeightTB + + else if ( data%State%TD_StConn%StringConnectionMode == 18 ) then + TD_SumWeight = data%State%TD_Load%WeightTB + + else if ( data%State%TD_StConn%StringConnectionMode == 19 ) then + TD_SumWeight = data%State%TD_Load%WeightTB + + end if + + else if ( data%State%TD_StConn%KellyDriveTypeMode==2 ) then + + if ( data%State%TD_StConn%StringConnectionMode == 9 ) then + if ( Get_Slips() == SLIPS_SET_END ) then + TD_SumWeight = data%State%TD_Load%WeightTD + else + TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 10 ) then + if ( Get_Slips() == SLIPS_SET_END ) then + TD_SumWeight = data%State%TD_Load%WeightTD + else + TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 11 ) then + TD_SumWeight = data%State%TD_Load%WeightTD + + else if ( data%State%TD_StConn%StringConnectionMode == 12 ) then + if ( Get_Slips() == SLIPS_SET_END ) then + TD_SumWeight = data%State%TD_Load%WeightTD + else + TD_SumWeight = data%State%TD_String%HookLoad+data%State%TD_Load%WeightTD + end if + + else if ( data%State%TD_StConn%StringConnectionMode == 13 ) then + TD_SumWeight = data%State%TD_Load%WeightTD + + else if ( data%State%TD_StConn%StringConnectionMode == 14 ) then + TD_SumWeight = data%State%TD_Load%WeightTD+(3.d0*data%State%TD_DrillStems(kk)%Weight) + + else if ( data%State%TD_StConn%StringConnectionMode == 15 ) then + TD_SumWeight = data%State%TD_Load%WeightTD+(data%State%TD_DrillStems(kk)%Weight) + + else if ( data%State%TD_StConn%StringConnectionMode == 16 ) then + TD_SumWeight = data%State%TD_Load%WeightTD + + else if ( data%State%TD_StConn%StringConnectionMode == 17 ) then + TD_SumWeight = data%State%TD_Load%WeightTD + + end if + + end if + + + + !print* , 'data%State%TD_String%HookLoad3=' , data%State%TD_String%HookLoad + + + + + !if ( data%Configuration%Hoisting%DriveType==1 ) then !==> Kelly_DriveType + ! + ! if ( data%State%TD_String%DrillStemForceType==1 .or. data%State%TD_String%DrillStemForceType==2 ) then + ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(TD_eConst-1.d0)*(TD_SumWeight) )& + ! /( TD_eConst*(1.d0-(1.d0/(TD_eConst**data%State%TD_Load%NumOfCables))) ) + ! else if ( data%State%TD_String%DrillStemForceType==3 .or. data%State%TD_String%DrillStemForceType==4 ) then + ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(1.d0-TD_eConst)*(TD_SumWeight) )& + ! /( 1.d0-(TD_eConst**data%State%TD_Load%NumOfCables) ) + ! else if ( data%State%TD_String%DrillStemForceType==5 ) then + data%State%TD_Load%WeightIndicator = TD_SumWeight + ! end if + ! + ! + !else if ( data%Configuration%Hoisting%DriveType==0 ) then !==> TopDrive_DriveType ?????????????? + ! + ! if ( data%State%TD_String%DrillStemForceType==1 .or. data%State%TD_String%DrillStemForceType==2 ) then + ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(TD_eConst-1.d0)*(TD_SumWeight) )& + ! /( TD_eConst*(1.d0-(1.d0/(TD_eConst**data%State%TD_Load%NumOfCables))) ) + ! else if ( data%State%TD_String%DrillStemForceType==3 .or. data%State%TD_String%DrillStemForceType==4 ) then + ! data%State%TD_Load%WeightIndicator = ( sngl(data%State%TD_Load%NumOfCables)*(1.d0-TD_eConst)*(TD_SumWeight) )& + ! /( 1.d0-(TD_eConst**data%State%TD_Load%NumOfCables) ) + ! else if ( data%State%TD_String%DrillStemForceType==5 ) then + ! data%State%TD_Load%WeightIndicator = TD_SumWeight + ! end if + ! + !!else + !!data%State%TD_Load%WeightIndicator = 0. !????????????????? + ! + !end if + + + + + + data%State%TD_Load%DrawworksLoadInput = data%State%TD_Load%WeightIndicator/(sngl(data%State%TD_Load%NumOfCables)) ! [lb] + !print* , 'data%State%TD_String%HookLoad4=' , data%State%TD_String%HookLoad + !HookLoadPointer = data%State%TD_Load%WeightIndicator/1.0d3 ! [klb] + call Set_HookLoad ((1-data%State%TD_General%WeightIndicatorMalf)*AINT(data%State%TD_Load%WeightIndicator/1.0d3)) ! [klb] + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 b/TorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 index e0fb5b8..caa625d 100644 --- a/TorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 @@ -1,71 +1,71 @@ -subroutine TD_StaticHookLoadCalculation - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - - - - - - i = 1 - if(data%State%TD_DrillStems(i)%HoleType == 0) then - data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * cos(data%State%TD_DrillStems(i)%StartAngle) - - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - data%State%TD_DrillStems(i)%StaticHookLoad = -(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) - - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - data%State%TD_DrillStems(i)%StaticHookLoad = (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) - end if - - - - do i = 2, data%State%TD_String%DrillStemComponentsNumbs - - if(data%State%TD_DrillStems(i)%HoleType == 0) then - data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * cos(data%State%TD_DrillStems(i)%StartAngle) - - else if (data%State%TD_DrillStems(i)%HoleType == 1) then - data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad -(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) - - else if (data%State%TD_DrillStems(i)%HoleType == 2) then - data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad +(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & - (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) - end if - - end do -! -!--------------------------------------------------------------------------------------------------- -! - i = 1 - !data%State%TD_DrillStems(i)%TotalSHookLoad = data%State%TD_DrillStems(i)%StaticHookLoad ???????????????????????????? - data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%StaticHookLoad * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl - do i = 2 , data%State%TD_String%DrillStemComponentsNumbs - !data%State%TD_DrillStems(i)%TotalSHookLoad = data%State%TD_DrillStems(i-1)%TotalSHookLoad + data%State%TD_DrillStems(i)%StaticHookLoad ????????????????????????? - data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%StaticHookLoad * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl - end do - - data%State%TD_String%StaticHookLoad = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%StaticHookLoad - data%State%TD_String%DlMax = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%DlTotal - - - - - - - +subroutine TD_StaticHookLoadCalculation + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + + + + + + i = 1 + if(data%State%TD_DrillStems(i)%HoleType == 0) then + data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * cos(data%State%TD_DrillStems(i)%StartAngle) + + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + data%State%TD_DrillStems(i)%StaticHookLoad = -(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) + + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + data%State%TD_DrillStems(i)%StaticHookLoad = (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) + end if + + + + do i = 2, data%State%TD_String%DrillStemComponentsNumbs + + if(data%State%TD_DrillStems(i)%HoleType == 0) then + data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * cos(data%State%TD_DrillStems(i)%StartAngle) + + else if (data%State%TD_DrillStems(i)%HoleType == 1) then + data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad -(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) + + else if (data%State%TD_DrillStems(i)%HoleType == 2) then + data%State%TD_DrillStems(i)%StaticHookLoad = data%State%TD_DrillStems(i-1)%StaticHookLoad +(data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%RCurvature * & + (sin(data%State%TD_DrillStems(i)%EndAngle) - sin(data%State%TD_DrillStems(i)%StartAngle))) + end if + + end do +! +!--------------------------------------------------------------------------------------------------- +! + i = 1 + !data%State%TD_DrillStems(i)%TotalSHookLoad = data%State%TD_DrillStems(i)%StaticHookLoad ???????????????????????????? + data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%StaticHookLoad * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl + do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + !data%State%TD_DrillStems(i)%TotalSHookLoad = data%State%TD_DrillStems(i-1)%TotalSHookLoad + data%State%TD_DrillStems(i)%StaticHookLoad ????????????????????????? + data%State%TD_DrillStems(i)%Dl = data%State%TD_DrillStems(i)%StaticHookLoad * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl + end do + + data%State%TD_String%StaticHookLoad = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%StaticHookLoad + data%State%TD_String%DlMax = data%State%TD_DrillStems(data%State%TD_String%DrillStemComponentsNumbs)%DlTotal + + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 index b9a1bb9..4665945 100644 --- a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 +++ b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 @@ -1,64 +1,64 @@ -subroutine TD_ForceDownS(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc , TD_SemiAngle - - - if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then - TD_SemiAngle = (pi/180.) - else - TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle - end if - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) - & - (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc* data%State%TD_DrillStems(i)%BouyancyFactor* & - data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & - sin(TD_SemiAngle) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) - & - (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) - ! - ! - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & - ! (Elements(i)%Area * Element%ElasticModule) - ! - - data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc* data%State%TD_DrillStems(i)%BouyancyFactor* & - data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & - sin(TD_SemiAngle) - ! - - - - +subroutine TD_ForceDownS(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc , TD_SemiAngle + + + if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then + TD_SemiAngle = (pi/180.) + else + TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle + end if + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) - & + (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc* data%State%TD_DrillStems(i)%BouyancyFactor* & + data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & + sin(TD_SemiAngle) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) - & + (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) + ! + ! + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & + ! (Elements(i)%Area * Element%ElasticModule) + ! + + data%State%TD_DrillStems(i)%Torque = TD_SemiMudVisc* data%State%TD_DrillStems(i)%BouyancyFactor* & + data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & + sin(TD_SemiAngle) + ! + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 index 10f4fec..6547aa2 100644 --- a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 +++ b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 @@ -1,60 +1,60 @@ -subroutine TD_ForceDownSRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc , TD_SemiAngle - - - if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then - TD_SemiAngle = (pi/180.) - else - TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle - end if - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - cos(data%State%TD_DrillStems(i)%StartAngle)) - (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - cos(data%State%TD_DrillStems(i)%StartAngle)) - (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) - ! - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) - - ! - !Strains(i)%dL = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - - +subroutine TD_ForceDownSRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc , TD_SemiAngle + + + if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then + TD_SemiAngle = (pi/180.) + else + TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle + end if + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + cos(data%State%TD_DrillStems(i)%StartAngle)) - (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + cos(data%State%TD_DrillStems(i)%StartAngle)) - (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) + ! + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) + + ! + !Strains(i)%dL = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 index ace62c4..9433fec 100644 --- a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 +++ b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 @@ -1,65 +1,65 @@ -subroutine TD_ForceUpS(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc , TD_SemiAngle - - - if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then - TD_SemiAngle = (pi/180.) - else - TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle - end if - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) + & - (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%MudViscosity* data%State%TD_DrillStems(i)%BouyancyFactor* & - data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & - sin(TD_SemiAngle) - end if - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) + & - (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) - - !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & - ! (Elements(i)%Area * Element%ElasticModule) - - - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%MudViscosity* data%State%TD_DrillStems(i)%BouyancyFactor* & - data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & - sin(TD_SemiAngle) - - - !!if (data%State%TD_DrillStems(i)%Torque>500.) then - ! print* , 'data%State%TD_String%TotalTorque=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque , data%State%TD_String%WeightOnBit - ! print* , 'propertiess=' , data%State%TD_DrillStems(i)%Force2 , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef - ! !end if - - +subroutine TD_ForceUpS(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc , TD_SemiAngle + + + if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.) ) then + TD_SemiAngle = (pi/180.) + else + TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle + end if + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) + & + (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%MudViscosity* data%State%TD_DrillStems(i)%BouyancyFactor* & + data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & + sin(TD_SemiAngle) + end if + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + data%State%TD_DrillStems(i)%BouyancyFactor * (cos(data%State%TD_DrillStems(i)%StartAngle) + & + (TD_SemiMudVisc * sin(data%State%TD_DrillStems(i)%StartAngle)))) + + !Strains(i)%Dl = TDForces(i)%Force * (Elements(i)%Length ) / & + ! (Elements(i)%Area * Element%ElasticModule) + + + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%MudViscosity* data%State%TD_DrillStems(i)%BouyancyFactor* & + data%State%TD_DrillStems(i)%WeightperLength* data%State%TD_DrillStems(i)%Length* data%State%TD_DrillStems(i)%RtoolJoint * & + sin(TD_SemiAngle) + + + !!if (data%State%TD_DrillStems(i)%Torque>500.) then + ! print* , 'data%State%TD_String%TotalTorque=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque , data%State%TD_String%WeightOnBit + ! print* , 'propertiess=' , data%State%TD_DrillStems(i)%Force2 , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef + ! !end if + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 index 0f71ffd..2b860ba 100644 --- a/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 +++ b/TorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 @@ -1,59 +1,59 @@ -subroutine TD_ForceUpSRot(i,TD_SemiMudVisc) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - Real(8) :: TD_SemiMudVisc , TD_SemiAngle - - - if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.d0) ) then - TD_SemiAngle = (pi/180.) - else - TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle - end if - - - If (i==1) then - data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - cos(data%State%TD_DrillStems(i)%StartAngle)) + (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) - - - if (data%State%TD_DrillStems(i)%ComponentType==0) then - data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque - else - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) - end if - - - return - End If - - -!=========> F1 Calculation - data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 - - -!=========> F2 Calculation - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - cos(data%State%TD_DrillStems(i)%StartAngle)) + (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & - sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) - ! - data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & - data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) - ! - !Strains(i)%dL = TDForces(i)%Force * (Elements(i)%Length) / & - ! (Elements(i)%Area * Element%ElasticModule) - - +subroutine TD_ForceUpSRot(i,TD_SemiMudVisc) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + Real(8) :: TD_SemiMudVisc , TD_SemiAngle + + + if ( data%State%TD_DrillStems(i)%StartAngle<=(pi/180.d0) ) then + TD_SemiAngle = (pi/180.) + else + TD_SemiAngle = data%State%TD_DrillStems(i)%StartAngle + end if + + + If (i==1) then + data%State%TD_DrillStems(1)%Force1 = -data%State%TD_String%WeightOnBit + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + cos(data%State%TD_DrillStems(i)%StartAngle)) + (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) + + + if (data%State%TD_DrillStems(i)%ComponentType==0) then + data%State%TD_DrillStems(i)%Torque = data%State%TD_String%BitTorque + else + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) + end if + + + return + End If + + +!=========> F1 Calculation + data%State%TD_DrillStems(i)%Force1 = data%State%TD_DrillStems(i-1)%Force2 + + +!=========> F2 Calculation + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force1 + (data%State%TD_DrillStems(i)%BouyancyFactor * data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + cos(data%State%TD_DrillStems(i)%StartAngle)) + (TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * & + sin(data%State%TD_DrillStems(i)%StartAngle) * sin(data%State%TD_DrillStems(i)%CombVelRatio)) + ! + data%State%TD_DrillStems(i)%Torque = data%State%TD_DrillStems(i)%RtoolJoint * TD_SemiMudVisc * data%State%TD_DrillStems(i)%BouyancyFactor * & + data%State%TD_DrillStems(i)%WeightperLength * data%State%TD_DrillStems(i)%Length * sin(TD_SemiAngle) * cos(data%State%TD_DrillStems(i)%CombVelRatio) + ! + !Strains(i)%dL = TDForces(i)%Force * (Elements(i)%Length) / & + ! (Elements(i)%Area * Element%ElasticModule) + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_StrainCalculation.f90 b/TorqueDrag/TD_Forces/TD_StrainCalculation.f90 index f828be3..2f6557a 100644 --- a/TorqueDrag/TD_Forces/TD_StrainCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_StrainCalculation.f90 @@ -1,54 +1,54 @@ -subroutine TD_StrainCalculation(i) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - - - - if (data%State%TD_String%DrillStemAxialVelocity>=0.d0) then - - if (i == 1) then - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag - data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl - else - !do i = 2 , data%State%TD_String%DrillStemComponentsNumbs - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag - data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl - !end do - end if - - - else if (data%State%TD_String%DrillStemAxialVelocity<0.) then - - if (i == 1) then - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag - data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl - else - !do i = 2 , data%State%TD_String%DrillStemComponentsNumbs - data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag - data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule - data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl - !end do - end if - - - end if - - -!=====> Modified Length of Drill Stem - !data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%LengthIni + data%State%TD_DrillStems(i)%Dl - data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%LengthIni - - - +subroutine TD_StrainCalculation(i) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + + + + if (data%State%TD_String%DrillStemAxialVelocity>=0.d0) then + + if (i == 1) then + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag + data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl + else + !do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 + data%State%TD_DrillStems(i)%Drag + data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl + !end do + end if + + + else if (data%State%TD_String%DrillStemAxialVelocity<0.) then + + if (i == 1) then + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag + data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i)%Dl + else + !do i = 2 , data%State%TD_String%DrillStemComponentsNumbs + data%State%TD_DrillStems(i)%Force2 = data%State%TD_DrillStems(i)%Force2 - data%State%TD_DrillStems(i)%Drag + data%State%TD_DrillStems(i)%Dl = (data%State%TD_DrillStems(i)%Force2) * data%State%TD_DrillStems(i)%Length / data%State%TD_DrillStems(i)%Area / data%State%TD_DrillStems(i)%ElasticModule + data%State%TD_DrillStems(i)%DlTotal = data%State%TD_DrillStems(i-1)%DlTotal + data%State%TD_DrillStems(i)%Dl + !end do + end if + + + end if + + +!=====> Modified Length of Drill Stem + !data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%LengthIni + data%State%TD_DrillStems(i)%Dl + data%State%TD_DrillStems(i)%Length = data%State%TD_DrillStems(i)%LengthIni + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 b/TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 index 3a98b15..70da3c2 100644 --- a/TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_TorqueCalculation.f90 @@ -1,43 +1,43 @@ -subroutine TD_TorqueCalculation(i) - - use CHoistingVariables - use SimulationVariables -! Use TD_DrillStemComponents -! use ConfigurationVariables !@ -! use ConfigurationVariables !@ -! use ConfigurationVariables !@ -! use ConfigurationVariables !@, only: RTable -! use ConfigurationVariables, only: TDS - - - implicit none - - Integer :: i - - - - - if ( data%State%Hoisting%DriveType==1 .and. data%State%RTable%Speed==0.d0 ) then - data%State%TD_DrillStems(i)%Torque = 0.d0 - else if ( data%State%Hoisting%DriveType==0 .and. data%State%TDS%Speed==0.d0 .and. data%State%RTable%Speed==0.d0 ) then - data%State%TD_DrillStems(i)%Torque = 0.d0 - end if - - - - - if ( i==1 ) then - data%State%TD_String%TotalTorque = data%State%TD_DrillStems(i)%Torque - else - data%State%TD_String%TotalTorque = data%State%TD_String%TotalTorque + data%State%TD_DrillStems(i)%Torque - end if - - !if (data%State%TD_DrillStems(i)%Torque>500.) then - ! print* , 'data%State%TD_String%TotalTorque=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque - ! !print* , 'properties=' , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef - !end if - - - - +subroutine TD_TorqueCalculation(i) + + use CHoistingVariables + use SimulationVariables +! Use TD_DrillStemComponents +! use ConfigurationVariables !@ +! use ConfigurationVariables !@ +! use ConfigurationVariables !@ +! use ConfigurationVariables !@, only: RTable +! use ConfigurationVariables, only: TDS + + + implicit none + + Integer :: i + + + + + if ( data%Configuration%Hoisting%DriveType==1 .and. data%State%RTable%Speed==0.d0 ) then + data%State%TD_DrillStems(i)%Torque = 0.d0 + else if ( data%Configuration%Hoisting%DriveType==0 .and. data%State%TDS%Speed==0.d0 .and. data%State%RTable%Speed==0.d0 ) then + data%State%TD_DrillStems(i)%Torque = 0.d0 + end if + + + + + if ( i==1 ) then + data%State%TD_String%TotalTorque = data%State%TD_DrillStems(i)%Torque + else + data%State%TD_String%TotalTorque = data%State%TD_String%TotalTorque + data%State%TD_DrillStems(i)%Torque + end if + + !if (data%State%TD_DrillStems(i)%Torque>500.) then + ! print* , 'data%State%TD_String%TotalTorque=' , i , data%State%TD_String%TotalTorque , data%State%TD_DrillStems(i)%Torque + ! !print* , 'properties=' , data%State%TD_DrillStems(i)%Force1 , data%State%TD_DrillStems(i)%MudViscosity , data%State%TD_DrillStems(i)%EndAngle , data%State%TD_DrillStems(i)%StartAngle , data%State%TD_DrillStems(i)%WeightperLength , data%State%TD_DrillStems(i)%MudVisCorrectCoef + !end if + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 b/TorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 index b49aa34..002840a 100644 --- a/TorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 +++ b/TorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 @@ -1,176 +1,176 @@ -subroutine TD_ViscousDragForce - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - - implicit none - - Integer :: i - real(8) :: TDden, TDpreup , TDpredown , TDtem , TDmdup , TDmddown - Real(8) :: TD_ThetaCoef1 , TD_ThetaCoef2 , TD_NCoef , TD_KCoef - Real(8) :: TD_DragSum - - - - - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - - if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then - data%State%TD_DrillStems(i)%Drag = 0.d0 - cycle - end if - TDmdup = data%State%TD_DrillStems(i)%TopDepthIni - Call AnnulusPropertyCalculator ( INT(TDmdup) , TDden , TDpreup , TDtem ) - TDmddown = data%State%TD_DrillStems(i)%DownDepthIni - Call AnnulusPropertyCalculator ( INT(TDmddown) , TDden , TDpredown , TDtem ) - data%State%TD_DrillStems(i)%Drag = abs(TDpredown-TDpreup)*(pi*data%State%TD_DrillStems(i)%Length*12.d0*data%State%TD_DrillStems(i)%Od*12.d0) ![psi]*[inch^2]=[lb] ????? - - data%State%TD_DrillStems(i)%Drag = 0.0d0 !????????????????????? - - End Do - - - - - - - !Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - ! - ! - ! if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then - ! data%State%TD_DrillStems(i)%Drag = 0.d0 - ! cycle - ! end if - ! - ! !------------------------------------------------------------------------------------ - ! data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(i)%Od*12.d0 ! [inch] - ! data%State%TD_DrillStems(i)%HoleDiameter = data%State%TD_DrillStems(i)%HoleDiameter*12.d0 ! [inch] - ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut/7.48051948d0 ! [ppg] - ! !------------------------------------------------------------------------------------ - ! - ! - ! TD_ThetaCoef1 = data%State%TD_DrillStems(i)%MudYieldPoint+data%State%TD_DrillStems(i)%MudPlasticVis - ! TD_ThetaCoef2 = (2.0d0*data%State%TD_DrillStems(i)%MudPlasticVis)+data%State%TD_DrillStems(i)%MudYieldPoint - ! TD_NCoef = 3.32d0*log10(TD_ThetaCoef2/TD_ThetaCoef1) - ! TD_KCoef = (TD_ThetaCoef1)/(511.d0*TD_NCoef) - ! - ! - ! - ! If (data%State%TD_DrillStems(i)%TopDepth>0.d0) then - ! - ! data%State%TD_DrillStems(i)%PipeVelocity = abs(data%State%TD_String%DrillStemAxialVelocity) - ! - ! data%State%TD_DrillStems(i)%DiamRatio = (data%State%TD_DrillStems(i)%Od)/data%State%TD_DrillStems(i)%HoleDiameter - ! - ! - ! data%State%TD_DrillStems(i)%MudClingingConst = ((data%State%TD_DrillStems(i)%DiamRatio**2) * (1.0d0 - (2.0d0*log(data%State%TD_DrillStems(i)%DiamRatio))) - 1.0d0) & - ! / (2.0d0*(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))*log(data%State%TD_DrillStems(i)%DiamRatio)) - ! - ! data%State%TD_DrillStems(i)%AveEffVelocity = data%State%TD_DrillStems(i)%PipeVelocity * ( ((data%State%TD_DrillStems(i)%DiamRatio**2)/(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))) & - ! + data%State%TD_DrillStems(i)%MudClingingConst) - ! - ! data%State%TD_DrillStems(i)%ReNumber = (926.4*(data%State%TD_DrillStems(i)%MudDensityOut * data%State%TD_DrillStems(i)%AveEffVelocity * (data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))) & - ! / data%State%TD_DrillStems(i)%MudPlasticVis !Bingham-plastic drilling fluid - ! !data%State%TD_DrillStems(i)%ReNumber = 10.9d4*( data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%AveEffVelocity**(2-TD_NCoef))/data%State%TD_DrillStems(i)%MudPlasticVis ) & - ! ! *( (((data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)/48.)*(TD_NCoef/((2.*TD_NCoef)+1.)))**TD_NCoef ) !Power-law fluid - ! - ! if ( data%State%TD_DrillStems(i)%ReNumber .le. 2.1d3 ) then !Bingham-plastic drilling fluid - ! !if ( data%State%TD_DrillStems(i)%ReNumber .le. (3479.-(1370.*TD_NCoef)) ) then !Power-law fluid - ! - ! data%State%TD_DrillStems(i)%FricFactor = 1.60d1/data%State%TD_DrillStems(i)%ReNumber - ! - ! !data%State%TD_DrillStems(i)%Dp_Dl = ( TD_KCoef/(14.4d4*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) )& - ! ! *( ((48./(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))*(((2.*TD_NCoef)+1.)/TD_NCoef))**TD_NCoef ) !Power-law fluid - ! data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & - ! / (25.78d0*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Bingham-plastic drilling fluid - ! - ! else !Bingham-plastic drilling fluid - ! !else if ( data%State%TD_DrillStems(i)%ReNumber .gt. (4270.-(1370.*TD_NCoef)) ) then !Power-law fluid - ! - ! data%State%TD_DrillStems(i)%MudClingingConst = (sqrt(( (data%State%TD_DrillStems(i)%DiamRatio**4) + data%State%TD_DrillStems(i)%DiamRatio ) & - ! /(1.0d0 + data%State%TD_DrillStems(i)%DiamRatio )) - (data%State%TD_DrillStems(i)%DiamRatio**2)) & - ! /(1.0d0- (data%State%TD_DrillStems(i)%DiamRatio**2)) - ! - ! data%State%TD_DrillStems(i)%AveEffVelocity = data%State%TD_DrillStems(i)%PipeVelocity * ( ((data%State%TD_DrillStems(i)%DiamRatio**2)/(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))) & - ! + data%State%TD_DrillStems(i)%MudClingingConst) - ! - ! data%State%TD_DrillStems(i)%ReNumber = (926.4d0*(data%State%TD_DrillStems(i)%MudDensityOut * data%State%TD_DrillStems(i)%AveEffVelocity * (data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))) & - ! / data%State%TD_DrillStems(i)%MudPlasticVis !Bingham-plastic drilling fluid - ! !data%State%TD_DrillStems(i)%ReNumber = 10.9d4*( data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%AveEffVelocity**(2-TD_NCoef))/data%State%TD_DrillStems(i)%MudPlasticVis ) & - ! ! *( (((data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)/48.)*(TD_NCoef/((2.*TD_NCoef)+1.)))**TD_NCoef ) !Power-law fluid - ! - ! data%State%TD_DrillStems(i)%FricFactor = 0.0791d0/(data%State%TD_DrillStems(i)%ReNumber**0.25d0) - ! - ! data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & - ! / (25.78d0*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Bingham-plastic drilling fluid - ! !data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & - ! ! / (21.1*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Power-law fluid - ! - ! end if - ! - ! - ! data%State%TD_DrillStems(i)%Drag = ( (pi/4.0d0)*data%State%TD_DrillStems(i)%Dp_Dl*data%State%TD_DrillStems(i)%Length*(data%State%TD_DrillStems(i)%Od**2)/10.d0 ) ! drag/10 = because of the value of drag force - ! - ! Else - ! data%State%TD_DrillStems(i)%Drag = 0.0d0 - ! - ! End if - ! - ! - ! !------------------------------------------------------------------------------------ - ! data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(i)%Od/12.d0 ! [ft] - ! data%State%TD_DrillStems(i)%HoleDiameter = data%State%TD_DrillStems(i)%HoleDiameter/12.d0 ! [ft] - ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut*7.48051948d0 ! [lb/ft3] - ! !------------------------------------------------------------------------------------ - ! - ! - !end do - - if (data%State%TD_DrillStems(1)%ComponentType==0) then - data%State%TD_DrillStems(1)%Drag = 50.d0*data%State%TD_DrillStems(1)%Od !Od[ft] , Drag[lb]????? - if ( data%State%TD_DrillStems(1)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(1)%MudDensityIn==0.d0 ) then - data%State%TD_DrillStems(1)%Drag = 0.d0 - end if - end if - - !!TD_DragSum = 0. - !!Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - !! TD_DragSum = TD_DragSum+data%State%TD_DrillStems(i)%Drag - !!end do - - - ! print*, 'TD_NCoef=' , TD_NCoef - ! print*, 'TD_KCoef=' , TD_KCoef - ! - ! print*, 'data%State%TD_DrillStems(1)%DiamRatio=' , data%State%TD_DrillStems(1)%DiamRatio - ! print*, 'data%State%TD_DrillStems(1)%Od=' , data%State%TD_DrillStems(1)%Od - ! print*, 'data%State%TD_DrillStems(1)%HoleDiameter=' , data%State%TD_DrillStems(1)%HoleDiameter - ! ! - ! print*, 'data%State%TD_DrillStems(1)%MudClingingConst=' , data%State%TD_DrillStems(1)%MudClingingConst - ! ! - ! print*, 'data%State%TD_DrillStems(1)%AveEffVelocity=' , data%State%TD_DrillStems(1)%AveEffVelocity - ! ! - ! !print*, 'data%State%TD_DrillStems(1)%MudPlasticVis=' , data%State%TD_DrillStems(1)%MudPlasticVis - ! print*, 'data%State%TD_DrillStems(1)%MudDensityOut=' , data%State%TD_DrillStems(1)%MudDensityOut - ! print*, 'data%State%TD_DrillStems(1)%ReNumber=' , data%State%TD_DrillStems(1)%ReNumber - ! ! - ! print*, 'data%State%TD_DrillStems(1)%FricFactor=' , data%State%TD_DrillStems(1)%FricFactor - ! print*, 'data%State%TD_DrillStems(1)%Dp_Dl=' , data%State%TD_DrillStems(1)%Dp_Dl - ! print*, 'data%State%TD_DrillStems(1)%Drag=' , data%State%TD_DrillStems(1)%Drag - ! print*, 'data%State%TD_DrillStems(2)%Drag=' , data%State%TD_DrillStems(2)%Drag - ! print*, 'data%State%TD_DrillStems(3)%Drag=' , data%State%TD_DrillStems(3)%Drag - ! print*, 'TD_DragSum=' , TD_DragSum - ! print*, 'data%State%TD_DrillStems(330)%Drag=' , data%State%TD_DrillStems(330)%Drag - ! print*, 'data%State%TD_DrillStems(331)%Drag=' , data%State%TD_DrillStems(331)%Drag - ! print*, 'data%State%TD_DrillStems(333)%Drag=' , data%State%TD_DrillStems(333)%Drag - - - - - - +subroutine TD_ViscousDragForce + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + + implicit none + + Integer :: i + real(8) :: TDden, TDpreup , TDpredown , TDtem , TDmdup , TDmddown + Real(8) :: TD_ThetaCoef1 , TD_ThetaCoef2 , TD_NCoef , TD_KCoef + Real(8) :: TD_DragSum + + + + + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + + if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then + data%State%TD_DrillStems(i)%Drag = 0.d0 + cycle + end if + TDmdup = data%State%TD_DrillStems(i)%TopDepthIni + Call AnnulusPropertyCalculator ( INT(TDmdup) , TDden , TDpreup , TDtem ) + TDmddown = data%State%TD_DrillStems(i)%DownDepthIni + Call AnnulusPropertyCalculator ( INT(TDmddown) , TDden , TDpredown , TDtem ) + data%State%TD_DrillStems(i)%Drag = abs(TDpredown-TDpreup)*(pi*data%State%TD_DrillStems(i)%Length*12.d0*data%State%TD_DrillStems(i)%Od*12.d0) ![psi]*[inch^2]=[lb] ????? + + data%State%TD_DrillStems(i)%Drag = 0.0d0 !????????????????????? + + End Do + + + + + + + !Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + ! + ! + ! if ( data%State%TD_DrillStems(i)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(i)%MudDensityIn==0.d0 ) then + ! data%State%TD_DrillStems(i)%Drag = 0.d0 + ! cycle + ! end if + ! + ! !------------------------------------------------------------------------------------ + ! data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(i)%Od*12.d0 ! [inch] + ! data%State%TD_DrillStems(i)%HoleDiameter = data%State%TD_DrillStems(i)%HoleDiameter*12.d0 ! [inch] + ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut/7.48051948d0 ! [ppg] + ! !------------------------------------------------------------------------------------ + ! + ! + ! TD_ThetaCoef1 = data%State%TD_DrillStems(i)%MudYieldPoint+data%State%TD_DrillStems(i)%MudPlasticVis + ! TD_ThetaCoef2 = (2.0d0*data%State%TD_DrillStems(i)%MudPlasticVis)+data%State%TD_DrillStems(i)%MudYieldPoint + ! TD_NCoef = 3.32d0*log10(TD_ThetaCoef2/TD_ThetaCoef1) + ! TD_KCoef = (TD_ThetaCoef1)/(511.d0*TD_NCoef) + ! + ! + ! + ! If (data%State%TD_DrillStems(i)%TopDepth>0.d0) then + ! + ! data%State%TD_DrillStems(i)%PipeVelocity = abs(data%State%TD_String%DrillStemAxialVelocity) + ! + ! data%State%TD_DrillStems(i)%DiamRatio = (data%State%TD_DrillStems(i)%Od)/data%State%TD_DrillStems(i)%HoleDiameter + ! + ! + ! data%State%TD_DrillStems(i)%MudClingingConst = ((data%State%TD_DrillStems(i)%DiamRatio**2) * (1.0d0 - (2.0d0*log(data%State%TD_DrillStems(i)%DiamRatio))) - 1.0d0) & + ! / (2.0d0*(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))*log(data%State%TD_DrillStems(i)%DiamRatio)) + ! + ! data%State%TD_DrillStems(i)%AveEffVelocity = data%State%TD_DrillStems(i)%PipeVelocity * ( ((data%State%TD_DrillStems(i)%DiamRatio**2)/(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))) & + ! + data%State%TD_DrillStems(i)%MudClingingConst) + ! + ! data%State%TD_DrillStems(i)%ReNumber = (926.4*(data%State%TD_DrillStems(i)%MudDensityOut * data%State%TD_DrillStems(i)%AveEffVelocity * (data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))) & + ! / data%State%TD_DrillStems(i)%MudPlasticVis !Bingham-plastic drilling fluid + ! !data%State%TD_DrillStems(i)%ReNumber = 10.9d4*( data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%AveEffVelocity**(2-TD_NCoef))/data%State%TD_DrillStems(i)%MudPlasticVis ) & + ! ! *( (((data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)/48.)*(TD_NCoef/((2.*TD_NCoef)+1.)))**TD_NCoef ) !Power-law fluid + ! + ! if ( data%State%TD_DrillStems(i)%ReNumber .le. 2.1d3 ) then !Bingham-plastic drilling fluid + ! !if ( data%State%TD_DrillStems(i)%ReNumber .le. (3479.-(1370.*TD_NCoef)) ) then !Power-law fluid + ! + ! data%State%TD_DrillStems(i)%FricFactor = 1.60d1/data%State%TD_DrillStems(i)%ReNumber + ! + ! !data%State%TD_DrillStems(i)%Dp_Dl = ( TD_KCoef/(14.4d4*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) )& + ! ! *( ((48./(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))*(((2.*TD_NCoef)+1.)/TD_NCoef))**TD_NCoef ) !Power-law fluid + ! data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & + ! / (25.78d0*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Bingham-plastic drilling fluid + ! + ! else !Bingham-plastic drilling fluid + ! !else if ( data%State%TD_DrillStems(i)%ReNumber .gt. (4270.-(1370.*TD_NCoef)) ) then !Power-law fluid + ! + ! data%State%TD_DrillStems(i)%MudClingingConst = (sqrt(( (data%State%TD_DrillStems(i)%DiamRatio**4) + data%State%TD_DrillStems(i)%DiamRatio ) & + ! /(1.0d0 + data%State%TD_DrillStems(i)%DiamRatio )) - (data%State%TD_DrillStems(i)%DiamRatio**2)) & + ! /(1.0d0- (data%State%TD_DrillStems(i)%DiamRatio**2)) + ! + ! data%State%TD_DrillStems(i)%AveEffVelocity = data%State%TD_DrillStems(i)%PipeVelocity * ( ((data%State%TD_DrillStems(i)%DiamRatio**2)/(1.0d0-(data%State%TD_DrillStems(i)%DiamRatio**2))) & + ! + data%State%TD_DrillStems(i)%MudClingingConst) + ! + ! data%State%TD_DrillStems(i)%ReNumber = (926.4d0*(data%State%TD_DrillStems(i)%MudDensityOut * data%State%TD_DrillStems(i)%AveEffVelocity * (data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od))) & + ! / data%State%TD_DrillStems(i)%MudPlasticVis !Bingham-plastic drilling fluid + ! !data%State%TD_DrillStems(i)%ReNumber = 10.9d4*( data%State%TD_DrillStems(i)%MudDensityOut*(data%State%TD_DrillStems(i)%AveEffVelocity**(2-TD_NCoef))/data%State%TD_DrillStems(i)%MudPlasticVis ) & + ! ! *( (((data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)/48.)*(TD_NCoef/((2.*TD_NCoef)+1.)))**TD_NCoef ) !Power-law fluid + ! + ! data%State%TD_DrillStems(i)%FricFactor = 0.0791d0/(data%State%TD_DrillStems(i)%ReNumber**0.25d0) + ! + ! data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & + ! / (25.78d0*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Bingham-plastic drilling fluid + ! !data%State%TD_DrillStems(i)%Dp_Dl = (data%State%TD_DrillStems(i)%FricFactor * (data%State%TD_DrillStems(i)%AveEffVelocity**2) * data%State%TD_DrillStems(i)%MudDensityOut) & + ! ! / (21.1*(data%State%TD_DrillStems(i)%HoleDiameter - data%State%TD_DrillStems(i)%Od)) !Power-law fluid + ! + ! end if + ! + ! + ! data%State%TD_DrillStems(i)%Drag = ( (pi/4.0d0)*data%State%TD_DrillStems(i)%Dp_Dl*data%State%TD_DrillStems(i)%Length*(data%State%TD_DrillStems(i)%Od**2)/10.d0 ) ! drag/10 = because of the value of drag force + ! + ! Else + ! data%State%TD_DrillStems(i)%Drag = 0.0d0 + ! + ! End if + ! + ! + ! !------------------------------------------------------------------------------------ + ! data%State%TD_DrillStems(i)%Od = data%State%TD_DrillStems(i)%Od/12.d0 ! [ft] + ! data%State%TD_DrillStems(i)%HoleDiameter = data%State%TD_DrillStems(i)%HoleDiameter/12.d0 ! [ft] + ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut*7.48051948d0 ! [lb/ft3] + ! !------------------------------------------------------------------------------------ + ! + ! + !end do + + if (data%State%TD_DrillStems(1)%ComponentType==0) then + data%State%TD_DrillStems(1)%Drag = 50.d0*data%State%TD_DrillStems(1)%Od !Od[ft] , Drag[lb]????? + if ( data%State%TD_DrillStems(1)%MudDensityOut==0.d0 .or. data%State%TD_DrillStems(1)%MudDensityIn==0.d0 ) then + data%State%TD_DrillStems(1)%Drag = 0.d0 + end if + end if + + !!TD_DragSum = 0. + !!Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + !! TD_DragSum = TD_DragSum+data%State%TD_DrillStems(i)%Drag + !!end do + + + ! print*, 'TD_NCoef=' , TD_NCoef + ! print*, 'TD_KCoef=' , TD_KCoef + ! + ! print*, 'data%State%TD_DrillStems(1)%DiamRatio=' , data%State%TD_DrillStems(1)%DiamRatio + ! print*, 'data%State%TD_DrillStems(1)%Od=' , data%State%TD_DrillStems(1)%Od + ! print*, 'data%State%TD_DrillStems(1)%HoleDiameter=' , data%State%TD_DrillStems(1)%HoleDiameter + ! ! + ! print*, 'data%State%TD_DrillStems(1)%MudClingingConst=' , data%State%TD_DrillStems(1)%MudClingingConst + ! ! + ! print*, 'data%State%TD_DrillStems(1)%AveEffVelocity=' , data%State%TD_DrillStems(1)%AveEffVelocity + ! ! + ! !print*, 'data%State%TD_DrillStems(1)%MudPlasticVis=' , data%State%TD_DrillStems(1)%MudPlasticVis + ! print*, 'data%State%TD_DrillStems(1)%MudDensityOut=' , data%State%TD_DrillStems(1)%MudDensityOut + ! print*, 'data%State%TD_DrillStems(1)%ReNumber=' , data%State%TD_DrillStems(1)%ReNumber + ! ! + ! print*, 'data%State%TD_DrillStems(1)%FricFactor=' , data%State%TD_DrillStems(1)%FricFactor + ! print*, 'data%State%TD_DrillStems(1)%Dp_Dl=' , data%State%TD_DrillStems(1)%Dp_Dl + ! print*, 'data%State%TD_DrillStems(1)%Drag=' , data%State%TD_DrillStems(1)%Drag + ! print*, 'data%State%TD_DrillStems(2)%Drag=' , data%State%TD_DrillStems(2)%Drag + ! print*, 'data%State%TD_DrillStems(3)%Drag=' , data%State%TD_DrillStems(3)%Drag + ! print*, 'TD_DragSum=' , TD_DragSum + ! print*, 'data%State%TD_DrillStems(330)%Drag=' , data%State%TD_DrillStems(330)%Drag + ! print*, 'data%State%TD_DrillStems(331)%Drag=' , data%State%TD_DrillStems(331)%Drag + ! print*, 'data%State%TD_DrillStems(333)%Drag=' , data%State%TD_DrillStems(333)%Drag + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 b/TorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 index 1fe9098..c56453e 100644 --- a/TorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 +++ b/TorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 @@ -1,41 +1,41 @@ -subroutine TD_WeightOnBitCalculation - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - use CDataDisplayConsole - use SimulationVariables - - - implicit none - - Integer :: i - - - !data%State%TD_StConn%TouchConnectionHeight = data%State%TD_String%DlMax + data%State%TD_String%DrillStemTotalLengthIni - data%State%TD_WellGeneral%WellTotalLength - data%State%TD_StConn%TouchConnectionHeight = data%State%TD_String%DrillStemTotalLengthIni - data%State%TD_WellGeneral%WellTotalLength - - - - !if (data%State%TD_DrillStems(1)%ComponentType == 0) then ????????????? - - - - !if (data%State%TD_DrillStems(1)%DownDepth < data%State%TD_WellGeneral%WellTotalLength) then - if (data%State%TD_StConn%ConnectionHeight < data%State%TD_StConn%TouchConnectionHeight) then - data%State%TD_String%DlTouch = data%State%TD_String%DlMax-(data%State%TD_StConn%TouchConnectionHeight-data%State%TD_StConn%ConnectionHeight) - data%State%TD_String%WeightOnBit = ((data%State%TD_String%StaticHookLoad/2.0d0)/data%State%TD_String%DlMax)*(data%State%TD_String%DlMax-data%State%TD_String%DlTouch) !(data%State%TD_String%StaticHookLoad/2.0d0) ---> because of Uniform drill stem(drillpipes) ?????????? - else - data%State%TD_String%WeightOnBit = 0.d0 ![lb] - end if - - Call Set_WeightOnBit(AINT(real(data%State%TD_String%WeightOnBit,8))) - - - - - - +subroutine TD_WeightOnBitCalculation + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + use CDataDisplayConsole + use SimulationVariables + + + implicit none + + Integer :: i + + + !data%State%TD_StConn%TouchConnectionHeight = data%State%TD_String%DlMax + data%State%TD_String%DrillStemTotalLengthIni - data%State%TD_WellGeneral%WellTotalLength + data%State%TD_StConn%TouchConnectionHeight = data%State%TD_String%DrillStemTotalLengthIni - data%State%TD_WellGeneral%WellTotalLength + + + + !if (data%State%TD_DrillStems(1)%ComponentType == 0) then ????????????? + + + + !if (data%State%TD_DrillStems(1)%DownDepth < data%State%TD_WellGeneral%WellTotalLength) then + if (data%State%TD_StConn%ConnectionHeight < data%State%TD_StConn%TouchConnectionHeight) then + data%State%TD_String%DlTouch = data%State%TD_String%DlMax-(data%State%TD_StConn%TouchConnectionHeight-data%State%TD_StConn%ConnectionHeight) + data%State%TD_String%WeightOnBit = ((data%State%TD_String%StaticHookLoad/2.0d0)/data%State%TD_String%DlMax)*(data%State%TD_String%DlMax-data%State%TD_String%DlTouch) !(data%State%TD_String%StaticHookLoad/2.0d0) ---> because of Uniform drill stem(drillpipes) ?????????? + else + data%State%TD_String%WeightOnBit = 0.d0 ![lb] + end if + + Call Set_WeightOnBit(AINT(real(data%State%TD_String%WeightOnBit,8))) + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_MainCalculations.f90 b/TorqueDrag/TD_MainCalculations.f90 index 8f0299b..f3bebe4 100644 --- a/TorqueDrag/TD_MainCalculations.f90 +++ b/TorqueDrag/TD_MainCalculations.f90 @@ -1,121 +1,121 @@ -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 - - - - - +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 \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/GeoElements_FluidModule.f90 b/TorqueDrag/TD_Modules/GeoElements_FluidModule.f90 index 3041587..7eeb9db 100644 --- a/TorqueDrag/TD_Modules/GeoElements_FluidModule.f90 +++ b/TorqueDrag/TD_Modules/GeoElements_FluidModule.f90 @@ -1,58 +1,58 @@ -MODULE GeoElements_FluidModule - - IMPLICIT NONE - PUBLIC - - - -!************************************************************************************************************************************ - TYPE , PUBLIC :: Geo_Data - REAL(8) , Allocatable :: MD(:) , TVD(:) , Angle(:) - END TYPE Geo_Data -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Well Geometrical Elements Info (for fluid module) -!==================================================== - TYPE , PUBLIC :: F_StringData - INTEGER :: FirstElement , LastElement , ElType - REAL(8) :: ID , OD , TopDepth , DownDepth - END TYPE F_StringData -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ - TYPE , PUBLIC :: F_IntervalsCountsData - INTEGER :: IntervalsTotalCounts , StringIntervalCounts , BottomHoleIntervalCounts , AnnulusIntervalCounts - INTEGER :: OutOfWellIntervalCounts - END TYPE F_IntervalsCountsData -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ - TYPE , PUBLIC :: F_IntervalData - INTEGER :: Number , GeoType - REAL(8) :: ID , OD , StartDepth , EndDepth , HydDiameter , Volume - REAL(8) :: StartTVD , EndTVD , StartAngle , EndAngle - END TYPE F_IntervalData - !####data%State%F_Interval(:)%GeoType = - ! 0 : String Interval - ! 1 : BottomHole Interval - ! 2 : Annulus Interval -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ - TYPE , PUBLIC :: OD_AnnulusData - REAL(8) :: ODValue , StartMD , EndMD - END TYPE OD_AnnulusData -!************************************************************************************************************************************ - - +MODULE GeoElements_FluidModule + + IMPLICIT NONE + PUBLIC + + + +!************************************************************************************************************************************ + TYPE , PUBLIC :: Geo_Data + REAL(8) , Allocatable :: MD(:) , TVD(:) , Angle(:) + END TYPE Geo_Data +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Well Geometrical Elements Info (for fluid module) +!==================================================== + TYPE , PUBLIC :: F_StringData + INTEGER :: FirstElement , LastElement , ElType + REAL(8) :: ID , OD , TopDepth , DownDepth + END TYPE F_StringData +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ + TYPE , PUBLIC :: F_IntervalsCountsData + INTEGER :: IntervalsTotalCounts , StringIntervalCounts , BottomHoleIntervalCounts , AnnulusIntervalCounts + INTEGER :: OutOfWellIntervalCounts + END TYPE F_IntervalsCountsData +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ + TYPE , PUBLIC :: F_IntervalData + INTEGER :: Number , GeoType + REAL(8) :: ID , OD , StartDepth , EndDepth , HydDiameter , Volume + REAL(8) :: StartTVD , EndTVD , StartAngle , EndAngle + END TYPE F_IntervalData + !####data%State%F_Interval(:)%GeoType = + ! 0 : String Interval + ! 1 : BottomHole Interval + ! 2 : Annulus Interval +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ + TYPE , PUBLIC :: OD_AnnulusData + REAL(8) :: ODValue , StartMD , EndMD + END TYPE OD_AnnulusData +!************************************************************************************************************************************ + + END MODULE GeoElements_FluidModule \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/TD_DrillStem.f90 b/TorqueDrag/TD_Modules/TD_DrillStem.f90 index e9eb26c..db29daa 100644 --- a/TorqueDrag/TD_Modules/TD_DrillStem.f90 +++ b/TorqueDrag/TD_Modules/TD_DrillStem.f90 @@ -1,111 +1,111 @@ -MODULE TD_DrillStemComponents - - Use CDownHoleVariables - - IMPLICIT NONE - PUBLIC - - -!************************************************************************************************************************************ - TYPE, PUBLIC :: TD_StringInfo - INTEGER :: StringConfigurationCount , DrillStemComponentsNumbs , DrillStemForceType - INTEGER :: NoHorizontalMudElements , NoStringMudElements , NoCasingMudElements - REAL(8) :: DrillStemTotalLength , DrillStemTotalLengthIni , OutOfWellLength , DrillStemTotalWeight , DrillStemBottom - REAL(8) :: DrillStemAxialVelocity , DrillStemRotVelocity , TopJointHeight - REAL(8) :: WeightOnBit , BitTorque , TotalTorque , StaticHookLoad , DlMax , DlTotal , DlTouch - REAL(8) :: HookLoad , StringTorque - REAL(8) :: ToolJointRange - real(8) , allocatable :: FluidMudDensity(:) , FluidMudEndX(:) , FluidMudStartX(:) - !==================================================== - ! Separated Parts of the Drill Stem - INTEGER :: NearFloorConnectionNo - REAL(8) :: NearFloorConnectionHeight - !==================================================== - END TYPE TD_StringInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Drill Stem Components Info -!==================================================== - TYPE, PUBLIC :: TD_DrillStemInfo - INTEGER :: Numbs , ComponentType - REAL(8) :: Length , TopDepth , DownDepth , Od , Id , WeightperLength , TotalLength , TotalWeight - END TYPE TD_DrillStemInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Separated Parts of the Drill Stem -!==================================================== - TYPE , PUBLIC :: TD_SeparatedDrillStemInfo - !=========> Elements Geometry - INTEGER :: HoleType , ComponentType - REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Area , Weight , WeightperLength , StartAngle , EndAngle - REAL(8) :: RCurvature , RtoolJoint , HoleDiameter , ToolJointRange - !=========> Elements initial Geometry - REAL(8) :: LengthIni , TopDepthIni , DownDepthIni , StartAngleIni , EndAngleIni - !=========> Elements initial Geometry (graphic) - REAL(8) :: TopDepthIniG , DownDepthIniG - !=========> Pipes Properties - REAL(8) :: Density , ElasticModule - !=========> Forces Info - REAL(8) :: Force1 , Force2 , Torque , Drag , CombVelRatio - !=========> Mud Properties - REAL(8) :: MudDensityIn , MudDensityOut , MudViscosity , MudVisCorrectCoef , BouyancyFactor , MudWeight , MudPlasticVis , MudYieldPoint - !=========> Viscous Drag Force - REAL(8) :: FricFactor , DiamRatio , MudClingingConst , PipeVelocity , AveEffVelocity , ReNumber , Dp_Dl - !=========> Hook Load - REAL(8) :: StaticHookLoad , TotalSHookLoad , Dl , DlTotal - END TYPE TD_SeparatedDrillStemInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Add&Remove DrillStem Components -!==================================================== - TYPE , PUBLIC :: TD_AddRemoveInfo - INTEGER :: IBOPNewAdd , IBOPOldAdd , SafetyValveNewAdd , SafetyValveOldAdd , KellyNewAdd , KellyOldAdd - INTEGER :: IBOPNewRemove , IBOPOldRemove , SafetyValveNewRemove , SafetyValveOldRemove , KellyNewRemove , KellyOldRemove - INTEGER , Dimension(19) :: KellyOldStatus , KellyNewStatus - !integer :: TD_KellyOldStatus1 , TD_KellyNewStatus1 , TD_KellyOldStatus2 , TD_KellyNewStatus2 , TD_KellyOldStatus3 , TD_KellyNewStatus3 - !integer :: TD_KellyOldStatus4 , TD_KellyNewStatus4 , TD_KellyOldStatus5 , TD_KellyNewStatus5 , TD_KellyOldStatus6 , TD_KellyNewStatus6 - !integer :: TD_KellyOldStatus7 , TD_KellyNewStatus7 , TD_KellyOldStatus8 , TD_KellyNewStatus8 - !integer :: TD_KellyOldStatus9 , TD_KellyNewStatus9 , TD_KellyOldStatus10 , TD_KellyNewStatus10 - !integer :: TD_KellyOldStatus11 , TD_KellyNewStatus11 , TD_KellyOldStatus12 , TD_KellyNewStatus12 - !integer :: TD_KellyOldStatus13 , TD_KellyNewStatus13 , TD_KellyOldStatus14 , TD_KellyNewStatus14 - !integer :: TD_KellyOldStatus15 , TD_KellyNewStatus15 , TD_KellyOldStatus16 , TD_KellyNewStatus16 , TD_KellyOldStatus17 , TD_KellyNewStatus17 - !integer :: TD_KellyOldStatus18 , TD_KellyNewStatus18 , TD_KellyOldStatus19 , TD_KellyNewStatus19 - END TYPE TD_AddRemoveInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Graphic Output Info -!==================================================== - !TYPE, PUBLIC :: CStringComponent - ! Integer :: ComponentType - ! REAL(8) :: Length , TopDepth , DownDepth , Od , Id - !END TYPE CStringComponent -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Removed-Volume Variables -!==================================================== - TYPE , PUBLIC :: TD_RemovedVolumeInfo - Integer :: PreCount - REAL(8) :: RemoveVolume , PreElementVolume , PreElementLength - END TYPE TD_RemovedVolumeInfo -!************************************************************************************************************************************ +MODULE TD_DrillStemComponents + + Use CDownHoleVariables + + IMPLICIT NONE + PUBLIC + + +!************************************************************************************************************************************ + TYPE, PUBLIC :: TD_StringInfo + INTEGER :: StringConfigurationCount , DrillStemComponentsNumbs , DrillStemForceType + INTEGER :: NoHorizontalMudElements , NoStringMudElements , NoCasingMudElements + REAL(8) :: DrillStemTotalLength , DrillStemTotalLengthIni , OutOfWellLength , DrillStemTotalWeight , DrillStemBottom + REAL(8) :: DrillStemAxialVelocity , DrillStemRotVelocity , TopJointHeight + REAL(8) :: WeightOnBit , BitTorque , TotalTorque , StaticHookLoad , DlMax , DlTotal , DlTouch + REAL(8) :: HookLoad , StringTorque + REAL(8) :: ToolJointRange + real(8) , allocatable :: FluidMudDensity(:) , FluidMudEndX(:) , FluidMudStartX(:) + !==================================================== + ! Separated Parts of the Drill Stem + INTEGER :: NearFloorConnectionNo + REAL(8) :: NearFloorConnectionHeight + !==================================================== + END TYPE TD_StringInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Drill Stem Components Info +!==================================================== + TYPE, PUBLIC :: TD_DrillStemInfo + INTEGER :: Numbs , ComponentType + REAL(8) :: Length , TopDepth , DownDepth , Od , Id , WeightperLength , TotalLength , TotalWeight + END TYPE TD_DrillStemInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Separated Parts of the Drill Stem +!==================================================== + TYPE , PUBLIC :: TD_SeparatedDrillStemInfo + !=========> Elements Geometry + INTEGER :: HoleType , ComponentType + REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Area , Weight , WeightperLength , StartAngle , EndAngle + REAL(8) :: RCurvature , RtoolJoint , HoleDiameter , ToolJointRange + !=========> Elements initial Geometry + REAL(8) :: LengthIni , TopDepthIni , DownDepthIni , StartAngleIni , EndAngleIni + !=========> Elements initial Geometry (graphic) + REAL(8) :: TopDepthIniG , DownDepthIniG + !=========> Pipes Properties + REAL(8) :: Density , ElasticModule + !=========> Forces Info + REAL(8) :: Force1 , Force2 , Torque , Drag , CombVelRatio + !=========> Mud Properties + REAL(8) :: MudDensityIn , MudDensityOut , MudViscosity , MudVisCorrectCoef , BouyancyFactor , MudWeight , MudPlasticVis , MudYieldPoint + !=========> Viscous Drag Force + REAL(8) :: FricFactor , DiamRatio , MudClingingConst , PipeVelocity , AveEffVelocity , ReNumber , Dp_Dl + !=========> Hook Load + REAL(8) :: StaticHookLoad , TotalSHookLoad , Dl , DlTotal + END TYPE TD_SeparatedDrillStemInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Add&Remove DrillStem Components +!==================================================== + TYPE , PUBLIC :: TD_AddRemoveInfo + INTEGER :: IBOPNewAdd , IBOPOldAdd , SafetyValveNewAdd , SafetyValveOldAdd , KellyNewAdd , KellyOldAdd + INTEGER :: IBOPNewRemove , IBOPOldRemove , SafetyValveNewRemove , SafetyValveOldRemove , KellyNewRemove , KellyOldRemove + INTEGER , Dimension(19) :: KellyOldStatus , KellyNewStatus + !integer :: TD_KellyOldStatus1 , TD_KellyNewStatus1 , TD_KellyOldStatus2 , TD_KellyNewStatus2 , TD_KellyOldStatus3 , TD_KellyNewStatus3 + !integer :: TD_KellyOldStatus4 , TD_KellyNewStatus4 , TD_KellyOldStatus5 , TD_KellyNewStatus5 , TD_KellyOldStatus6 , TD_KellyNewStatus6 + !integer :: TD_KellyOldStatus7 , TD_KellyNewStatus7 , TD_KellyOldStatus8 , TD_KellyNewStatus8 + !integer :: TD_KellyOldStatus9 , TD_KellyNewStatus9 , TD_KellyOldStatus10 , TD_KellyNewStatus10 + !integer :: TD_KellyOldStatus11 , TD_KellyNewStatus11 , TD_KellyOldStatus12 , TD_KellyNewStatus12 + !integer :: TD_KellyOldStatus13 , TD_KellyNewStatus13 , TD_KellyOldStatus14 , TD_KellyNewStatus14 + !integer :: TD_KellyOldStatus15 , TD_KellyNewStatus15 , TD_KellyOldStatus16 , TD_KellyNewStatus16 , TD_KellyOldStatus17 , TD_KellyNewStatus17 + !integer :: TD_KellyOldStatus18 , TD_KellyNewStatus18 , TD_KellyOldStatus19 , TD_KellyNewStatus19 + END TYPE TD_AddRemoveInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Graphic Output Info +!==================================================== + !TYPE, PUBLIC :: CStringComponent + ! Integer :: ComponentType + ! REAL(8) :: Length , TopDepth , DownDepth , Od , Id + !END TYPE CStringComponent +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Removed-Volume Variables +!==================================================== + TYPE , PUBLIC :: TD_RemovedVolumeInfo + Integer :: PreCount + REAL(8) :: RemoveVolume , PreElementVolume , PreElementLength + END TYPE TD_RemovedVolumeInfo +!************************************************************************************************************************************ END MODULE TD_DrillStemComponents \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/TD_GeneralData.f90 b/TorqueDrag/TD_Modules/TD_GeneralData.f90 index d356248..c6b33ce 100644 --- a/TorqueDrag/TD_Modules/TD_GeneralData.f90 +++ b/TorqueDrag/TD_Modules/TD_GeneralData.f90 @@ -1,50 +1,50 @@ -MODULE TD_GeneralData - - Use CDownHoleTypes - - IMPLICIT NONE - PUBLIC - - - -!************************************************************************************************************************************ -!==================================================== -! General Info -!==================================================== -!=====> Time Info - TYPE , PUBLIC :: TD_GeneralInfo - REAL :: TimeStep - !=====> Problems - INTEGER :: WeightIndicatorMalf - END TYPE TD_GeneralInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!=====> BOP Info - TYPE , PUBLIC :: TD_BOPInfo - REAL(8) :: AboveAnnularDiam , AnnularPreventerDiam , UpperRamDiam , LowerRamDiam , BlindRamDiam , KillDiam - REAL(8) , Dimension(6) :: BOPHeight , BOPDiam - REAL(8) , Dimension(4) :: BOPRamDiam - REAL(8) :: BOPThickness , AnnularFillingFinal - INTEGER , Dimension(4) :: BOPCondition - INTEGER , Dimension(6) :: BOPElementNo - INTEGER , Dimension(6) :: BOPConnectionPossibility ! 0:impossible , 1:possible(for DrillPipe Element) - END TYPE TD_BOPInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ - !TYPE , PUBLIC :: TD_BOPElementData - ! INTEGER :: CType - ! REAL(8) :: TopDepth , DownDepth - !END TYPE TD_BOPElementData -!************************************************************************************************************************************ - - - - - +MODULE TD_GeneralData + + Use CDownHoleTypes + + IMPLICIT NONE + PUBLIC + + + +!************************************************************************************************************************************ +!==================================================== +! General Info +!==================================================== +!=====> Time Info + TYPE , PUBLIC :: TD_GeneralInfo + REAL :: TimeStep + !=====> Problems + INTEGER :: WeightIndicatorMalf + END TYPE TD_GeneralInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!=====> BOP Info + TYPE , PUBLIC :: TD_BOPInfo + REAL(8) :: AboveAnnularDiam , AnnularPreventerDiam , UpperRamDiam , LowerRamDiam , BlindRamDiam , KillDiam + REAL(8) , Dimension(6) :: BOPHeight , BOPDiam + REAL(8) , Dimension(4) :: BOPRamDiam + REAL(8) :: BOPThickness , AnnularFillingFinal + INTEGER , Dimension(4) :: BOPCondition + INTEGER , Dimension(6) :: BOPElementNo + INTEGER , Dimension(6) :: BOPConnectionPossibility ! 0:impossible , 1:possible(for DrillPipe Element) + END TYPE TD_BOPInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ + !TYPE , PUBLIC :: TD_BOPElementData + ! INTEGER :: CType + ! REAL(8) :: TopDepth , DownDepth + !END TYPE TD_BOPElementData +!************************************************************************************************************************************ + + + + + END MODULE TD_GeneralData \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/TD_StringConnectionData.f90 b/TorqueDrag/TD_Modules/TD_StringConnectionData.f90 index 4e7feb8..b30816f 100644 --- a/TorqueDrag/TD_Modules/TD_StringConnectionData.f90 +++ b/TorqueDrag/TD_Modules/TD_StringConnectionData.f90 @@ -1,43 +1,43 @@ -MODULE TD_StringConnectionData - - IMPLICIT NONE - PUBLIC - - - -!************************************************************************************************************************************ -!==================================================== -! String Connection Info -!==================================================== - TYPE , PUBLIC :: TD_StringconnectionInfo - INTEGER :: StringConnectionMode , KellyDriveTypeMode , OldOperationCondition , FluidStringConnectionMode - REAL(8) :: ConnectionHeight , TouchConnectionHeight , RigidConnectionHeight , GRigidConnectionHeight , StringVelocity - REAL(8) :: HookHeightOld , HookHeight , HookVelocity - REAL(8) :: ElevatorHeight , ElevatorConst - REAL(8) :: SafetyValveLength , IBOPLength , KellyElementID , KellyElementOD - REAL(8) :: KellyConnectionHeight , KellyConst , KellyElementConst - REAL(8) :: TDSHeight , TDSElevatorHeight , TDSLength , TDSElevatorLength , TDSToolJointLength , TDSElevatorToolLength - REAL(8) :: TDSElevatorECG , ElevatorECG - END TYPE TD_StringconnectionInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Weight Indicator Info -!==================================================== - TYPE , PUBLIC :: TD_LoadInfo - INTEGER :: NumOfCables - REAL(8) :: WeightIndicator - REAL(8) :: WeightTB , WeightTD , KellyWeight - INTEGER :: ZeroStringSpeed - REAL(8) :: DrawworksLoadInput - END TYPE TD_LoadInfo -!************************************************************************************************************************************ - - - - - +MODULE TD_StringConnectionData + + IMPLICIT NONE + PUBLIC + + + +!************************************************************************************************************************************ +!==================================================== +! String Connection Info +!==================================================== + TYPE , PUBLIC :: TD_StringconnectionInfo + INTEGER :: StringConnectionMode , KellyDriveTypeMode , OldOperationCondition , FluidStringConnectionMode + REAL(8) :: ConnectionHeight , TouchConnectionHeight , RigidConnectionHeight , GRigidConnectionHeight , StringVelocity + REAL(8) :: HookHeightOld , HookHeight , HookVelocity + REAL(8) :: ElevatorHeight , ElevatorConst + REAL(8) :: SafetyValveLength , IBOPLength , KellyElementID , KellyElementOD + REAL(8) :: KellyConnectionHeight , KellyConst , KellyElementConst + REAL(8) :: TDSHeight , TDSElevatorHeight , TDSLength , TDSElevatorLength , TDSToolJointLength , TDSElevatorToolLength + REAL(8) :: TDSElevatorECG , ElevatorECG + END TYPE TD_StringconnectionInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Weight Indicator Info +!==================================================== + TYPE , PUBLIC :: TD_LoadInfo + INTEGER :: NumOfCables + REAL(8) :: WeightIndicator + REAL(8) :: WeightTB , WeightTD , KellyWeight + INTEGER :: ZeroStringSpeed + REAL(8) :: DrawworksLoadInput + END TYPE TD_LoadInfo +!************************************************************************************************************************************ + + + + + END MODULE TD_StringConnectionData \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/TD_WellElements.f90 b/TorqueDrag/TD_Modules/TD_WellElements.f90 index 16fce66..30abebf 100644 --- a/TorqueDrag/TD_Modules/TD_WellElements.f90 +++ b/TorqueDrag/TD_Modules/TD_WellElements.f90 @@ -1,68 +1,68 @@ -MODULE TD_WellElements - - IMPLICIT NONE - PUBLIC - - - -!************************************************************************************************************************************ - TYPE , PUBLIC :: TD_WellElementsInfo - INTEGER :: CasingNumbs - INTEGER :: LinerNumbs - INTEGER :: OpenHoleNumbs - INTEGER :: ROPHoleNumbs - REAL(8) :: ROP - END TYPE TD_WellElementsInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Casing Info -!==================================================== - TYPE, PUBLIC :: TD_CasingInfo - INTEGER :: HoleType - REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Weight , CollapsePressure , TensileStrength , Roughness - END TYPE TD_CasingInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Liner Info -!==================================================== - TYPE, PUBLIC :: TD_LinerInfo - REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Weight , CollapsePressure , TensileStrength , Roughness , HoleType - END TYPE TD_LinerInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! Open_Hole Info -!==================================================== - TYPE, PUBLIC :: TD_OpenHoleInfo - REAL(8) :: Length , TopDepth , DownDepth , Id , HoleType - END TYPE TD_OpenHoleInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ -!==================================================== -! ROP_Hole Info -!==================================================== - TYPE, PUBLIC :: TD_ROPHoleInfo - REAL(8) :: Length , TopDepth , DownDepth , Id , HoleType - END TYPE TD_ROPHoleInfo -!************************************************************************************************************************************ - - - - - - +MODULE TD_WellElements + + IMPLICIT NONE + PUBLIC + + + +!************************************************************************************************************************************ + TYPE , PUBLIC :: TD_WellElementsInfo + INTEGER :: CasingNumbs + INTEGER :: LinerNumbs + INTEGER :: OpenHoleNumbs + INTEGER :: ROPHoleNumbs + REAL(8) :: ROP + END TYPE TD_WellElementsInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Casing Info +!==================================================== + TYPE, PUBLIC :: TD_CasingInfo + INTEGER :: HoleType + REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Weight , CollapsePressure , TensileStrength , Roughness + END TYPE TD_CasingInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Liner Info +!==================================================== + TYPE, PUBLIC :: TD_LinerInfo + REAL(8) :: Length , TopDepth , DownDepth , Od , Id , Weight , CollapsePressure , TensileStrength , Roughness , HoleType + END TYPE TD_LinerInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! Open_Hole Info +!==================================================== + TYPE, PUBLIC :: TD_OpenHoleInfo + REAL(8) :: Length , TopDepth , DownDepth , Id , HoleType + END TYPE TD_OpenHoleInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ +!==================================================== +! ROP_Hole Info +!==================================================== + TYPE, PUBLIC :: TD_ROPHoleInfo + REAL(8) :: Length , TopDepth , DownDepth , Id , HoleType + END TYPE TD_ROPHoleInfo +!************************************************************************************************************************************ + + + + + + END MODULE TD_WellElements \ No newline at end of file diff --git a/TorqueDrag/TD_Modules/TD_WellGeometry.f90 b/TorqueDrag/TD_Modules/TD_WellGeometry.f90 index 60d92d3..a0017ab 100644 --- a/TorqueDrag/TD_Modules/TD_WellGeometry.f90 +++ b/TorqueDrag/TD_Modules/TD_WellGeometry.f90 @@ -1,33 +1,33 @@ -MODULE TD_WellGeometry - - IMPLICIT NONE - PUBLIC - - ! REAL(8) , PARAMETER :: pi=3.14159265d0 - - - -!************************************************************************************************************************************ -!==================================================== -! Well Geometry Info -!==================================================== - TYPE, PUBLIC :: TD_WellGeneralInfo - INTEGER :: WellIntervalsCount - REAL(8) :: WellTotalLength , WellTotalVerticalLength - END TYPE TD_WellGeneralInfo -!************************************************************************************************************************************ - - - -!************************************************************************************************************************************ - TYPE, PUBLIC :: TD_WellGeometryData - INTEGER :: HoleType - REAL(8) :: StartAngle , EndAngle , IntervalLength , VerticalDepth , TopDepth , DownDepth , RCurvature - END TYPE TD_WellGeometryData -!************************************************************************************************************************************ - - - - - +MODULE TD_WellGeometry + + IMPLICIT NONE + PUBLIC + + ! REAL(8) , PARAMETER :: pi=3.14159265d0 + + + +!************************************************************************************************************************************ +!==================================================== +! Well Geometry Info +!==================================================== + TYPE, PUBLIC :: TD_WellGeneralInfo + INTEGER :: WellIntervalsCount + REAL(8) :: WellTotalLength , WellTotalVerticalLength + END TYPE TD_WellGeneralInfo +!************************************************************************************************************************************ + + + +!************************************************************************************************************************************ + TYPE, PUBLIC :: TD_WellGeometryData + INTEGER :: HoleType + REAL(8) :: StartAngle , EndAngle , IntervalLength , VerticalDepth , TopDepth , DownDepth , RCurvature + END TYPE TD_WellGeometryData +!************************************************************************************************************************************ + + + + + END MODULE TD_WellGeometry \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 index 97f1f58..f15c239 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 @@ -1,145 +1,145 @@ -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 - - - - - - +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 \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 index 3e77030..cda76a2 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 @@ -1,59 +1,59 @@ -subroutine TD_ForceReadData - - use CHoistingVariables - use SimulationVariables - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - Use sROP_Variables - - - implicit none - - - integer :: i - - - - data%State%TD_String%DrillStemAxialVelocity = data%State%TD_StConn%StringVelocity - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - if ( data%State%Hoisting%DriveType==1) then - data%State%TD_String%DrillStemRotVelocity = (2.d0*pi*data%State%TD_DrillStems(i)%RtoolJoint)*(data%State%RTable%Speed)/60.d0 ! data%State%RTable%Speed[RPM] ---> data%State%TD_String%DrillStemRotVelocity[ft/s] - else if ( data%State%Hoisting%DriveType==0) then - data%State%TD_String%DrillStemRotVelocity = (2.d0*pi*data%State%TD_DrillStems(i)%RtoolJoint)*(data%State%TDS%Speed+data%State%RTable%Speed)/60.d0 ! data%State%TDS%Speed[RPM] ---> data%State%TD_String%DrillStemRotVelocity[ft/s] - end if - End Do - - - - - data%State%TD_String%BitTorque = data%State%ROP_Bit%BitTorque - - - - - - !data%State%TD_String%DrillStemAxialVelocity = 0.0 !??????????????????? - !data%State%TD_String%DrillStemRotVelocity = 0.0 !??????????????????? - - - - - data%State%TD_String%DrillStemForceType = 0 - if(data%State%TD_String%DrillStemAxialVelocity > 0.) then !??????????????????? check - data%State%TD_String%DrillStemForceType = 1 - if(data%State%TD_String%DrillStemRotVelocity /= 0.d0) data%State%TD_String%DrillStemForceType = 2 - else if(data%State%TD_String%DrillStemAxialVelocity < 0.d0) then - data%State%TD_String%DrillStemForceType = 3 - if(data%State%TD_String%DrillStemRotVelocity /= 0.d0) data%State%TD_String%DrillStemForceType = 4 - else if(data%State%TD_String%DrillStemAxialVelocity == 0.d0) then - data%State%TD_String%DrillStemForceType = 5 !no axial motion - end if - - - - - - +subroutine TD_ForceReadData + + use CHoistingVariables + use SimulationVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + Use sROP_Variables + + + implicit none + + + integer :: i + + + + data%State%TD_String%DrillStemAxialVelocity = data%State%TD_StConn%StringVelocity + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + if ( data%Configuration%Hoisting%DriveType==1) then + data%State%TD_String%DrillStemRotVelocity = (2.d0*pi*data%State%TD_DrillStems(i)%RtoolJoint)*(data%State%RTable%Speed)/60.d0 ! data%State%RTable%Speed[RPM] ---> data%State%TD_String%DrillStemRotVelocity[ft/s] + else if ( data%Configuration%Hoisting%DriveType==0) then + data%State%TD_String%DrillStemRotVelocity = (2.d0*pi*data%State%TD_DrillStems(i)%RtoolJoint)*(data%State%TDS%Speed+data%State%RTable%Speed)/60.d0 ! data%State%TDS%Speed[RPM] ---> data%State%TD_String%DrillStemRotVelocity[ft/s] + end if + End Do + + + + + data%State%TD_String%BitTorque = data%State%ROP_Bit%BitTorque + + + + + + !data%State%TD_String%DrillStemAxialVelocity = 0.0 !??????????????????? + !data%State%TD_String%DrillStemRotVelocity = 0.0 !??????????????????? + + + + + data%State%TD_String%DrillStemForceType = 0 + if(data%State%TD_String%DrillStemAxialVelocity > 0.) then !??????????????????? check + data%State%TD_String%DrillStemForceType = 1 + if(data%State%TD_String%DrillStemRotVelocity /= 0.d0) data%State%TD_String%DrillStemForceType = 2 + else if(data%State%TD_String%DrillStemAxialVelocity < 0.d0) then + data%State%TD_String%DrillStemForceType = 3 + if(data%State%TD_String%DrillStemRotVelocity /= 0.d0) data%State%TD_String%DrillStemForceType = 4 + else if(data%State%TD_String%DrillStemAxialVelocity == 0.d0) then + data%State%TD_String%DrillStemForceType = 5 !no axial motion + end if + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 index 4ace86f..ae6da7b 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 @@ -1,97 +1,97 @@ -subroutine TD_MudPropertiesReadData (i) - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - USE FricPressDropVarsModule - USE MudSystemVARIABLES -use SimulationVariables !@@@ - - implicit none - - - - Integer :: i , j , TDmd - real(8) :: TDden, TDpre, TDtem - - - -!==================================================== -! Set Mud Properties Data -!==================================================== - IF ( ALLOCATED(FlowEl) ) THEN - if ( i==2 ) then - TDmd = int(data%State%TD_DrillStems(i)%DownDepthIni-1.d0) - else - TDmd = int(data%State%TD_DrillStems(i)%DownDepthIni) - end if - Call StringPropertyCalculator (TDmd , TDden, TDpre, TDtem) - data%State%TD_DrillStems(i)%MudDensityIn = TDden*7.48051948d0 ! [ppg]*7.48051948=[lb/ft3] - Call AnnulusPropertyCalculator (TDmd , TDden, TDpre, TDtem) - data%State%TD_DrillStems(i)%MudDensityOut = TDden*7.48051948d0 ! [ppg]*7.48051948=[lb/ft3] - data%State%TD_DrillStems(i)%MudWeight = TDden ! [ppg] ??????????????? - ELSE - data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_DrillStems(i)%MudDensityIn - data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut - data%State%TD_DrillStems(i)%MudWeight = data%State%TD_DrillStems(i)%MudWeight - END IF - - - !data%State%TD_DrillStems(i)%Drag = - - - - - - !IF (ALLOCATED(data%State%TD_String%FluidMudDensity) .and. ALLOCATED(data%State%TD_String%FluidMudStartX) .and. data%State%TD_String%NoStringMudElements/=0) THEN - ! Do j = TD_StringNoHorizontalMudElements+1,TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements - ! if ( data%State%TD_DrillStems(i)%DownDepthIni<=data%State%TD_String%FluidMudStartX(j) ) then - ! exit - ! end if - ! data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_String%FluidMudDensity(j)*7.48051948d0 !10.*7.48051948 ! [ppg]*7.48051948=[lb/ft3] - ! !print*, 'data%State%TD_DrillStems(i)%MudDensityIn=' ,data%State%TD_DrillStems(i)%MudDensityIn , i - ! !print*, 'FlowEl(j)%density=' ,FlowEl(j)%density , i - ! End Do - !ELSE - ! data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_DrillStems(i)%MudDensityIn ! [ppg]*7.48051948=[lb/ft3] - !! !print*, '=================' , i - !END IF - ! - ! - ! - ! - ! - ! - ! - !IF (ALLOCATED(data%State%TD_String%FluidMudDensity) .and. ALLOCATED(data%State%TD_String%FluidMudEndX) .and. data%State%TD_String%NoCasingMudElements/=0) THEN - ! Do j = (TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements),(TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+1),-1 - ! if ( data%State%TD_DrillStems(i)%DownDepthIni<=data%State%TD_String%FluidMudEndX(j) ) then - ! exit - ! end if - ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_String%FluidMudDensity(j)*7.48051948d0 !10.*7.48051948 ! [ppg]*7.48051948=[lb/ft3] - ! data%State%TD_DrillStems(i)%MudWeight = data%State%TD_String%FluidMudDensity(j) !10.0 ! [ppg] ??????????????? - ! End Do - !ELSE - ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut ! [ppg]*7.48051948=[lb/ft3] - ! data%State%TD_DrillStems(i)%MudWeight = data%State%TD_DrillStems(i)%MudWeight ! [ppg] ??????????????? - !END IF - - - - - - - - - data%State%TD_DrillStems(i)%MudPlasticVis = 5.d0+(5.d0*(data%State%TD_DrillStems(i)%MudWeight-8.3d0)) ! [cP] - !data%State%TD_DrillStems(i)%MudPlasticVis= data%State%TD_DrillStems(i)%MudPlasticVis * 6.71968d-4 ! [cP]*6.71968d-4=[lb/(ft.s)] - data%State%TD_DrillStems(i)%MudViscosity = 0.2d0 !data%State%TD_DrillStems(i)%MudPlasticVis - data%State%TD_DrillStems(i)%MudYieldPoint = 10.d0+(data%State%TD_DrillStems(i)%MudWeight-8.3d0) - - - - - - +subroutine TD_MudPropertiesReadData (i) + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + USE FricPressDropVarsModule + USE MudSystemVARIABLES +use SimulationVariables !@@@ + + implicit none + + + + Integer :: i , j , TDmd + real(8) :: TDden, TDpre, TDtem + + + +!==================================================== +! Set Mud Properties Data +!==================================================== + IF ( ALLOCATED(FlowEl) ) THEN + if ( i==2 ) then + TDmd = int(data%State%TD_DrillStems(i)%DownDepthIni-1.d0) + else + TDmd = int(data%State%TD_DrillStems(i)%DownDepthIni) + end if + Call StringPropertyCalculator (TDmd , TDden, TDpre, TDtem) + data%State%TD_DrillStems(i)%MudDensityIn = TDden*7.48051948d0 ! [ppg]*7.48051948=[lb/ft3] + Call AnnulusPropertyCalculator (TDmd , TDden, TDpre, TDtem) + data%State%TD_DrillStems(i)%MudDensityOut = TDden*7.48051948d0 ! [ppg]*7.48051948=[lb/ft3] + data%State%TD_DrillStems(i)%MudWeight = TDden ! [ppg] ??????????????? + ELSE + data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_DrillStems(i)%MudDensityIn + data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut + data%State%TD_DrillStems(i)%MudWeight = data%State%TD_DrillStems(i)%MudWeight + END IF + + + !data%State%TD_DrillStems(i)%Drag = + + + + + + !IF (ALLOCATED(data%State%TD_String%FluidMudDensity) .and. ALLOCATED(data%State%TD_String%FluidMudStartX) .and. data%State%TD_String%NoStringMudElements/=0) THEN + ! Do j = TD_StringNoHorizontalMudElements+1,TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements + ! if ( data%State%TD_DrillStems(i)%DownDepthIni<=data%State%TD_String%FluidMudStartX(j) ) then + ! exit + ! end if + ! data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_String%FluidMudDensity(j)*7.48051948d0 !10.*7.48051948 ! [ppg]*7.48051948=[lb/ft3] + ! !print*, 'data%State%TD_DrillStems(i)%MudDensityIn=' ,data%State%TD_DrillStems(i)%MudDensityIn , i + ! !print*, 'FlowEl(j)%density=' ,FlowEl(j)%density , i + ! End Do + !ELSE + ! data%State%TD_DrillStems(i)%MudDensityIn = data%State%TD_DrillStems(i)%MudDensityIn ! [ppg]*7.48051948=[lb/ft3] + !! !print*, '=================' , i + !END IF + ! + ! + ! + ! + ! + ! + ! + !IF (ALLOCATED(data%State%TD_String%FluidMudDensity) .and. ALLOCATED(data%State%TD_String%FluidMudEndX) .and. data%State%TD_String%NoCasingMudElements/=0) THEN + ! Do j = (TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+data%State%TD_String%NoCasingMudElements),(TD_StringNoHorizontalMudElements+data%State%TD_String%NoStringMudElements+1),-1 + ! if ( data%State%TD_DrillStems(i)%DownDepthIni<=data%State%TD_String%FluidMudEndX(j) ) then + ! exit + ! end if + ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_String%FluidMudDensity(j)*7.48051948d0 !10.*7.48051948 ! [ppg]*7.48051948=[lb/ft3] + ! data%State%TD_DrillStems(i)%MudWeight = data%State%TD_String%FluidMudDensity(j) !10.0 ! [ppg] ??????????????? + ! End Do + !ELSE + ! data%State%TD_DrillStems(i)%MudDensityOut = data%State%TD_DrillStems(i)%MudDensityOut ! [ppg]*7.48051948=[lb/ft3] + ! data%State%TD_DrillStems(i)%MudWeight = data%State%TD_DrillStems(i)%MudWeight ! [ppg] ??????????????? + !END IF + + + + + + + + + data%State%TD_DrillStems(i)%MudPlasticVis = 5.d0+(5.d0*(data%State%TD_DrillStems(i)%MudWeight-8.3d0)) ! [cP] + !data%State%TD_DrillStems(i)%MudPlasticVis= data%State%TD_DrillStems(i)%MudPlasticVis * 6.71968d-4 ! [cP]*6.71968d-4=[lb/(ft.s)] + data%State%TD_DrillStems(i)%MudViscosity = 0.2d0 !data%State%TD_DrillStems(i)%MudPlasticVis + data%State%TD_DrillStems(i)%MudYieldPoint = 10.d0+(data%State%TD_DrillStems(i)%MudWeight-8.3d0) + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 index 7b8fd8c..643a832 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 @@ -1,26 +1,26 @@ -subroutine TD_PipePropertiesReadData - - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - - implicit none - - Integer :: i - - -!==================================================== -! Set Pipe Properties Data -!==================================================== - - Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs - data%State%TD_DrillStems(i)%Density = 7850.d0*0.06242796d0 ![kg/m3]*0.06242796=[lb/ft3] - data%State%TD_DrillStems(i)%ElasticModule = 200.0d9*0.02088543d0 ![lb/ft2] !200GPa=29Mpsi (steel) - End Do - - - - - +subroutine TD_PipePropertiesReadData + + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + + implicit none + + Integer :: i + + +!==================================================== +! Set Pipe Properties Data +!==================================================== + + Do i = 1 , data%State%TD_String%DrillStemComponentsNumbs + data%State%TD_DrillStems(i)%Density = 7850.d0*0.06242796d0 ![kg/m3]*0.06242796=[lb/ft3] + data%State%TD_DrillStems(i)%ElasticModule = 200.0d9*0.02088543d0 ![lb/ft2] !200GPa=29Mpsi (steel) + End Do + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 index 71c5dc2..3d4b6ca 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 @@ -1,133 +1,133 @@ -subroutine TD_WellElementsReadData - - Use CCasingLinerChokeVariables - use CStringConfigurationVariables - use SimulationVariables - use SimulationVariables !@ - use SimulationVariables !@ - - implicit none - - - Integer :: i - Real(8) :: TD_OpenHoleLength - - - - -!==================================================== -! Set Casing Data -!==================================================== - data%State%TD_WellEl%CasingNumbs = 1 - - if (Allocated(data%State%TD_Casing)) deAllocate (data%State%TD_Casing) - Allocate (data%State%TD_Casing(data%State%TD_WellEl%CasingNumbs)) - - Do i=1, data%State%TD_WellEl%CasingNumbs - data%State%TD_Casing(i)%Length = data%Configuration%CasingLinerChoke%CasingDepth ! unit: [ft] - data%State%TD_Casing(i)%TopDepth = 0.d0 - data%State%TD_Casing(i)%DownDepth = data%State%TD_Casing(i)%Length - data%State%TD_Casing(i)%Od = data%Configuration%CasingLinerChoke%CasingOd/12.d0 ! unit: [ft] - data%State%TD_Casing(i)%Id = data%Configuration%CasingLinerChoke%CasingId/12.d0 ! unit: [ft] - data%State%TD_Casing(i)%Weight = data%Configuration%CasingLinerChoke%CasingWeight - data%State%TD_Casing(i)%CollapsePressure = data%Configuration%CasingLinerChoke%CasingCollapsePressure - data%State%TD_Casing(i)%TensileStrength = data%Configuration%CasingLinerChoke%CasingTensileStrength - End Do - - - - - -!==================================================== -! Set Liner Data -!==================================================== - data%State%TD_WellEl%LinerNumbs = 0 - if(data%Configuration%CasingLinerChoke%LinerLength > 0.d0) then - data%State%TD_WellEl%LinerNumbs = 1 - - !if (data%State%TD_WellEl%LinerNumbs>0) then - if (Allocated(data%State%TD_Liner)) deAllocate (data%State%TD_Liner) - Allocate (data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)) - - Do i=1, data%State%TD_WellEl%LinerNumbs - data%State%TD_Liner(i)%TopDepth = data%Configuration%CasingLinerChoke%LinerTopDepth ! unit: [ft] - if (data%State%TD_Liner(i)%TopDepth 0.d0) data%State%TD_WellEl%OpenHoleNumbs=1 - - if (data%State%TD_WellEl%OpenHoleNumbs>0) then - if (Allocated(data%State%TD_OpenHole)) deAllocate (data%State%TD_OpenHole) - Allocate (data%State%TD_OpenHole(data%State%TD_WellEl%OpenHoleNumbs)) !!!??????????????????check - - Do i = 1, data%State%TD_WellEl%OpenHoleNumbs - data%State%TD_OpenHole(i)%TopDepth = data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)%DownDepth - data%State%TD_OpenHole(i)%Length = TD_OpenHoleLength ! unit: [ft] - data%State%TD_OpenHole(i)%DownDepth = data%State%TD_OpenHole(i)%TopDepth+data%State%TD_OpenHole(i)%Length - data%State%TD_OpenHole(i)%Id = data%Configuration%CasingLinerChoke%OpenHoleId/12.d0 ! unit: [ft] - End Do - - else - if (Allocated(data%State%TD_OpenHole)) deAllocate (data%State%TD_OpenHole) - Allocate (data%State%TD_OpenHole(1)) - data%State%TD_WellEl%OpenHoleNumbs = 1 - data%State%TD_OpenHole%Length = 0.d0 - data%State%TD_OpenHole%TopDepth = data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)%DownDepth - data%State%TD_OpenHole%DownDepth = data%State%TD_OpenHole%TopDepth - - end if - - - - -!==================================================== -! Set ROP_Hole Data -!==================================================== - - data%State%TD_WellEl%ROPHoleNumbs = 1 - if (Allocated(data%State%TD_ROPHole)) deAllocate (data%State%TD_ROPHole) - Allocate (data%State%TD_ROPHole(data%State%TD_WellEl%ROPHoleNumbs)) - - Do i = 1, data%State%TD_WellEl%ROPHoleNumbs - data%State%TD_ROPHole(i)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth - data%State%TD_ROPHole(i)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth - data%State%TD_ROPHole(i)%Length = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength - data%State%TD_ROPHole(i)%Id = data%Configuration%StringConfiguration%BitDefinition%BitSize/12.d0 ! unit: [ft] - End Do - - - - - - +subroutine TD_WellElementsReadData + + Use CCasingLinerChokeVariables + use CStringConfigurationVariables + use SimulationVariables + use SimulationVariables !@ + use SimulationVariables !@ + + implicit none + + + Integer :: i + Real(8) :: TD_OpenHoleLength + + + + +!==================================================== +! Set Casing Data +!==================================================== + data%State%TD_WellEl%CasingNumbs = 1 + + if (Allocated(data%State%TD_Casing)) deAllocate (data%State%TD_Casing) + Allocate (data%State%TD_Casing(data%State%TD_WellEl%CasingNumbs)) + + Do i=1, data%State%TD_WellEl%CasingNumbs + data%State%TD_Casing(i)%Length = data%Configuration%CasingLinerChoke%CasingDepth ! unit: [ft] + data%State%TD_Casing(i)%TopDepth = 0.d0 + data%State%TD_Casing(i)%DownDepth = data%State%TD_Casing(i)%Length + data%State%TD_Casing(i)%Od = data%Configuration%CasingLinerChoke%CasingOd/12.d0 ! unit: [ft] + data%State%TD_Casing(i)%Id = data%Configuration%CasingLinerChoke%CasingId/12.d0 ! unit: [ft] + data%State%TD_Casing(i)%Weight = data%Configuration%CasingLinerChoke%CasingWeight + data%State%TD_Casing(i)%CollapsePressure = data%Configuration%CasingLinerChoke%CasingCollapsePressure + data%State%TD_Casing(i)%TensileStrength = data%Configuration%CasingLinerChoke%CasingTensileStrength + End Do + + + + + +!==================================================== +! Set Liner Data +!==================================================== + data%State%TD_WellEl%LinerNumbs = 0 + if(data%Configuration%CasingLinerChoke%LinerLength > 0.d0) then + data%State%TD_WellEl%LinerNumbs = 1 + + !if (data%State%TD_WellEl%LinerNumbs>0) then + if (Allocated(data%State%TD_Liner)) deAllocate (data%State%TD_Liner) + Allocate (data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)) + + Do i=1, data%State%TD_WellEl%LinerNumbs + data%State%TD_Liner(i)%TopDepth = data%Configuration%CasingLinerChoke%LinerTopDepth ! unit: [ft] + if (data%State%TD_Liner(i)%TopDepth 0.d0) data%State%TD_WellEl%OpenHoleNumbs=1 + + if (data%State%TD_WellEl%OpenHoleNumbs>0) then + if (Allocated(data%State%TD_OpenHole)) deAllocate (data%State%TD_OpenHole) + Allocate (data%State%TD_OpenHole(data%State%TD_WellEl%OpenHoleNumbs)) !!!??????????????????check + + Do i = 1, data%State%TD_WellEl%OpenHoleNumbs + data%State%TD_OpenHole(i)%TopDepth = data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)%DownDepth + data%State%TD_OpenHole(i)%Length = TD_OpenHoleLength ! unit: [ft] + data%State%TD_OpenHole(i)%DownDepth = data%State%TD_OpenHole(i)%TopDepth+data%State%TD_OpenHole(i)%Length + data%State%TD_OpenHole(i)%Id = data%Configuration%CasingLinerChoke%OpenHoleId/12.d0 ! unit: [ft] + End Do + + else + if (Allocated(data%State%TD_OpenHole)) deAllocate (data%State%TD_OpenHole) + Allocate (data%State%TD_OpenHole(1)) + data%State%TD_WellEl%OpenHoleNumbs = 1 + data%State%TD_OpenHole%Length = 0.d0 + data%State%TD_OpenHole%TopDepth = data%State%TD_Liner(data%State%TD_WellEl%LinerNumbs)%DownDepth + data%State%TD_OpenHole%DownDepth = data%State%TD_OpenHole%TopDepth + + end if + + + + +!==================================================== +! Set ROP_Hole Data +!==================================================== + + data%State%TD_WellEl%ROPHoleNumbs = 1 + if (Allocated(data%State%TD_ROPHole)) deAllocate (data%State%TD_ROPHole) + Allocate (data%State%TD_ROPHole(data%State%TD_WellEl%ROPHoleNumbs)) + + Do i = 1, data%State%TD_WellEl%ROPHoleNumbs + data%State%TD_ROPHole(i)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth + data%State%TD_ROPHole(i)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth + data%State%TD_ROPHole(i)%Length = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength + data%State%TD_ROPHole(i)%Id = data%Configuration%StringConfiguration%BitDefinition%BitSize/12.d0 ! unit: [ft] + End Do + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 b/TorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 index 79eb7b2..0544b56 100644 --- a/TorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 +++ b/TorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 @@ -1,111 +1,111 @@ -subroutine TD_WellReadData - - use SimulationVariables !@ - use SimulationVariables !@ - - implicit none - - Integer :: i - - - - data%State%TD_WellGeneral%WellIntervalsCount = data%Configuration%Path%ItemCount + 1 ! +1 is belong to ROP hole - - if (Allocated(data%State%TD_WellGeo)) deAllocate (data%State%TD_WellGeo) - Allocate (data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)) - - - - -!==================================================== -! Set Well Geometry Data -!==================================================== - - data%State%TD_WellGeo(1)%HoleType = data%Configuration%Path%Items(1)%HoleType - data%State%TD_WellGeo(1)%StartAngle = 0.d0 ![rad] - data%State%TD_WellGeo(1)%EndAngle = data%Configuration%Path%Items(1)%FinalAngle*(pi/180.d0) ![rad] - data%State%TD_WellGeo(1)%IntervalLength= data%Configuration%Path%Items(1)%TotalLength ![ft] - !data%State%TD_WellGeo(1)%VerticalDepth = PathGenerations(1)%TotalVerticalDepth - data%State%TD_WellGeo(1)%TopDepth = 0.d0 - data%State%TD_WellGeo(1)%DownDepth = data%Configuration%Path%Items(1)%MeasuredDepth - - - - Do i=2,data%State%TD_WellGeneral%WellIntervalsCount-1 - - data%State%TD_WellGeo(i)%HoleType = data%Configuration%Path%Items(i)%HoleType - data%State%TD_WellGeo(i)%StartAngle = data%Configuration%Path%Items(i-1)%FinalAngle*(pi/180.d0) - data%State%TD_WellGeo(i)%EndAngle = data%Configuration%Path%Items(i)%FinalAngle*(pi/180.d0) - data%State%TD_WellGeo(i)%IntervalLength= data%Configuration%Path%Items(i)%TotalLength - !data%State%TD_WellGeo(i)%VerticalDepth = data%Configuration%Path%Items(i)%TotalVerticalDepth - data%State%TD_WellGeo(i)%TopDepth = data%Configuration%Path%Items(i-1)%MeasuredDepth - data%State%TD_WellGeo(i)%DownDepth = data%Configuration%Path%Items(i)%MeasuredDepth - - !=====> Radius Of Curvature Calculation - if (data%State%TD_WellGeo(i)%HoleType/=0) then - data%State%TD_WellGeo(i)%RCurvature = ((data%State%TD_WellGeo(i)%IntervalLength)/abs(data%State%TD_WellGeo(i)%EndAngle-data%State%TD_WellGeo(i)%StartAngle)) - end if - - End Do - - - - - -!=====> Set ROP Hole Data - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%HoleType = 0 !Straight - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%EndAngle - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%EndAngle = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength= 0.d0 - !data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%VerticalDepth - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%DownDepth - data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth+data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength - - - - - - -!=====> Vertical Depth Calculation - if ( data%State%TD_WellGeo(1)%HoleType==0 ) then - data%State%TD_WellGeo(1)%VerticalDepth = data%State%TD_WellGeo(1)%IntervalLength*cos(data%State%TD_WellGeo(1)%StartAngle) - else if ( data%State%TD_WellGeo(1)%HoleType==1 ) then - data%State%TD_WellGeo(1)%VerticalDepth = (data%State%TD_WellGeo(1)%RCurvature*sin(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle))*cos(abs(data%State%TD_WellGeo(1)%StartAngle)))-(data%State%TD_WellGeo(1)%RCurvature*(1.-cos(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle)))*sin(abs(data%State%TD_WellGeo(1)%StartAngle))) - else if ( data%State%TD_WellGeo(1)%HoleType==2 ) then - data%State%TD_WellGeo(1)%VerticalDepth = (data%State%TD_WellGeo(1)%RCurvature*sin(abs(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle)))*cos(abs(data%State%TD_WellGeo(1)%StartAngle)))+(data%State%TD_WellGeo(1)%RCurvature*(1.-cos(abs(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle))))*sin(abs(data%State%TD_WellGeo(1)%StartAngle))) - End if - Do i= 2,data%State%TD_WellGeneral%WellIntervalsCount - if ( data%State%TD_WellGeo(i)%HoleType==0 ) then - data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+data%State%TD_WellGeo(i)%IntervalLength*cos(data%State%TD_WellGeo(i)%StartAngle) - else if ( data%State%TD_WellGeo(i)%HoleType==1 ) then - data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+(data%State%TD_WellGeo(i)%RCurvature*sin(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle))*cos(abs(data%State%TD_WellGeo(i)%StartAngle)))-(data%State%TD_WellGeo(i)%RCurvature*(1.-cos(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle)))*sin(abs(data%State%TD_WellGeo(i)%StartAngle))) - else if ( data%State%TD_WellGeo(i)%HoleType==2 ) then - data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+(data%State%TD_WellGeo(i)%RCurvature*sin(abs(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle)))*cos(abs(data%State%TD_WellGeo(i)%StartAngle)))+(data%State%TD_WellGeo(i)%RCurvature*(1.-cos(abs(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle))))*sin(abs(data%State%TD_WellGeo(i)%StartAngle))) - End if - End Do - !Do i=1,data%State%TD_WellGeneral%WellIntervalsCount - ! print*, 'data%State%TD_WellGeo(i)%TopDepth=' , i , data%State%TD_WellGeo(i)%TopDepth - ! print*, 'data%State%TD_WellGeo(i)%DownDepth=' , i , data%State%TD_WellGeo(i)%DownDepth - ! print*, 'data%State%TD_WellGeo(i)%HoleType=' , i , data%State%TD_WellGeo(i)%HoleType - ! print*, 'data%State%TD_WellGeo(i)%RCurvature=' , i , data%State%TD_WellGeo(i)%RCurvature - ! print*, 'data%State%TD_WellGeo(i)%EndAngle=' , i , data%State%TD_WellGeo(i)%EndAngle - ! print*, 'data%State%TD_WellGeo(i)%StartAngle=' , i , data%State%TD_WellGeo(i)%StartAngle - ! print*, 'data%State%TD_WellGeo(i)%VerticalDepth=' , i , data%State%TD_WellGeo(i)%VerticalDepth - !end do - - - - - - - -!=====> Well Total Length Calculation - data%State%TD_WellGeneral%WellTotalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth - data%State%TD_WellGeneral%WellTotalVerticalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth - - - - - - +subroutine TD_WellReadData + + use SimulationVariables !@ + use SimulationVariables !@ + + implicit none + + Integer :: i + + + + data%State%TD_WellGeneral%WellIntervalsCount = data%Configuration%Path%ItemCount + 1 ! +1 is belong to ROP hole + + if (Allocated(data%State%TD_WellGeo)) deAllocate (data%State%TD_WellGeo) + Allocate (data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)) + + + + +!==================================================== +! Set Well Geometry Data +!==================================================== + + data%State%TD_WellGeo(1)%HoleType = data%Configuration%Path%Items(1)%HoleType + data%State%TD_WellGeo(1)%StartAngle = 0.d0 ![rad] + data%State%TD_WellGeo(1)%EndAngle = data%Configuration%Path%Items(1)%FinalAngle*(pi/180.d0) ![rad] + data%State%TD_WellGeo(1)%IntervalLength= data%Configuration%Path%Items(1)%TotalLength ![ft] + !data%State%TD_WellGeo(1)%VerticalDepth = PathGenerations(1)%TotalVerticalDepth + data%State%TD_WellGeo(1)%TopDepth = 0.d0 + data%State%TD_WellGeo(1)%DownDepth = data%Configuration%Path%Items(1)%MeasuredDepth + + + + Do i=2,data%State%TD_WellGeneral%WellIntervalsCount-1 + + data%State%TD_WellGeo(i)%HoleType = data%Configuration%Path%Items(i)%HoleType + data%State%TD_WellGeo(i)%StartAngle = data%Configuration%Path%Items(i-1)%FinalAngle*(pi/180.d0) + data%State%TD_WellGeo(i)%EndAngle = data%Configuration%Path%Items(i)%FinalAngle*(pi/180.d0) + data%State%TD_WellGeo(i)%IntervalLength= data%Configuration%Path%Items(i)%TotalLength + !data%State%TD_WellGeo(i)%VerticalDepth = data%Configuration%Path%Items(i)%TotalVerticalDepth + data%State%TD_WellGeo(i)%TopDepth = data%Configuration%Path%Items(i-1)%MeasuredDepth + data%State%TD_WellGeo(i)%DownDepth = data%Configuration%Path%Items(i)%MeasuredDepth + + !=====> Radius Of Curvature Calculation + if (data%State%TD_WellGeo(i)%HoleType/=0) then + data%State%TD_WellGeo(i)%RCurvature = ((data%State%TD_WellGeo(i)%IntervalLength)/abs(data%State%TD_WellGeo(i)%EndAngle-data%State%TD_WellGeo(i)%StartAngle)) + end if + + End Do + + + + + +!=====> Set ROP Hole Data + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%HoleType = 0 !Straight + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%EndAngle + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%EndAngle = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%StartAngle + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength= 0.d0 + !data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%VerticalDepth + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount-1)%DownDepth + data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%TopDepth+data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%IntervalLength + + + + + + +!=====> Vertical Depth Calculation + if ( data%State%TD_WellGeo(1)%HoleType==0 ) then + data%State%TD_WellGeo(1)%VerticalDepth = data%State%TD_WellGeo(1)%IntervalLength*cos(data%State%TD_WellGeo(1)%StartAngle) + else if ( data%State%TD_WellGeo(1)%HoleType==1 ) then + data%State%TD_WellGeo(1)%VerticalDepth = (data%State%TD_WellGeo(1)%RCurvature*sin(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle))*cos(abs(data%State%TD_WellGeo(1)%StartAngle)))-(data%State%TD_WellGeo(1)%RCurvature*(1.-cos(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle)))*sin(abs(data%State%TD_WellGeo(1)%StartAngle))) + else if ( data%State%TD_WellGeo(1)%HoleType==2 ) then + data%State%TD_WellGeo(1)%VerticalDepth = (data%State%TD_WellGeo(1)%RCurvature*sin(abs(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle)))*cos(abs(data%State%TD_WellGeo(1)%StartAngle)))+(data%State%TD_WellGeo(1)%RCurvature*(1.-cos(abs(abs(data%State%TD_WellGeo(1)%EndAngle)-abs(data%State%TD_WellGeo(1)%StartAngle))))*sin(abs(data%State%TD_WellGeo(1)%StartAngle))) + End if + Do i= 2,data%State%TD_WellGeneral%WellIntervalsCount + if ( data%State%TD_WellGeo(i)%HoleType==0 ) then + data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+data%State%TD_WellGeo(i)%IntervalLength*cos(data%State%TD_WellGeo(i)%StartAngle) + else if ( data%State%TD_WellGeo(i)%HoleType==1 ) then + data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+(data%State%TD_WellGeo(i)%RCurvature*sin(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle))*cos(abs(data%State%TD_WellGeo(i)%StartAngle)))-(data%State%TD_WellGeo(i)%RCurvature*(1.-cos(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle)))*sin(abs(data%State%TD_WellGeo(i)%StartAngle))) + else if ( data%State%TD_WellGeo(i)%HoleType==2 ) then + data%State%TD_WellGeo(i)%VerticalDepth = data%State%TD_WellGeo(i-1)%VerticalDepth+(data%State%TD_WellGeo(i)%RCurvature*sin(abs(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle)))*cos(abs(data%State%TD_WellGeo(i)%StartAngle)))+(data%State%TD_WellGeo(i)%RCurvature*(1.-cos(abs(abs(data%State%TD_WellGeo(i)%EndAngle)-abs(data%State%TD_WellGeo(i)%StartAngle))))*sin(abs(data%State%TD_WellGeo(i)%StartAngle))) + End if + End Do + !Do i=1,data%State%TD_WellGeneral%WellIntervalsCount + ! print*, 'data%State%TD_WellGeo(i)%TopDepth=' , i , data%State%TD_WellGeo(i)%TopDepth + ! print*, 'data%State%TD_WellGeo(i)%DownDepth=' , i , data%State%TD_WellGeo(i)%DownDepth + ! print*, 'data%State%TD_WellGeo(i)%HoleType=' , i , data%State%TD_WellGeo(i)%HoleType + ! print*, 'data%State%TD_WellGeo(i)%RCurvature=' , i , data%State%TD_WellGeo(i)%RCurvature + ! print*, 'data%State%TD_WellGeo(i)%EndAngle=' , i , data%State%TD_WellGeo(i)%EndAngle + ! print*, 'data%State%TD_WellGeo(i)%StartAngle=' , i , data%State%TD_WellGeo(i)%StartAngle + ! print*, 'data%State%TD_WellGeo(i)%VerticalDepth=' , i , data%State%TD_WellGeo(i)%VerticalDepth + !end do + + + + + + + +!=====> Well Total Length Calculation + data%State%TD_WellGeneral%WellTotalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%DownDepth + data%State%TD_WellGeneral%WellTotalVerticalLength = data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)%VerticalDepth + + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 b/TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 index c1984ee..8546b22 100644 --- a/TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 +++ b/TorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 @@ -1,81 +1,81 @@ -subroutine TD_DrillStemStartUp - - Use CCasingLinerChokeVariables - Use CStringConfigurationVariables - ! Use CSimulationVariables - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - - - implicit none - - - - - data%State%TD_String%DrillStemTotalLength = 500.d0 !??????????????????? - data%State%TD_String%DrillStemTotalLengthIni = 500.d0 !??????????????????? - data%State%TD_String%OutOfWellLength = 3.48d0 - data%State%TD_String%DrillStemAxialVelocity = 0.d0 - data%State%TD_String%DrillStemRotVelocity = 0.d0 - data%State%TD_String%WeightOnBit = 0.d0 - data%State%TD_String%BitTorque = 0.d0 - data%State%TD_String%TotalTorque = 0.d0 - data%State%TD_String%StaticHookLoad = 0.d0 - data%State%TD_String%DlMax = 0.d0 - data%State%TD_String%DlTotal = 0.d0 - data%State%TD_String%DlTouch = 1.d0 !(=/0.) because of TD_StringConnectionModes subroutine (initial value for first iteration in if condition) - data%State%TD_String%HookLoad = 0.d0 - data%State%TD_String%StringTorque = 0.d0 - data%State%TD_String%ToolJointRange = 0.4005d0*3.28d0 ![m]*3.28=[ft] , ToolJointLength=400.5mm - data%State%TD_Vol%RemoveVolume = 0.0d0 - - data%State%TD_String%DrillStemBottom = data%State%TD_String%DrillStemTotalLength-data%State%TD_String%OutOfWellLength !???????????? - !data%State%TD_DrillStems%TopDepth = - !data%State%TD_DrillStems%DownDepth = - !data%State%TD_DrillStems%StartAngle = - !data%State%TD_DrillStems%EndAngle = - data%State%TD_DrillStems%Area = 0.d0 - data%State%TD_DrillStems%RCurvature = 0.d0 - data%State%TD_DrillStems%RtoolJoint = 0.d0 - data%State%TD_DrillStems%ToolJointRange = 0.d0 - data%State%TD_DrillStems%HoleDiameter = 0.d0 - - data%State%TD_DrillStems%Force1 = 0.d0 - data%State%TD_DrillStems%Force2 = 0.d0 - data%State%TD_DrillStems%Torque = 0.d0 - data%State%TD_DrillStems%Drag = 0.d0 - data%State%TD_DrillStems%CombVelRatio = 0.d0 - - data%State%TD_DrillStems%MudDensityIn = 10.d0*7.48051948d0 - data%State%TD_DrillStems%MudDensityOut = 10.d0*7.48051948d0 - data%State%TD_DrillStems%MudViscosity = 0.16d0 !???????????????? - data%State%TD_DrillStems%MudVisCorrectCoef = 1.d0 !???????????????? - data%State%TD_DrillStems%MudWeight = 10.d0 - !data%State%TD_DrillStems%MudPlasticVis = !???????????????? - !data%State%TD_DrillStems%MudYieldPoint = !???????????????? - - !data%State%TD_DrillStems%FricFactor = - !data%State%TD_DrillStems% = - !data%State%TD_DrillStems% = - - !data%State%TD_DrillStems%StaticHookLoad = - !data%State%TD_DrillStems%TotalSHookLoad = - !data%State%TD_DrillStems%Dl = - !data%State%TD_DrillStems%DlTotal = - - !if (allocated(data%State%TD_String%FluidMudDensity)) deallocate(data%State%TD_String%FluidMudDensity) - !if (allocated(data%State%TD_String%FluidMudEndX)) deallocate(data%State%TD_String%FluidMudEndX) - !if (allocated(data%State%TD_String%FluidMudStartX)) deallocate(data%State%TD_String%FluidMudStartX) - !Allocate (data%State%TD_String%FluidMudDensity(1) , data%State%TD_String%FluidMudEndX(1) , data%State%TD_String%FluidMudStartX(1)) - !data%State%TD_String%FluidMudDensity(:) = 10.d0 - !data%State%TD_String%FluidMudStartX(:) = -268.d0 !?????????? - !data%State%TD_String%FluidMudEndX(:) = 9990.d0 !?????????? - - - - - +subroutine TD_DrillStemStartUp + + Use CCasingLinerChokeVariables + Use CStringConfigurationVariables + ! Use CSimulationVariables + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + + + implicit none + + + + + data%State%TD_String%DrillStemTotalLength = 500.d0 !??????????????????? + data%State%TD_String%DrillStemTotalLengthIni = 500.d0 !??????????????????? + data%State%TD_String%OutOfWellLength = 3.48d0 + data%State%TD_String%DrillStemAxialVelocity = 0.d0 + data%State%TD_String%DrillStemRotVelocity = 0.d0 + data%State%TD_String%WeightOnBit = 0.d0 + data%State%TD_String%BitTorque = 0.d0 + data%State%TD_String%TotalTorque = 0.d0 + data%State%TD_String%StaticHookLoad = 0.d0 + data%State%TD_String%DlMax = 0.d0 + data%State%TD_String%DlTotal = 0.d0 + data%State%TD_String%DlTouch = 1.d0 !(=/0.) because of TD_StringConnectionModes subroutine (initial value for first iteration in if condition) + data%State%TD_String%HookLoad = 0.d0 + data%State%TD_String%StringTorque = 0.d0 + data%State%TD_String%ToolJointRange = 0.4005d0*3.28d0 ![m]*3.28=[ft] , ToolJointLength=400.5mm + data%State%TD_Vol%RemoveVolume = 0.0d0 + + data%State%TD_String%DrillStemBottom = data%State%TD_String%DrillStemTotalLength-data%State%TD_String%OutOfWellLength !???????????? + !data%State%TD_DrillStems%TopDepth = + !data%State%TD_DrillStems%DownDepth = + !data%State%TD_DrillStems%StartAngle = + !data%State%TD_DrillStems%EndAngle = + data%State%TD_DrillStems%Area = 0.d0 + data%State%TD_DrillStems%RCurvature = 0.d0 + data%State%TD_DrillStems%RtoolJoint = 0.d0 + data%State%TD_DrillStems%ToolJointRange = 0.d0 + data%State%TD_DrillStems%HoleDiameter = 0.d0 + + data%State%TD_DrillStems%Force1 = 0.d0 + data%State%TD_DrillStems%Force2 = 0.d0 + data%State%TD_DrillStems%Torque = 0.d0 + data%State%TD_DrillStems%Drag = 0.d0 + data%State%TD_DrillStems%CombVelRatio = 0.d0 + + data%State%TD_DrillStems%MudDensityIn = 10.d0*7.48051948d0 + data%State%TD_DrillStems%MudDensityOut = 10.d0*7.48051948d0 + data%State%TD_DrillStems%MudViscosity = 0.16d0 !???????????????? + data%State%TD_DrillStems%MudVisCorrectCoef = 1.d0 !???????????????? + data%State%TD_DrillStems%MudWeight = 10.d0 + !data%State%TD_DrillStems%MudPlasticVis = !???????????????? + !data%State%TD_DrillStems%MudYieldPoint = !???????????????? + + !data%State%TD_DrillStems%FricFactor = + !data%State%TD_DrillStems% = + !data%State%TD_DrillStems% = + + !data%State%TD_DrillStems%StaticHookLoad = + !data%State%TD_DrillStems%TotalSHookLoad = + !data%State%TD_DrillStems%Dl = + !data%State%TD_DrillStems%DlTotal = + + !if (allocated(data%State%TD_String%FluidMudDensity)) deallocate(data%State%TD_String%FluidMudDensity) + !if (allocated(data%State%TD_String%FluidMudEndX)) deallocate(data%State%TD_String%FluidMudEndX) + !if (allocated(data%State%TD_String%FluidMudStartX)) deallocate(data%State%TD_String%FluidMudStartX) + !Allocate (data%State%TD_String%FluidMudDensity(1) , data%State%TD_String%FluidMudEndX(1) , data%State%TD_String%FluidMudStartX(1)) + !data%State%TD_String%FluidMudDensity(:) = 10.d0 + !data%State%TD_String%FluidMudStartX(:) = -268.d0 !?????????? + !data%State%TD_String%FluidMudEndX(:) = 9990.d0 !?????????? + + + + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TD_StartUp/TD_StartUp.f90 b/TorqueDrag/TD_StartUp/TD_StartUp.f90 index 4896c15..b5b4458 100644 --- a/TorqueDrag/TD_StartUp/TD_StartUp.f90 +++ b/TorqueDrag/TD_StartUp/TD_StartUp.f90 @@ -1,158 +1,158 @@ -subroutine TD_StartUp - - Use CCasingLinerChokeVariables - Use CStringConfigurationVariables - ! use CSimulationVariables - use UnitySignalVariables - use UnitySignalsModule - ! use UnitySignalsModuleVariables - use CHoistingVariables - use SimulationVariables - use SimulationVariables !@ - Use TD_DrillStemComponents - use SimulationVariables !@ - use SimulationVariables !@ - use SimulationVariables !@ - Use TD_StringConnectionData - use SimulationVariables !@!, only: Drawworks - Use sROP_Variables - Use sROP_Other_Variables - - - implicit none - - -!!==================================================== -!! Allocate Modules -!!==================================================== -! !=====> Set WellGeo Dimension -! data%State%TD_WellGeneral%WellIntervalsCount = data%Configuration%Path%ItemCount + 1 ! +1 is belong to ROP hole -! Allocate (data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)) -! -! !=====> Set WellGeo Dimension - - - !=====> Set ROP StartUp - data%State%ROP_Bit%BitWearing = 0.d0 - data%State%ROP_Bit%RateOfPenetration = 0.d0 - data%State%ROP_Bit%BearingWear = 0.d0 - data%State%ROP_Spec%FormationNumber = 0 - data%State%ROP_Bit%OldROPDepth = data%Configuration%Path%Items(data%Configuration%Path%ItemCount)%MeasuredDepth - data%State%ROP_Bit%OldROPValue = 0.d0 - data%State%ROP_Bit%SetROPGauge = 0.d0 - - - - !=====> Set BOP StartUp - data%State%TD_BOP%BOPCondition = 0 - data%State%TD_BOP%BOPThickness = (0.13477d0/2.d0)*3.28d0 ![m]*3.28=[ft] , Total Thickness (RAM)= 134.77mm - data%State%TD_BOP%AnnularFillingFinal = 0.d0 - - - data%State%Drawworks%TDHookHeight = 75.d0 ![ft] - data%State%Drawworks%Hook_Height_ini = 75.d0 ![ft] - data%State%Drawworks%Hook_Height_final = 75.d0 ![ft] - - - - !=====> String Connection Mode - if ( Get_OperationCondition()==OPERATION_TRIP ) then - data%State%TD_StConn%OldOperationCondition = 1 - else - data%State%TD_StConn%OldOperationCondition = 0 - end if - data%State%TD_StConn%KellyDriveTypeMode = 0 !Kelly Mode - data%State%TD_StConn%FluidStringConnectionMode = 0 - data%State%TD_StConn%ConnectionHeight = 3.48d0 ![ft] - data%State%TD_StConn%RigidConnectionHeight = 3.48d0 ![ft] - data%State%TD_StConn%GRigidConnectionHeight = 3.48d0 ![ft] - data%State%TD_String%TopJointHeight = 3.48d0 ![ft] - !data%State%TD_StConn%TouchConnectionHeight = - data%State%TD_StConn%StringVelocity = 0.0d0 - data%State%TD_StConn%HookHeightOld = 75.d0 ![ft] - data%State%TD_StConn%HookHeight = 75.d0 ![ft] - data%State%TD_StConn%HookVelocity = 0.0d0 - - !=====> Element Specification - data%State%TD_StConn%HookHeight = data%State%Drawworks%TDHookHeight ! unit: [ft] - data%State%TD_StConn%ElevatorConst = 17.985 ! [ft] Elevator Length(14.84) ????????????????? adad ha daghigh shavand - data%State%TD_StConn%ElevatorECG = 2.217 ! [ft] - data%State%TD_StConn%KellyConst = 63.280d0 ! [ft] Kelly Length(61.74) + Safety Valve Length(1.54) - data%State%TD_StConn%KellyElementConst = 41.840d0 ! [ft] Kelly Element Length(40.3) + Safety Valve Length(1.54) - data%State%TD_StConn%TDSLength = 24.08d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSToolJointLength = 0.77d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSElevatorLength = 26.837d0 !?????? ! TDS with Elevator Length [ft] - data%State%TD_StConn%TDSElevatorToolLength= 0.859d0 !??????????????????? ! [ft] - data%State%TD_StConn%TDSElevatorECG = 2.454 ! [ft] - data%State%TD_Load%NumOfCables = data%State%Hoisting%NumberOfLine - data%State%TD_Load%WeightTB = data%State%Hoisting%TravelingBlockWeight ! [lb] - data%State%TD_Load%WeightTD = data%State%Hoisting%TopDriveWeight ! [lb] - data%State%TD_Load%KellyWeight = data%State%Hoisting%KellyWeight ! [lb] - data%State%TD_StConn%SafetyValveLength = 1.54d0 ! [ft] - data%State%TD_StConn%IBOPLength = 1.54d0 ! [ft] - data%State%TD_StConn%KellyElementID = 3.0d0/12.d0 ! [ft] - data%State%TD_StConn%KellyElementOD = 5.90d0/12.d0 ! [ft] - data%State%TD_Load%DrawworksLoadInput = data%State%Hoisting%TravelingBlockWeight/data%State%Hoisting%NumberOfLine - - data%State%TD_Count%IBOPNewAdd = 0 - data%State%TD_Count%IBOPOldAdd = 0 !Remove - data%State%TD_Count%SafetyValveNewAdd = 0 - data%State%TD_Count%SafetyValveOldAdd = 1 !Install - data%State%TD_Count%KellyNewAdd = 0 - data%State%TD_Count%KellyOldAdd = 0 - data%State%TD_Count%IBOPNewRemove = 0 - data%State%TD_Count%IBOPOldRemove = 1 !Remove - data%State%TD_Count%SafetyValveNewRemove = 0 - data%State%TD_Count%SafetyValveOldRemove = 0 !Install - data%State%TD_Count%KellyNewRemove = 0 - data%State%TD_Count%KellyOldRemove = 1 - - data%State%TD_Count%KellyOldStatus(1) = 0 - data%State%TD_Count%KellyNewStatus(1) = 0 - data%State%TD_Count%KellyOldStatus(2) = 1 ! Kelly Connected Nothing - data%State%TD_Count%KellyNewStatus(2) = 1 ! Kelly Connected Nothing - data%State%TD_Count%KellyOldStatus(3) = 0 - data%State%TD_Count%KellyNewStatus(3) = 0 - - data%State%TD_Count%KellyOldStatus(4) = 0 - data%State%TD_Count%KellyNewStatus(4) = 0 - data%State%TD_Count%KellyOldStatus(5) = 0 - data%State%TD_Count%KellyNewStatus(5) = 0 - data%State%TD_Count%KellyOldStatus(6) = 0 - data%State%TD_Count%KellyNewStatus(6) = 0 - data%State%TD_Count%KellyOldStatus(7) = 0 - data%State%TD_Count%KellyNewStatus(7) = 0 - data%State%TD_Count%KellyOldStatus(8) = 0 - data%State%TD_Count%KellyNewStatus(8) = 0 - data%State%TD_Count%KellyOldStatus(18) = 0 - data%State%TD_Count%KellyNewStatus(18) = 0 - data%State%TD_Count%KellyOldStatus(19) = 0 - data%State%TD_Count%KellyNewStatus(19) = 0 - - data%State%TD_Count%KellyOldStatus(9) = 0 - data%State%TD_Count%KellyNewStatus(9) = 0 - data%State%TD_Count%KellyOldStatus(10) = 0 - data%State%TD_Count%KellyNewStatus(10) = 0 - data%State%TD_Count%KellyOldStatus(11) = 0 - data%State%TD_Count%KellyNewStatus(11) = 0 - data%State%TD_Count%KellyOldStatus(12) = 0 - data%State%TD_Count%KellyNewStatus(12) = 0 - data%State%TD_Count%KellyOldStatus(13) = 1 - data%State%TD_Count%KellyNewStatus(13) = 1 - data%State%TD_Count%KellyOldStatus(14) = 0 - data%State%TD_Count%KellyNewStatus(14) = 0 - data%State%TD_Count%KellyOldStatus(15) = 0 - data%State%TD_Count%KellyNewStatus(15) = 0 - data%State%TD_Count%KellyOldStatus(16) = 0 - data%State%TD_Count%KellyNewStatus(16) = 0 - data%State%TD_Count%KellyOldStatus(17) = 0 - data%State%TD_Count%KellyNewStatus(17) = 0 - - - - - !=====> Problems - data%State%TD_General%WeightIndicatorMalf = 0 - - +subroutine TD_StartUp + + Use CCasingLinerChokeVariables + Use CStringConfigurationVariables + ! use CSimulationVariables + use UnitySignalVariables + use UnitySignalsModule + ! use UnitySignalsModuleVariables + use CHoistingVariables + use SimulationVariables + use SimulationVariables !@ + Use TD_DrillStemComponents + use SimulationVariables !@ + use SimulationVariables !@ + use SimulationVariables !@ + Use TD_StringConnectionData + use SimulationVariables !@!, only: Drawworks + Use sROP_Variables + Use sROP_Other_Variables + + + implicit none + + +!!==================================================== +!! Allocate Modules +!!==================================================== +! !=====> Set WellGeo Dimension +! data%State%TD_WellGeneral%WellIntervalsCount = data%Configuration%Path%ItemCount + 1 ! +1 is belong to ROP hole +! Allocate (data%State%TD_WellGeo(data%State%TD_WellGeneral%WellIntervalsCount)) +! +! !=====> Set WellGeo Dimension + + + !=====> Set ROP StartUp + data%State%ROP_Bit%BitWearing = 0.d0 + data%State%ROP_Bit%RateOfPenetration = 0.d0 + data%State%ROP_Bit%BearingWear = 0.d0 + data%State%ROP_Spec%FormationNumber = 0 + data%State%ROP_Bit%OldROPDepth = data%Configuration%Path%Items(data%Configuration%Path%ItemCount)%MeasuredDepth + data%State%ROP_Bit%OldROPValue = 0.d0 + data%State%ROP_Bit%SetROPGauge = 0.d0 + + + + !=====> Set BOP StartUp + data%State%TD_BOP%BOPCondition = 0 + data%State%TD_BOP%BOPThickness = (0.13477d0/2.d0)*3.28d0 ![m]*3.28=[ft] , Total Thickness (RAM)= 134.77mm + data%State%TD_BOP%AnnularFillingFinal = 0.d0 + + + data%State%Drawworks%TDHookHeight = 75.d0 ![ft] + data%State%Drawworks%Hook_Height_ini = 75.d0 ![ft] + data%State%Drawworks%Hook_Height_final = 75.d0 ![ft] + + + + !=====> String Connection Mode + if ( Get_OperationCondition()==OPERATION_TRIP ) then + data%State%TD_StConn%OldOperationCondition = 1 + else + data%State%TD_StConn%OldOperationCondition = 0 + end if + data%State%TD_StConn%KellyDriveTypeMode = 0 !Kelly Mode + data%State%TD_StConn%FluidStringConnectionMode = 0 + data%State%TD_StConn%ConnectionHeight = 3.48d0 ![ft] + data%State%TD_StConn%RigidConnectionHeight = 3.48d0 ![ft] + data%State%TD_StConn%GRigidConnectionHeight = 3.48d0 ![ft] + data%State%TD_String%TopJointHeight = 3.48d0 ![ft] + !data%State%TD_StConn%TouchConnectionHeight = + data%State%TD_StConn%StringVelocity = 0.0d0 + data%State%TD_StConn%HookHeightOld = 75.d0 ![ft] + data%State%TD_StConn%HookHeight = 75.d0 ![ft] + data%State%TD_StConn%HookVelocity = 0.0d0 + + !=====> Element Specification + data%State%TD_StConn%HookHeight = data%State%Drawworks%TDHookHeight ! unit: [ft] + data%State%TD_StConn%ElevatorConst = 17.985 ! [ft] Elevator Length(14.84) ????????????????? adad ha daghigh shavand + data%State%TD_StConn%ElevatorECG = 2.217 ! [ft] + data%State%TD_StConn%KellyConst = 63.280d0 ! [ft] Kelly Length(61.74) + Safety Valve Length(1.54) + data%State%TD_StConn%KellyElementConst = 41.840d0 ! [ft] Kelly Element Length(40.3) + Safety Valve Length(1.54) + data%State%TD_StConn%TDSLength = 24.08d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSToolJointLength = 0.77d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSElevatorLength = 26.837d0 !?????? ! TDS with Elevator Length [ft] + data%State%TD_StConn%TDSElevatorToolLength= 0.859d0 !??????????????????? ! [ft] + data%State%TD_StConn%TDSElevatorECG = 2.454 ! [ft] + data%State%TD_Load%NumOfCables = data%Configuration%Hoisting%NumberOfLine + data%State%TD_Load%WeightTB = data%Configuration%Hoisting%TravelingBlockWeight ! [lb] + data%State%TD_Load%WeightTD = data%Configuration%Hoisting%TopDriveWeight ! [lb] + data%State%TD_Load%KellyWeight = data%Configuration%Hoisting%KellyWeight ! [lb] + data%State%TD_StConn%SafetyValveLength = 1.54d0 ! [ft] + data%State%TD_StConn%IBOPLength = 1.54d0 ! [ft] + data%State%TD_StConn%KellyElementID = 3.0d0/12.d0 ! [ft] + data%State%TD_StConn%KellyElementOD = 5.90d0/12.d0 ! [ft] + data%State%TD_Load%DrawworksLoadInput = data%Configuration%Hoisting%TravelingBlockWeight/data%Configuration%Hoisting%NumberOfLine + + data%State%TD_Count%IBOPNewAdd = 0 + data%State%TD_Count%IBOPOldAdd = 0 !Remove + data%State%TD_Count%SafetyValveNewAdd = 0 + data%State%TD_Count%SafetyValveOldAdd = 1 !Install + data%State%TD_Count%KellyNewAdd = 0 + data%State%TD_Count%KellyOldAdd = 0 + data%State%TD_Count%IBOPNewRemove = 0 + data%State%TD_Count%IBOPOldRemove = 1 !Remove + data%State%TD_Count%SafetyValveNewRemove = 0 + data%State%TD_Count%SafetyValveOldRemove = 0 !Install + data%State%TD_Count%KellyNewRemove = 0 + data%State%TD_Count%KellyOldRemove = 1 + + data%State%TD_Count%KellyOldStatus(1) = 0 + data%State%TD_Count%KellyNewStatus(1) = 0 + data%State%TD_Count%KellyOldStatus(2) = 1 ! Kelly Connected Nothing + data%State%TD_Count%KellyNewStatus(2) = 1 ! Kelly Connected Nothing + data%State%TD_Count%KellyOldStatus(3) = 0 + data%State%TD_Count%KellyNewStatus(3) = 0 + + data%State%TD_Count%KellyOldStatus(4) = 0 + data%State%TD_Count%KellyNewStatus(4) = 0 + data%State%TD_Count%KellyOldStatus(5) = 0 + data%State%TD_Count%KellyNewStatus(5) = 0 + data%State%TD_Count%KellyOldStatus(6) = 0 + data%State%TD_Count%KellyNewStatus(6) = 0 + data%State%TD_Count%KellyOldStatus(7) = 0 + data%State%TD_Count%KellyNewStatus(7) = 0 + data%State%TD_Count%KellyOldStatus(8) = 0 + data%State%TD_Count%KellyNewStatus(8) = 0 + data%State%TD_Count%KellyOldStatus(18) = 0 + data%State%TD_Count%KellyNewStatus(18) = 0 + data%State%TD_Count%KellyOldStatus(19) = 0 + data%State%TD_Count%KellyNewStatus(19) = 0 + + data%State%TD_Count%KellyOldStatus(9) = 0 + data%State%TD_Count%KellyNewStatus(9) = 0 + data%State%TD_Count%KellyOldStatus(10) = 0 + data%State%TD_Count%KellyNewStatus(10) = 0 + data%State%TD_Count%KellyOldStatus(11) = 0 + data%State%TD_Count%KellyNewStatus(11) = 0 + data%State%TD_Count%KellyOldStatus(12) = 0 + data%State%TD_Count%KellyNewStatus(12) = 0 + data%State%TD_Count%KellyOldStatus(13) = 1 + data%State%TD_Count%KellyNewStatus(13) = 1 + data%State%TD_Count%KellyOldStatus(14) = 0 + data%State%TD_Count%KellyNewStatus(14) = 0 + data%State%TD_Count%KellyOldStatus(15) = 0 + data%State%TD_Count%KellyNewStatus(15) = 0 + data%State%TD_Count%KellyOldStatus(16) = 0 + data%State%TD_Count%KellyNewStatus(16) = 0 + data%State%TD_Count%KellyOldStatus(17) = 0 + data%State%TD_Count%KellyNewStatus(17) = 0 + + + + + !=====> Problems + data%State%TD_General%WeightIndicatorMalf = 0 + + end subroutine \ No newline at end of file diff --git a/TorqueDrag/TorqueDragMain.f90 b/TorqueDrag/TorqueDragMain.f90 index cb0a7da..aacdd8e 100644 --- a/TorqueDrag/TorqueDragMain.f90 +++ b/TorqueDrag/TorqueDragMain.f90 @@ -1,47 +1,47 @@ -MODULE TorqueDragMain - use CPumpsVariables - use CPumps - use CDrillingConsoleVariables - use SimulationVariables - use SimulationVariables - use CDataDisplayConsole - use SimulationVariables - ! USE CSimulationVariables - use SimulationVariables - IMPLICIT NONE - PUBLIC - CONTAINS - - ! subroutine TorqueDrag_Setup() - ! use CSimulationVariables - ! implicit none - ! call OnSimulationInitialization%Add(TorqueDrag_Init) - ! call OnSimulationStop%Add(TorqueDrag_Init) - ! call OnTorqueDragStep%Add(TorqueDrag_Step) - ! call OnTorqueDragOutput%Add(TorqueDrag_Output) - ! call OnTorqueDragMain%Add(TorqueDragMainBody) - ! end subroutine - - subroutine TorqueDrag_Init - implicit none - end subroutine TorqueDrag_Init - - subroutine TorqueDrag_Step - implicit none - end subroutine TorqueDrag_Step - - subroutine TorqueDrag_Output - implicit none - end subroutine TorqueDrag_Output - - - ! SUBROUTINE TorqueDragMainBody - ! ! USE ifport - ! ! USE ifmt - ! ! USE CSimulationVariables - ! !USE TDSUP - ! IMPLICIT NONE - ! !CALL TD_MainCalculations - ! END SUBROUTINE TorqueDragMainBody - +MODULE TorqueDragMain + use CPumpsVariables + use CPumps + use CDrillingConsoleVariables + use SimulationVariables + use SimulationVariables + use CDataDisplayConsole + use SimulationVariables + ! USE CSimulationVariables + use SimulationVariables + IMPLICIT NONE + PUBLIC + CONTAINS + + ! subroutine TorqueDrag_Setup() + ! use CSimulationVariables + ! implicit none + ! call OnSimulationInitialization%Add(TorqueDrag_Init) + ! call OnSimulationStop%Add(TorqueDrag_Init) + ! call OnTorqueDragStep%Add(TorqueDrag_Step) + ! call OnTorqueDragOutput%Add(TorqueDrag_Output) + ! call OnTorqueDragMain%Add(TorqueDragMainBody) + ! end subroutine + + subroutine TorqueDrag_Init + implicit none + end subroutine TorqueDrag_Init + + subroutine TorqueDrag_Step + implicit none + end subroutine TorqueDrag_Step + + subroutine TorqueDrag_Output + implicit none + end subroutine TorqueDrag_Output + + + ! SUBROUTINE TorqueDragMainBody + ! ! USE ifport + ! ! USE ifmt + ! ! USE CSimulationVariables + ! !USE TDSUP + ! IMPLICIT NONE + ! !CALL TD_MainCalculations + ! END SUBROUTINE TorqueDragMainBody + END MODULE TorqueDragMain \ No newline at end of file diff --git a/a.out b/a.out new file mode 100644 index 0000000000000000000000000000000000000000..cb979c497d57089e0fc72a9a23ed6d3881a9363d GIT binary patch literal 311672 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

-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 f)nA0+qaGqq@psd}`5tALO|IQt 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

=sgo7`>q() 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 PpVj?=a({WO`|1BLN~puK literal 0 HcmV?d00001 diff --git a/lib/libhiredis.a b/lib/libhiredis.a new file mode 100644 index 0000000000000000000000000000000000000000..b54b8c32c05c059f50a2e87955d1070064ebcd19 GIT binary patch literal 581706 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�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 +#include +#include +#include "include/hiredis.h" + +#ifdef _MSC_VER +#include /* For struct timeval */ +#endif + +static void example_argv_command(redisContext *c, size_t n) { + char **argv, tmp[42]; + size_t *argvlen; + redisReply *reply; + + /* We're allocating two additional elements for command and key */ + argv = malloc(sizeof(*argv) * (2 + n)); + argvlen = malloc(sizeof(*argvlen) * (2 + n)); + + /* First the command */ + argv[0] = (char*)"RPUSH"; + argvlen[0] = sizeof("RPUSH") - 1; + + /* Now our key */ + argv[1] = (char*)"argvlist"; + argvlen[1] = sizeof("argvlist") - 1; + + /* Now add the entries we wish to add to the list */ + for (size_t i = 2; i < (n + 2); i++) { + argvlen[i] = snprintf(tmp, sizeof(tmp), "argv-element-%zu", i - 2); + argv[i] = strdup(tmp); + } + + /* Execute the command using redisCommandArgv. We're sending the arguments with + * two explicit arrays. One for each argument's string, and the other for its + * length. */ + reply = redisCommandArgv(c, n + 2, (const char **)argv, (const size_t*)argvlen); + + if (reply == NULL || c->err) { + fprintf(stderr, "Error: Couldn't execute redisCommandArgv\n"); + exit(1); + } + + if (reply->type == REDIS_REPLY_INTEGER) { + printf("%s reply: %lld\n", argv[0], reply->integer); + } + + freeReplyObject(reply); + + /* Clean up */ + for (size_t i = 2; i < (n + 2); i++) { + free(argv[i]); + } + + free(argv); + free(argvlen); +} + +int main(int argc, char **argv) { + unsigned int j, isunix = 0; + redisContext *c; + redisReply *reply; + const char *hostname = (argc > 1) ? argv[1] : "127.0.0.1"; + + if (argc > 2) { + if (*argv[2] == 'u' || *argv[2] == 'U') { + isunix = 1; + /* in this case, host is the path to the unix socket */ + printf("Will connect to unix socket @%s\n", hostname); + } + } + + int port = (argc > 2) ? atoi(argv[2]) : 6379; + + struct timeval timeout = { 1, 500000 }; // 1.5 seconds + if (isunix) { + c = redisConnectUnixWithTimeout(hostname, timeout); + } else { + c = redisConnectWithTimeout(hostname, port, timeout); + } + if (c == NULL || c->err) { + if (c) { + printf("Connection error: %s\n", c->errstr); + redisFree(c); + } else { + printf("Connection error: can't allocate redis context\n"); + } + exit(1); + } + + /* PING server */ + reply = redisCommand(c,"PING"); + printf("PING: %s\n", reply->str); + freeReplyObject(reply); + + /* Set a key */ + reply = redisCommand(c,"SET %s %s", "foo", "hello world"); + printf("SET: %s\n", reply->str); + freeReplyObject(reply); + + /* Set a key using binary safe API */ + reply = redisCommand(c,"SET %b %b", "bar", (size_t) 3, "hello", (size_t) 5); + printf("SET (binary API): %s\n", reply->str); + freeReplyObject(reply); + + /* Try a GET and two INCR */ + reply = redisCommand(c,"GET foo"); + printf("GET foo: %s\n", reply->str); + freeReplyObject(reply); + + reply = redisCommand(c,"INCR counter"); + printf("INCR counter: %lld\n", reply->integer); + freeReplyObject(reply); + /* again ... */ + reply = redisCommand(c,"INCR counter"); + printf("INCR counter: %lld\n", reply->integer); + freeReplyObject(reply); + + /* Create a list of numbers, from 0 to 9 */ + reply = redisCommand(c,"DEL mylist"); + freeReplyObject(reply); + for (j = 0; j < 10; j++) { + char buf[64]; + + snprintf(buf,64,"%u",j); + reply = redisCommand(c,"LPUSH mylist element-%s", buf); + freeReplyObject(reply); + } + + /* Let's check what we have inside the list */ + reply = redisCommand(c,"LRANGE mylist 0 -1"); + if (reply->type == REDIS_REPLY_ARRAY) { + for (j = 0; j < reply->elements; j++) { + printf("%u) %s\n", j, reply->element[j]->str); + } + } + freeReplyObject(reply); + + /* See function for an example of redisCommandArgv */ + example_argv_command(c, 10); + + /* Disconnects and frees the context */ + redisFree(c); + + return 0; +} diff --git a/helper.ipynb b/helper.ipynb index c806e29..90aa7e8 100644 --- a/helper.ipynb +++ b/helper.ipynb @@ -1,25 +1,924 @@ { "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Make makefile" + ] + }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "{\"BitType\":0,\n", - "\"BitSize\":0,\n", - "\"BitCodeHundreds\":0,\n", - "\"BitCodeTens\":0,\n", - "\"BitCodeOnes\":0,\n", - "\"BitNozzleSize\":0,\n", - "\"BitLength\":0,\n", - "\"BitWeightPerLength\":0,\n", - "\"BitNozzleNo\":0,\n", - "\"FloatValve\":0,\n", - "\n" + "\tCSharp/OperationScenarios/Common/COperationScenariosVariables.f90 /\n", + "\tTorqueDrag/TD_Modules/TD_WellGeometry.f90 /\n", + "\tTorqueDrag/TD_Modules/TD_WellElements.f90 /\n", + "\tTorqueDrag/TD_Modules/TD_StringConnectionData.f90 /\n", + "\tTorqueDrag/TD_Modules/GeoElements_FluidModule.f90 /\n", + "\tRop/sROP_Variables.f90 /\n", + "\tRop/sROP_Other_Variables.f90 /\n", + "\tFluidFlow/Flow_Startup_VARIABLES.f90 /\n", + "\tCSharp/DownHole/CDownHoleTypes.f90 /\n", + "\tEquipments/Drawworks/Drawworks_VARIABLES.f90 /\n", + "\tEquipments/ChokeControl/CHOKE_VARIABLES.f90 /\n", + "\tEquipments/TopDrive/TopDrive_VARIABLES.f90 /\n", + "\tEquipments/RotaryTable/RTable_VARIABLES.f90 /\n", + "\tEquipments/Pumps/Pumps_VARIABLES.f90 /\n", + "\tCSharp/Warnings/CWarningsVariables.f90 /\n", + "\tCSharp/StudentStation/CStudentStationVariables.f90 /\n", + "\tCSharp/OperationScenarios/SoftwareInputsVariables.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/UnitySignalsVariables.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/PermissionsVariables.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/NotificationVariables.f90 /\n", + "\tCSharp/Equipments/Tanks/CTanksVariables.f90 /\n", + "\tCSharp/Equipments/DrillWatch/CDrillWatchVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CTopDrivePanelVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CStandPipeManifoldVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CHookVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CDrillingConsoleVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CChokeManifoldVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CChokeControlPanelVariables.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CBopControlPanelVariables.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CWellSurveyDataVariables.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CPathGenerationVariables.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CCasingLinerChokeVariables.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CRigSizeVariables.f90 /\n", + "\tCSharp/Common/CIActionReference.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CPowerVariables.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CHoistingVariables.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CBopStackVariables.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CAccumulatorVariables.f90 /\n", + "\tCSharp/BasicInputs/Geology/CShoeVariables.f90 /\n", + "\tCSharp/BasicInputs/Geology/CReservoirVariables.f90 /\n", + "\tCSharp/BasicInputs/Geology/CFormationVariables.f90 /\n", + "\tCSharp/BasicInputs/Bha/CStringConfigurationVariables.f90 /\n", + "\tSimulation/Constants.f90 /\n", + "\tCSharp/Equipments/MudPathFinding/CArrangement.f90 /\n", + "\tCSharp/OperationScenarios/Unity/CUnityInputs.f90 /\n", + "\tCSharp/Common/CCommonVariables.f90 /\n", + "\tCommon/DynamicIntegerArray.f90 /\n", + "\tRop/RopMain.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CEquipmentsConstants.f90 /\n", + "\tCommon/DynamicRealArray.f90 /\n", + "\tCSharp/Common/CTimerLegacy.f90 /\n", + "\tCommon/DynamicDoubleArray.f90 /\n", + "\tCSharp/Equipments/MudPathFinding/CPathChangeEvents.f90 /\n", + "\tCommon/DynamicLogicalArray.f90 /\n", + "\tCSharp/Common/CScaleRange.f90 /\n", + "\tCSharp/Common/CTimer.f90 /\n", + "\tCSharp/Common/CQuery.f90 /\n", + "\tFluidFlow/FluidFlowMain.f90 /\n", + "\tTorqueDrag/TD_Modules/TD_GeneralData.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CWellSurveyData.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CDataDisplayConsoleVariables.f90 /\n", + "\tCSharp/ErrorLog/CLog4.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CPumpsVariables.f90 /\n", + "\tCSharp/ErrorLog/CLog1.f90 /\n", + "\tCSharp/BasicInputs/CMudPropertiesVariables.f90 /\n", + "\tCSharp/ErrorLog/CLog5.f90 /\n", + "\tCSharp/ErrorLog/CError.f90 /\n", + "\tCSharp/ErrorLog/CLog2.f90 /\n", + "\tCSharp/ErrorLog/CLog3.f90 /\n", + "\tSimulation/CSounds.f90 /\n", + "\tCSharp/Common/CCommon.f90 /\n", + "\tFluidFlow/Pressure_Display_VARIABLES.f90 /\n", + "\tEquipments/BopStack/VARIABLES.f90 /\n", + "\tFluidFlow/kick/Kick_VARIABLES.f90 /\n", + "\tCSharp/OperationScenarios/Unity/CUnityOutputs.f90 /\n", + "\tCSharp/DownHole/CDownHoleVariables.f90 /\n", + "\tGeo/GeoMain.f90 /\n", + "\tCSharp/Equipments/MudPathFinding/CPath.f90 /\n", + "\tCSharp/Problems/CProblemDifinition.f90 /\n", + "\tFluidFlow/Pressure_Distribution_VARIABLES.f90 /\n", + "\tEquipments/MudSystem/MudSystem_Variables.f90 /\n", + "\tTorqueDrag/TD_Modules/TD_DrillStem.f90 /\n", + "\tCSharp/Equipments/MudPathFinding/CStack.f90 /\n", + "\tCSharp/Problems/CDrillStemProblemsVariables.f90 /\n", + "\tCSharp/Problems/COtherProblemsVariables.f90 /\n", + "\tCSharp/Problems/CLostProblemsVariables.f90 /\n", + "\tCSharp/Problems/CGaugesProblemsVariables.f90 /\n", + "\tCSharp/Problems/CBitProblemsVariables.f90 /\n", + "\tCSharp/Problems/CKickProblemsVariables.f90 /\n", + "\tCSharp/Problems/CHoistingProblemsVariables.f90 /\n", + "\tCSharp/Problems/CChokeProblemsVariables.f90 /\n", + "\tCSharp/Problems/CPumpProblemsVariables.f90 /\n", + "\tCSharp/Problems/CRotaryProblemsVariables.f90 /\n", + "\tCSharp/Problems/CMudTreatmentProblemsVariables.f90 /\n", + "\tCSharp/Problems/CBopProblemsVariables.f90 /\n", + "\tSimulation/SimulationVariables.f90 /\n", + "\tCSharp/Problems/CMudTreatmentProblems.f90 /\n", + "\tCSharp/Problems/CChokeProblems.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CHook.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CRigSize.f90 /\n", + "\tEquipments/BopStack/PipeRams1Main.f90 /\n", + "\tCSharp/Problems/COtherProblems.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CAccumulator.f90 /\n", + "\tCSharp/Problems/CRotaryProblems.f90 /\n", + "\tCSharp/Problems/CDrillStemProblems.f90 /\n", + "\tCSharp/BasicInputs/MudProperties.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CPower.f90 /\n", + "\tEquipments/RotaryTable/RotaryTableMain.f90 /\n", + "\tCSharp/Equipments/MudPathFinding/CManifolds.f90 /\n", + "\tCSharp/Problems/CBopProblems.f90 /\n", + "\tCSharp/DownHole/DownHole.f90 /\n", + "\tCSharp/Problems/CHoistingProblems.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CHoisting.f90 /\n", + "\tEquipments/Drawworks/DrawworksMain.f90 /\n", + "\tCSharp/Problems/CLostProblems.f90 /\n", + "\tCSharp/Problems/CBitProblems.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CBopStack.f90 /\n", + "\tEquipments/BopStack/ChokeLineMain.f90 /\n", + "\tEquipments/Pumps/PumpsMain.f90 /\n", + "\tEquipments/BopStack/AnnularMain.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CPathGeneration.f90 /\n", + "\tCSharp/BasicInputs/Geology/CReservoir.f90 /\n", + "\tCSharp/BasicInputs/Bha/CStringConfiguration.f90 /\n", + "\tEquipments/BopStack/PipeRams2Main.f90 /\n", + "\tEquipments/BopStack/BlindRamsMain.f90 /\n", + "\tCSharp/Problems/CKickProblems.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/Permissions.f90 /\n", + "\tCSharp/BasicInputs/Geology/CFormation.f90 /\n", + "\tEquipments/BopStack/KillLineMain.f90 /\n", + "\tCSharp/Problems/CGaugesProblems.f90 /\n", + "\tCSharp/BasicInputs/WellProfile/CCasingLinerChoke.f90 /\n", + "\tCSharp/BasicInputs/Geology/CShoe.f90 /\n", + "\tCSharp/Problems/CPumpProblems.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CDataDisplayConsole.f90 /\n", + "\tCSharp/OperationScenarios/SoftwareInputs.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_DrillStemReadData.f90 /\n", + "\tEquipments/Pumps/Pump_OffMode_Solver.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownDRot.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_DropArea/TD_ForceDownD.f90 /\n", + "\tFluidFlow/kick/Formation_Information.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_WellElementsConfiguration.f90 /\n", + "\tEquipments/MudSystem/Elements_Creation.f90 /\n", + "\tEquipments/Drawworks/Drawworks_StartUp.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_PipePropertiesReadData.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_CombinedMotionData.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TVD_Calculator.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpSRot.f90 /\n", + "\tRop/Bit_Specification.f90 /\n", + "\tEquipments/Pumps/Pump3_MainSolver.f90 /\n", + "\tEquipments/MudSystem/Kick_Expansion_and_Contraction.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_ForceCalculation.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownB.f90 /\n", + "\tEquipments/Pumps/Pumps_TotalSolver.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StrainCalculation.f90 /\n", + "\tFluidFlow/Flow_Startup.f90 /\n", + "\tEquipments/DrillingConsole_ScrLEDs.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_ViscousDragForce/TD_ViscousDragForce.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StraightArea/TD_ForceUpS.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownS.f90 /\n", + "\tEquipments/RotaryTable/RTable_StartUp.f90 /\n", + "\tEquipments/MudSystem/Utube2_and_Trip_In.f90 /\n", + "\tEquipments/MudSystem/Kick_Migration.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_ForceReadData.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StaticHookLoadCalculation.f90 /\n", + "\tEquipments/MudSystem/Pump_and_Trip_In.f90 /\n", + "\tEquipments/MudSystem/Deallocate_Normal_Circulation.f90 /\n", + "\tEquipments/RotaryTable/RTable_OnModeSolver.f90 /\n", + "\tEquipments/Pumps/Pump_OnMode_Solver.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_WellElementsReadData.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_MudPropertiesReadData.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpDRot.f90 /\n", + "\tEquipments/TopDrive/TopDrive_StartUp.f90 /\n", + "\tEquipments/MudSystem/FillingWell_By_BellNipple.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpBRot.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_TorqueCalculation.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_BuildArea/TD_ForceDownBRot.f90 /\n", + "\tEquipments/Drawworks/Drawworks_MainSolver.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_DropArea/TD_ForceUpD.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_BuildArea/TD_ForceUpB.f90 /\n", + "\tEquipments/RotaryTable/RTable_OffModeSolver.f90 /\n", + "\tTorqueDrag/TD_StartUp/TD_DrillStemStartUp.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_StraightArea/TD_ForceDownSRot.f90 /\n", + "\tRop/JetImpactForce.f90 /\n", + "\tTorqueDrag/TD_ReadDataSubroutines/TD_WellReadData.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_BouyancyFactor.f90 /\n", + "\tFluidFlow/Frictional_Press_Drop_Calc.f90 /\n", + "\tEquipments/TopDrive/TopDrive_Outputs.f90 /\n", + "\tEquipments/Drawworks/DWFixModeMotion.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CBopControlPanel.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/UnitySignals.f90 /\n", + "\tCSharp/BasicInputs/RigSpecifications/CPumps.f90 /\n", + "\tCSharp/Equipments/ControlPanels/CChokeManifold.f90 /\n", + "\tCSharp/Equipments/Tanks/CTanks.f90 /\n", + "\tCSharp/Warnings/CWarnings.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_BOPDiamCalculation.f90 /\n", + "\tEquipments/Drawworks/Drawworks_Direction.f90 /\n", + "\tEquipments/RotaryTable/RTable_Outputs.f90 /\n", + "\tEquipments/Drawworks/DWMalfunction_MotorFailure.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_WeightOnBitCalculation.f90 /\n", + "\tFluidFlow/String_Property_Calculator.f90 /\n", + "\tFluidFlow/Annulus_Property_Calculator.f90 /\n", + "\tEquipments/MudSystem/Trip_Out_andPump.f90 /\n", + "\tEquipments/MudSystem/Utube1_and_Trip_In.f90 /\n", + "\tEquipments/Pumps/Pump2_MainSolver.f90 /\n", + "\tEquipments/Pumps/Pump1_MainSolver.f90 /\n", + "\tFluidFlow/Utube.f90 /\n", + "\tEquipments/BopStack/BOP.f90 /\n", + "\tEquipments/BopStack/SHEAR_RAM.f90 /\n", + "\tEquipments/BopStack/PIPE_RAM2.f90 /\n", + "\tEquipments/BopStack/LOSS_INPUTS.f90 /\n", + "\tEquipments/BopStack/ANNULAR.f90 /\n", + "\tEquipments/BopStack/CHOKE_LINE.f90 /\n", + "\tEquipments/BopStack/KILL_LINE.f90 /\n", + "\tEquipments/BopStack/PIPE_RAM1.f90 /\n", + "\tEquipments/BopStack/BOPstartup.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/Notofications.f90 /\n", + "\tTorqueDrag/TD_StartUp/TD_StartUp.f90 /\n", + "\tTorqueDrag/TD_Forces/TD_HookLoadCalculation.f90 /\n", + "\tEquipments/TopDrive/TopDrive_Inputs.f90 /\n", + "\tEquipments/TopDrive/TopDrive_Solver.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/Notifications.f90 /\n", + "\tTorqueDrag/TorqueDragMain.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/MeshGeneration_FluidModule.f90 /\n", + "\tEquipments/Pumps/Pumps_StartUp.f90 /\n", + "\tEquipments/ChokeControl/CHOKE.f90 /\n", + "\tEquipments/ChokeControl/AirPump_Choke_Subs.f90 /\n", + "\tEquipments/MudSystem/MudSystemStartup.f90 /\n", + "\tEquipments/TopDrive/TopDriveMain.f90 /\n", + "\tEquipments/MudSystem/MudSystem.f90 /\n", + "\tRop/ROP_MainCalculation.f90 /\n", + "\tEquipments/Drawworks/Drawworks_Outputs.f90 /\n", + "\tEquipments/RotaryTable/RTable_Inputs.f90 /\n", + "\tEquipments/TopDrive/TopDrive_OffMode.f90 /\n", + "\tEquipments/TopDrive/TopDrive_MainSolver.f90 /\n", + "\tCSharp/OperationScenarios/Common/OperationScenarios.f90 /\n", + "\tEquipments/ChokeControl/ChokeControlMain.f90 /\n", + "\tEquipments/ChokeControl/ChokeStartup.f90 /\n", + "\tEquipments/MudSystem/MudSystemMain.f90 /\n", + "\tEquipments/Pumps/Pumps_Inputs.f90 /\n", + "\tEquipments/Pumps/Pumps_Outputs.f90 /\n", + "\tFluidFlow/Annulus_and_Openhole_Pressure_Distribution.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_WellGeoConfiguration.f90 /\n", + "\tEquipments/RotaryTable/RTable_MainSolver.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CSlipsEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CUnlatchLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CTdsTorqueWrenchLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CInstallMudBucketPermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CFillupHeadPermission.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/COpenKellyCockLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CTdsPowerLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CSwingLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Enums/CTdsElevatorModesEnum.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CTdsSpineEnum.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CSwingTiltPermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CIrSafetyValvePermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CSwingOffPermission.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CCloseSafetyValveLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CMouseHoleEnum.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CFlowPipeDisconnectEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CCloseKellyCockLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Enums/CElevatorConnectionEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CIrSafetyValveLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CFlowKellyDisconnectEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/COpenSafetyValveLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CTdsBackupClamp.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CTdsTongEnum.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CElevatorEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CTongNotification.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CSafetyValveEnum.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CRemoveMudBucketPermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CInstallFillupHeadPermission.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CSwingEnum.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CKellyEnum.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CSwingDrillPermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CIrIbopPermission.f90 /\n", + "\tCSharp/OperationScenarios/Permissions/CRemoveFillupHeadPermission.f90 /\n", + "\tCSharp/OperationScenarios/Common/COperationScenariosSettings.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CTdsSwingEnum.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CIbopEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CFillMouseHoleLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/UnitySignals/CTongEnum.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CIrIBopLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CTdsIbopLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CLatchLedNotification.f90 /\n", + "\tCSharp/OperationScenarios/Notifications/CSlipsNotification.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_DrillStemConfiguration.f90 /\n", + "\tEquipments/MudSystem/Kick_Influx.f90 /\n", + "\tEquipments/MudSystem/Disconnecting_Pipe.f90 /\n", + "\tEquipments/Drawworks/Drawworks_Solver_OffMode.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_RemoveComponents.f90 /\n", + "\tFluidFlow/Horizontal_and_String_Pressure_Distribution.f90 /\n", + "\tEquipments/Drawworks/Drawworks_INPUTS.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_AddComponents.f90 /\n", + "\tEquipments/Drawworks/Drawworks_Solver.f90 /\n", + "\tEquipments/Pumps/Pumps_MainSolver.f90 /\n", + "\tCSharp/OperationScenarios/Common/COperationScenariosMain.f90 /\n", + "\tEquipments/MudSystem/Circulation_Code_Select.f90 /\n", + "\tTorqueDrag/TD_DrillingSubs/TD_StringConnectionModes.f90 /\n", + "\tFluidFlow/kick/Gas_Kick_Calculator.f90 /\n", + "\tSimulator.f90 /\n", + "\tTorqueDrag/TD_MainCalculations.f90 /\n", + "\tFluidFlow/Well_Pressure_Data_Transfer.f90 /\n", + "\tSimulationCore2.f90 /\n", + "\tEquipments/MudSystem/Plot_Final_Mud_Elements.f90 /\n", + "\tFluidFlow/Fluid_Flow_Solver.f90 /\n" + ] + } + ], + "source": [ + "import re\n", + "current_dir = 'C:\\\\Projects\\\\VSIM\\\\SimulationCore2\\\\'\n", + "target_dir = 'x64\\\\Debug\\\\'\n", + "depfilename = 'x64\\Debug\\SimulationCore2.dep'\n", + "depfile = open(depfilename,'r')\n", + "content = depfile.read()\n", + "deptexts = content.split('\\n\\n')\n", + "dependencies = {}\n", + "moddeps = {}\n", + "external_deps = []\n", + "deptexts = [dt for dt in deptexts if dt!='']\n", + "\n", + "for depno,dept in enumerate(deptexts):\n", + " headt,tailt = dept.split(': \\\\')\n", + " headt,tailt = headt.strip(),tailt.strip()\n", + " if headt.endswith('.mod'):\n", + " ffile = tailt.replace(current_dir,'')\n", + " mfiles = re.split(r' | \\\\\\n',headt)\n", + " for mfile in mfiles:\n", + " moddeps[mfile.strip()] = ffile\n", + "for depno,dept in enumerate(deptexts):\n", + " headt,tailt = dept.split(': \\\\')\n", + " headt,tailt = headt.strip(),tailt.strip()\n", + " if headt.endswith('.obj'):\n", + " tails = re.split(r' \\\\\\n| ',tailt)\n", + " tails = [t for t in tails if t!='']\n", + " head = tails[0].replace(current_dir,'')\n", + " deps = []\n", + " for t in tails[1:]:\n", + " mfile = t.replace(target_dir,'')\n", + " # if 'json_' in mfile:\n", + " # continue\n", + " if mfile.strip() == '':\n", + " print(f\"!!! t = '{t}', \")\n", + " \n", + " if mfile in moddeps:\n", + " deps.append(moddeps[mfile])\n", + " else:\n", + " external_deps.append(mfile)\n", + " # print(f\"{mfile} is not located\")\n", + " if head in deps:\n", + " deps.remove(head)\n", + " # print(f\"making deps for {head}\")\n", + " dependencies[head]=deps\n", + "\n", + "f = open('dependencies.txt','w')\n", + "f.write(str(dependencies))\n", + "f.close()\n", + "\n", + "from graphlib import TopologicalSorter\n", + "ts = TopologicalSorter(dependencies)\n", + "files = tuple(ts.static_order())\n", + "for file in files:\n", + " print(\"\\t\"+file.replace(\"\\\\\",\"/\")+\" /\")" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "cannot prepare() more than once", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32mc:\\Projects\\VSIM\\SimulationCore2\\helper.ipynb Cell 3\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[0m files \u001b[39m=\u001b[39m \u001b[39mtuple\u001b[39;49m(ts\u001b[39m.\u001b[39;49mstatic_order())\n\u001b[0;32m 2\u001b[0m \u001b[39mfor\u001b[39;00m file \u001b[39min\u001b[39;00m files:\n\u001b[0;32m 3\u001b[0m \u001b[39mprint\u001b[39m(file\u001b[39m.\u001b[39mreplace(\u001b[39m\"\u001b[39m\u001b[39m\\\\\u001b[39;00m\u001b[39m\"\u001b[39m,\u001b[39m\"\u001b[39m\u001b[39m/\u001b[39m\u001b[39m\"\u001b[39m)\u001b[39m+\u001b[39m\u001b[39m\"\u001b[39m\u001b[39m /\u001b[39m\u001b[39m\"\u001b[39m)\n", + "File \u001b[1;32mc:\\Users\\Mahmood\\Anaconda3\\lib\\graphlib.py:242\u001b[0m, in \u001b[0;36mTopologicalSorter.static_order\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 233\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mstatic_order\u001b[39m(\u001b[39mself\u001b[39m):\n\u001b[0;32m 234\u001b[0m \u001b[39m\"\"\"Returns an iterable of nodes in a topological order.\u001b[39;00m\n\u001b[0;32m 235\u001b[0m \n\u001b[0;32m 236\u001b[0m \u001b[39m The particular order that is returned may depend on the specific\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 240\u001b[0m \u001b[39m cycle is detected, :exc:`CycleError` will be raised.\u001b[39;00m\n\u001b[0;32m 241\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 242\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mprepare()\n\u001b[0;32m 243\u001b[0m \u001b[39mwhile\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mis_active():\n\u001b[0;32m 244\u001b[0m node_group \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mget_ready()\n", + "File \u001b[1;32mc:\\Users\\Mahmood\\Anaconda3\\lib\\graphlib.py:93\u001b[0m, in \u001b[0;36mTopologicalSorter.prepare\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 85\u001b[0m \u001b[39m\"\"\"Mark the graph as finished and check for cycles in the graph.\u001b[39;00m\n\u001b[0;32m 86\u001b[0m \n\u001b[0;32m 87\u001b[0m \u001b[39mIf any cycle is detected, \"CycleError\" will be raised, but \"get_ready\" can\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 90\u001b[0m \u001b[39mtherefore no more nodes can be added using \"add\".\u001b[39;00m\n\u001b[0;32m 91\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 92\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_ready_nodes \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m---> 93\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mcannot prepare() more than once\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 95\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_ready_nodes \u001b[39m=\u001b[39m [\n\u001b[0;32m 96\u001b[0m i\u001b[39m.\u001b[39mnode \u001b[39mfor\u001b[39;00m i \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_node2info\u001b[39m.\u001b[39mvalues() \u001b[39mif\u001b[39;00m i\u001b[39m.\u001b[39mnpredecessors \u001b[39m==\u001b[39m \u001b[39m0\u001b[39m\n\u001b[0;32m 97\u001b[0m ]\n\u001b[0;32m 98\u001b[0m \u001b[39m# ready_nodes is set before we look for cycles on purpose:\u001b[39;00m\n\u001b[0;32m 99\u001b[0m \u001b[39m# if the user wants to catch the CycleError, that's fine,\u001b[39;00m\n\u001b[0;32m 100\u001b[0m \u001b[39m# they can continue using the instance to grab as many\u001b[39;00m\n\u001b[0;32m 101\u001b[0m \u001b[39m# nodes as possible before cycles block more progress\u001b[39;00m\n", + "\u001b[1;31mValueError\u001b[0m: cannot prepare() more than once" + ] + } + ], + "source": [ + "files = tuple(ts.static_order())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['FluidFlow\\\\Well_Pressure_Data_Transfer.f90',\n", + " 'FluidFlow\\\\Well_Pressure_Data_Transfer.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'CSharp\\\\BasicInputs\\\\MudProperties.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsole.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog1.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CError.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarnings.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Unity\\\\CUnityOutputs.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumps.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CArrangement.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CStack.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CManifolds.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90',\n", + " 'FluidFlow\\\\kick\\\\Gas_Kick_Calculator.f90',\n", + " 'FluidFlow\\\\Well_Pressure_Data_Transfer.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CError.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CError.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90',\n", + " 'FluidFlow\\\\kick\\\\Kick_VARIABLES.f90',\n", + " 'CSharp\\\\BasicInputs\\\\MudProperties.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsole.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog1.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CError.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarnings.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Unity\\\\CUnityOutputs.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumps.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CArrangement.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CStack.f90',\n", + " 'CSharp\\\\Equipments\\\\MudPathFinding\\\\CManifolds.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellGeometry.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_WellElements.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_StringConnectionData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_GeneralData.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\TD_DrillStem.f90',\n", + " 'TorqueDrag\\\\TD_Modules\\\\GeoElements_FluidModule.f90',\n", + " 'Rop\\\\sROP_Variables.f90',\n", + " 'Rop\\\\sROP_Other_Variables.f90',\n", + " 'FluidFlow\\\\Pressure_Display_VARIABLES.f90',\n", + " 'FluidFlow\\\\Flow_Startup_VARIABLES.f90',\n", + " 'Equipments\\\\Drawworks\\\\Drawworks_VARIABLES.f90',\n", + " 'Equipments\\\\ChokeControl\\\\CHOKE_VARIABLES.f90',\n", + " 'Equipments\\\\TopDrive\\\\TopDrive_VARIABLES.f90',\n", + " 'Equipments\\\\RotaryTable\\\\RTable_VARIABLES.f90',\n", + " 'Equipments\\\\Pumps\\\\Pumps_VARIABLES.f90',\n", + " 'Equipments\\\\BopStack\\\\VARIABLES.f90',\n", + " 'CSharp\\\\Warnings\\\\CWarningsVariables.f90',\n", + " 'CSharp\\\\StudentStation\\\\CStudentStationVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CRotaryProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CPumpProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\COtherProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CMudTreatmentProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CLostProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CKickProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CHoistingProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CGaugesProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CDrillStemProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CChokeProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CBopProblemsVariables.f90',\n", + " 'CSharp\\\\Problems\\\\CProblemDifinition.f90',\n", + " 'CSharp\\\\Problems\\\\CBitProblemsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\SoftwareInputsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\UnitySignals\\\\UnitySignalsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Permissions\\\\PermissionsVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Notifications\\\\NotificationVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\Tanks\\\\CTanksVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\DrillWatch\\\\CDrillWatchVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CTopDrivePanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CStandPipeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CHookVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDrillingConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CDataDisplayConsoleVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeManifoldVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CChokeControlPanelVariables.f90',\n", + " 'CSharp\\\\Equipments\\\\ControlPanels\\\\CBopControlPanelVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\CMudPropertiesVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CWellSurveyDataVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CPathGenerationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\WellProfile\\\\CCasingLinerChokeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CRigSizeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPumpsVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CPowerVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CHoistingVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CBopStackVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\RigSpecifications\\\\CAccumulatorVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CShoeVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CReservoirVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Geology\\\\CFormationVariables.f90',\n", + " 'CSharp\\\\BasicInputs\\\\Bha\\\\CStringConfigurationVariables.f90',\n", + " 'CSharp\\\\OperationScenarios\\\\Common\\\\COperationScenariosVariables.f90',\n", + " 'Simulation\\\\Constants.f90',\n", + " 'Simulation\\\\SimulationVariables.f90',\n", + " 'CSharp\\\\Common\\\\CIActionReference.f90',\n", + " 'CSharp\\\\ErrorLog\\\\CLog4.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleTypes.f90',\n", + " 'CSharp\\\\DownHole\\\\CDownHoleVariables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem_Variables.f90',\n", + " 'Equipments\\\\MudSystem\\\\MudSystem.f90',\n", + " 'FluidFlow\\\\Pressure_Distribution_VARIABLES.f90']" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dependencies['FluidFlow\\\\Well_Pressure_Data_Transfer.f90']" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1-(0, 1)\n", + "1-(1, 3)\n", + "1-(2, 3)\n", + "1-(3, 5)\n", + "2-(0, 1)\n", + "2-(1, 3)\n", + "2-(2, 3)\n", + "2-(3, 5)\n" + ] + } + ], + "source": [ + "l = [1,3,3,5]\n", + "for a in enumerate(l):\n", + " print(f\"1-{a}\")\n", + "for a in enumerate(l):\n", + " print(f\"2-{a}\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ToJson" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{\"HoleType\":0,\n", + "\"Angle\":0,\n", + "\"Length\":0,\n", + "\"FinalAngle\":0,\n", + "\"TotalLength\":0,\n", + "\"MeasuredDepth\":0,\n", + "\"TotalVerticalDepth\":0,\n", + "}\n" ] } ], @@ -38,45 +937,21 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "call json%add(p,\"ActiveMudType\",data%Configuration%Mud%ActiveMudType)\n", - "call json%add(p,\"ActiveRheologyModel\",data%Configuration%Mud%ActiveRheologyModel)\n", - "call json%add(p,\"ActiveMudVolume\",data%Configuration%Mud%ActiveMudVolume)\n", - "call json%add(p,\"ActiveMudVolumeGal\",data%Configuration%Mud%ActiveMudVolumeGal)\n", - "call json%add(p,\"ActiveDensity\",data%Configuration%Mud%ActiveDensity)\n", - "call json%add(p,\"ActivePlasticViscosity\",data%Configuration%Mud%ActivePlasticViscosity)\n", - "call json%add(p,\"ActiveYieldPoint\",data%Configuration%Mud%ActiveYieldPoint)\n", - "call json%add(p,\"ActiveThetaThreeHundred\",data%Configuration%Mud%ActiveThetaThreeHundred)\n", - "call json%add(p,\"ActiveThetaSixHundred\",data%Configuration%Mud%ActiveThetaSixHundred)\n", - "call json%add(p,\"ReserveMudType\",data%Configuration%Mud%ReserveMudType)\n", - "call json%add(p,\"ReserveMudVolume\",data%Configuration%Mud%ReserveMudVolume)\n", - "call json%add(p,\"ReserveMudVolumeGal\",data%Configuration%Mud%ReserveMudVolumeGal)\n", - "call json%add(p,\"ReserveDensity\",data%Configuration%Mud%ReserveDensity)\n", - "call json%add(p,\"ReservePlasticViscosity\",data%Configuration%Mud%ReservePlasticViscosity)\n", - "call json%add(p,\"ReserveYieldPoint\",data%Configuration%Mud%ReserveYieldPoint)\n", - "call json%add(p,\"ReserveThetaThreeHundred\",data%Configuration%Mud%ReserveThetaThreeHundred)\n", - "call json%add(p,\"ReserveThetaSixHundred\",data%Configuration%Mud%ReserveThetaSixHundred)\n", - "call json%add(p,\"ActiveTotalTankCapacity\",data%Configuration%Mud%ActiveTotalTankCapacity)\n", - "call json%add(p,\"ActiveTotalTankCapacityGal\",data%Configuration%Mud%ActiveTotalTankCapacityGal)\n", - "call json%add(p,\"ActiveSettledContents\",data%Configuration%Mud%ActiveSettledContents)\n", - "call json%add(p,\"ActiveSettledContentsGal\",data%Configuration%Mud%ActiveSettledContentsGal)\n", - "call json%add(p,\"ActiveTotalContents\",data%Configuration%Mud%ActiveTotalContents)\n", - "call json%add(p,\"ActiveTotalContentsGal\",data%Configuration%Mud%ActiveTotalContentsGal)\n", - "call json%add(p,\"ActiveAutoDensity\",data%Configuration%Mud%ActiveAutoDensity)\n", - "call json%add(p,\"InitialTripTankMudVolume\",data%Configuration%Mud%InitialTripTankMudVolume)\n", - "call json%add(p,\"InitialTripTankMudVolumeGal\",data%Configuration%Mud%InitialTripTankMudVolumeGal)\n", - "call json%add(p,\"PedalFlowMeter\",data%Configuration%Mud%PedalFlowMeter)\n" + "call ProblemToJson(p,\"ElevatorConnection\",data%State%OperationScenarios%ElevatorConnection)\n", + "call ProblemToJson(p,\"StringUpdate\",data%State%OperationScenarios%StringUpdate)\n", + "call ProblemToJson(p,\"KellyConnection\",data%State%OperationScenarios%KellyConnection)\n" ] } ], "source": [ - "precode = \"\"\"call json%add(p,\"\",data%Configuration%Mud%\"\"\"\n", + "precode = \"\"\"call ProblemToJson(p,\"\",data%State%OperationScenarios%\"\"\"\n", "input = open(\"Text1.txt\")\n", "lines = input.readlines()\n", "for line in lines:\n", @@ -88,6 +963,90 @@ " print(newline)\n" ] }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "call HoistingToJson(p)\n", + "call OperationScenarioToJson(p)\n", + "call notificationsToJson(p)\n", + "call permissionsToJson(p)\n", + "call unitySignalsToJson(p)\n", + "call StudentStationToJson(p)\n", + "call BopStackInputToJson(p)\n", + "call BopStackAccToJson(p)\n", + "call RamLineToJson(p)\n", + "call AnnularComputationalToJson(p)\n", + "call AnnularToJson(p)\n", + "call PipeRam1ToJson(p)\n", + "call ShearRamToJson(p)\n", + "call PipeRam2ToJson(p)\n", + "call ChokeLineToJson(p)\n", + "call KillLineToJson(p)\n", + "call PumpsToJson(p)\n", + "call RAMToJson(p)\n", + "call RAMSToJson(p)\n", + "call ChokeToJson(p)\n", + "call AirDrivenPumpToJson(p)\n", + "call AirPumpLineToJson(p)\n", + "call CHOOKEToJson(p)\n", + "call DrawworksToJson(p)\n", + "call MudSystemToJson(p)\n", + "call MUDToJson(p)\n", + "call MPumpsToJson(p)\n", + "call PUMPToJson(p)\n", + "call RTableToJson(p)\n", + "call TDSToJson(p)\n", + "call GasType(3) ! 1 = methane , 2 = Hydrogen sulfide , 3 = Carbon dioxidToJson(p)\n", + "call PressureDisplayToJson(p)\n", + "call FricPressDropToJson(p)\n", + "call ROP_SpecToJson(p)\n", + "call ROP_BitToJson(p)\n", + "call TDGeoToJson(p)\n", + "call F_String(:)ToJson(p)\n", + "call F_CountsToJson(p)\n", + "call F_Interval(:)ToJson(p)\n", + "call OD_Annulus(4)ToJson(p)\n", + "call TD_DrillStemToJson(p)\n", + "call TD_DrillStemsToJson(p)\n", + "call TD_StringToJson(p)\n", + "call TD_CountToJson(p)\n", + "call G_StringElementToJson(p)\n", + "call TD_VolToJson(p)\n", + "call TD_GeneralToJson(p)\n", + "call TD_BOPToJson(p)\n", + "call TD_BOPElement(4)ToJson(p)\n", + "call TD_StConnToJson(p)\n", + "call TD_LoadToJson(p)\n", + "call TD_WellElToJson(p)\n", + "call TD_CasingToJson(p)\n", + "call TD_LinerToJson(p)\n", + "call TD_OpenHoleToJson(p)\n", + "call TD_ROPHoleToJson(p)\n", + "call TD_WellGeneralToJson(p)\n", + "call TD_WellGeo(:)ToJson(p)\n" + ] + } + ], + "source": [ + "precode = \"\"\"call \"\"\"\n", + "postcode = \"\"\"ToJson(p)\"\"\"\n", + "input = open(\"Text1.txt\")\n", + "lines = input.readlines()\n", + "for line in lines:\n", + " name = line.split(\"::\")[-1].strip()\n", + " # icoute = precode.index(\"\\\"\")+1\n", + " # name = line.split(\"::\")[-1][:-1].strip()\n", + " # print(name)\n", + " newline = precode+name+postcode\n", + " print(newline)\n" + ] + }, { "cell_type": "code", "execution_count": 3, diff --git a/hier.txt b/hier.txt index c93c709..06d597e 100644 --- a/hier.txt +++ b/hier.txt @@ -1,101 +1,101 @@ -type::SimulationDataType - type(SimulationStateType)::State - Type(HoistingType)::Hoisting - type(OperationScenarioType)::OperationScenario - type(NotificationType)::notifications - type(PermissionsType):: permissions - type(UnitySignalsType):: unitySignals - type(StudentStationType)::StudentStation - type(BopStackInputType)::BopStackInput - type(BopStackAccType)::BopStackAcc - type(RamLineType)::RamLine - type(AnnularComputationalType)::AnnularComputational - type(AnnularType)::Annular - type(PipeRams1Type)::PipeRam1 - type(ShearRamType)::ShearRam - type(PipeRam2Type)::PipeRam2 - type(ChokeLineType)::ChokeLine - type(KillLineType)::KillLine - type(PumpsType)::Pumps - TYPE(BOP_TypeVars), DIMENSION(1:6) :: RAM - TYPE(BOP_TypeVars2D) :: RAMS - type(ChokeType)::Choke - type(AirDrivenPumpType)::AirDrivenPump - type(AirPumpLineType)::AirPumpLine - TYPE(CHOKE_TypeVars), DIMENSION(1:2) :: CHOOKE - TYPE(Drawworks_Var) :: Drawworks - type(MudSystemType)::MudSystem - TYPE(MUD_TypeVars), DIMENSION(1:10) :: MUD - TYPE(Pump_Var), DIMENSION(1:3) :: PUMP - TYPE(RTable_Var) :: RTable - TYPE(TDS_Var) :: TDS - TYPE(GasData) :: GasType(3) - TYPE(PressureDisplayVARIABLESTYPE) :: PressureDisplay - TYPE(ObservationAndGaugePointsInformations) , ALLOCATABLE :: ObservationPoint(:) - TYPE(FricPressDropVarsTYPE) :: FricPressDrop - TYPE(ROPSpecificationInfo) :: ROP_Spec - TYPE(ROPInfo) :: ROP_Bit - TYPE(Geo_Data) :: TDGeo - TYPE(F_StringData) , Allocatable :: F_String(:) - TYPE(F_IntervalsCountsData):: F_Counts - TYPE(F_IntervalData) , Allocatable :: F_Interval(:) - TYPE(OD_AnnulusData) :: OD_Annulus(4) - TYPE(TD_DrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStem - TYPE(TD_SeparatedDrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStems - TYPE(TD_StringInfo) :: TD_String - TYPE(TD_AddRemoveInfo) :: TD_Count - TYPE(CStringComponents), ALLOCATABLE, DIMENSION(:) :: G_StringElement - TYPE(TD_RemovedVolumeInfo) :: TD_Vol - TYPE(TD_GeneralInfo) :: TD_General - TYPE(TD_BOPInfo) :: TD_BOP - TYPE(CBopElement) :: TD_BOPElement(4) - TYPE(TD_StringconnectionInfo) :: TD_StConn - TYPE(TD_LoadInfo) :: TD_Load - TYPE(TD_WellElementsInfo) :: TD_WellEl - TYPE(TD_CasingInfo), ALLOCATABLE, DIMENSION(:) :: TD_Casing - TYPE(TD_LinerInfo), ALLOCATABLE, DIMENSION(:) :: data%State%TD_Liner - TYPE(TD_OpenHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_OpenHole - TYPE(TD_ROPHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_ROPHole - TYPE(TD_WellGeneralInfo) :: TD_WellGeneral - TYPE(TD_WellGeometryData), Allocatable :: TD_WellGeo(:) - type(EquipmentControlType)::EquipmentControl - type(BopControlPanelType) :: BopControlPanel - Type(ChokeControlPanelType)::ChokeControlPanel - Type(ChokeManifoldType)::ChokeManifold - Type(DataDisplayConsoleType) :: DataDisplayConsole - TYPE(DrillingConsoleType) :: DrillingConsole - Type(HookType)::Hook - type(StandPipeManifoldType)::StandPipeManifold - Type(TopDrivePanelType)::TopDrivePanel - Type(DrillingWatchType)::DrillingWatch - Type(TankType)::Tank - type(ConfigurationType)::Configuration - Type(StringConfigurationType)::StringConfiguration - Type(FormationType) :: Formation - Type(ReservoirType)::Reservoir - Type(ShoeType)::Shoe - Type(AccumulatorType)::Accumulator - Type(BopStackSpecificationType)::BopStackSpecification - Type(HoistingType)::Hoisting - Type(PowerType)::Power - Type(PumpSpecificationType)::PumpsSpecification - Type(RigSizeType)::RigSize - Type(CasingLinerChokeType)::CasingLinerChoke - Type(PathGenerationType)::PathGeneration - Type(WellSurveyDataType)::WellSurveyData - Type(MudPropertiesType)::MudProperties - type(ProblemsType)::problems - type(BitProblemsType)::BitProblems - type(BopProblemsType)::BopProblems - type(ChokeProblemsType)::ChokeProblems - type(DrillStemProblemsType)::DrillStemProblems - type(GaugesProblemsType)::GaugesProblems - type(HoistingProblemsType):: HoistingProblems - type(KickProblemsType)::KickProblems - type(LostProblemsType)::LostProblems - type(MudTreatmentProblemsType)::MudTreatmentProblems - type(OtherProblemsType)::OtherProblems - type(PumpProblemsType)::PumpProblems - type(RotaryProblemsType)::RotaryProblems - end type SimulationDataType - +type::SimulationDataType + type(SimulationStateType)::State + Type(HoistingType)::Hoisting + type(OperationScenarioType)::OperationScenario + type(NotificationType)::notifications + type(PermissionsType):: permissions + type(UnitySignalsType):: unitySignals + type(StudentStationType)::StudentStation + type(BopStackInputType)::BopStackInput + type(BopStackAccType)::BopStackAcc + type(RamLineType)::RamLine + type(AnnularComputationalType)::AnnularComputational + type(AnnularType)::Annular + type(PipeRams1Type)::PipeRam1 + type(ShearRamType)::ShearRam + type(PipeRam2Type)::PipeRam2 + type(ChokeLineType)::ChokeLine + type(KillLineType)::KillLine + type(PumpsType)::Pumps + TYPE(BOP_TypeVars), DIMENSION(1:6) :: RAM + TYPE(BOP_TypeVars2D) :: RAMS + type(ChokeType)::Choke + type(AirDrivenPumpType)::AirDrivenPump + type(AirPumpLineType)::AirPumpLine + TYPE(CHOKE_TypeVars), DIMENSION(1:2) :: CHOOKE + TYPE(Drawworks_Var) :: Drawworks + type(MudSystemType)::MudSystem + TYPE(MUD_TypeVars), DIMENSION(1:10) :: MUD + TYPE(Pump_Var), DIMENSION(1:3) :: PUMP + TYPE(RTable_Var) :: RTable + TYPE(TDS_Var) :: TDS + TYPE(GasData) :: GasType(3) + TYPE(PressureDisplayVARIABLESTYPE) :: PressureDisplay + TYPE(ObservationAndGaugePointsInformations) , ALLOCATABLE :: ObservationPoint(:) + TYPE(FricPressDropVarsTYPE) :: FricPressDrop + TYPE(ROPSpecificationInfo) :: ROP_Spec + TYPE(ROPInfo) :: ROP_Bit + TYPE(Geo_Data) :: TDGeo + TYPE(F_StringData) , Allocatable :: F_String(:) + TYPE(F_IntervalsCountsData):: F_Counts + TYPE(F_IntervalData) , Allocatable :: F_Interval(:) + TYPE(OD_AnnulusData) :: OD_Annulus(4) + TYPE(TD_DrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStem + TYPE(TD_SeparatedDrillStemInfo), ALLOCATABLE, DIMENSION(:) :: TD_DrillStems + TYPE(TD_StringInfo) :: TD_String + TYPE(TD_AddRemoveInfo) :: TD_Count + TYPE(CStringComponents), ALLOCATABLE, DIMENSION(:) :: G_StringElement + TYPE(TD_RemovedVolumeInfo) :: TD_Vol + TYPE(TD_GeneralInfo) :: TD_General + TYPE(TD_BOPInfo) :: TD_BOP + TYPE(CBopElement) :: TD_BOPElement(4) + TYPE(TD_StringconnectionInfo) :: TD_StConn + TYPE(TD_LoadInfo) :: TD_Load + TYPE(TD_WellElementsInfo) :: TD_WellEl + TYPE(TD_CasingInfo), ALLOCATABLE, DIMENSION(:) :: TD_Casing + TYPE(TD_LinerInfo), ALLOCATABLE, DIMENSION(:) :: data%State%TD_Liner + TYPE(TD_OpenHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_OpenHole + TYPE(TD_ROPHoleInfo), ALLOCATABLE, DIMENSION(:) :: TD_ROPHole + TYPE(TD_WellGeneralInfo) :: TD_WellGeneral + TYPE(TD_WellGeometryData), Allocatable :: TD_WellGeo(:) + type(EquipmentControlType)::EquipmentControl + type(BopControlPanelType) :: BopControlPanel + Type(ChokeControlPanelType)::ChokeControlPanel + Type(ChokeManifoldType)::ChokeManifold + Type(DataDisplayConsoleType) :: DataDisplayConsole + TYPE(DrillingConsoleType) :: DrillingConsole + Type(HookType)::Hook + type(StandPipeManifoldType)::StandPipeManifold + Type(TopDrivePanelType)::TopDrivePanel + Type(DrillingWatchType)::DrillingWatch + Type(TankType)::Tank + type(ConfigurationType)::Configuration + Type(StringConfigurationType)::StringConfiguration + Type(FormationType) :: Formation + Type(ReservoirType)::Reservoir + Type(ShoeType)::Shoe + Type(AccumulatorType)::Accumulator + Type(BopStackSpecificationType)::BopStackSpecification + Type(HoistingType)::Hoisting + Type(PowerType)::Power + Type(PumpSpecificationType)::PumpsSpecification + Type(RigSizeType)::RigSize + Type(CasingLinerChokeType)::CasingLinerChoke + Type(PathGenerationType)::PathGeneration + Type(WellSurveyDataType)::WellSurveyData + Type(MudPropertiesType)::MudProperties + type(ProblemsType)::problems + type(BitProblemsType)::BitProblems + type(BopProblemsType)::BopProblems + type(ChokeProblemsType)::ChokeProblems + type(DrillStemProblemsType)::DrillStemProblems + type(GaugesProblemsType)::GaugesProblems + type(HoistingProblemsType):: HoistingProblems + type(KickProblemsType)::KickProblems + type(LostProblemsType)::LostProblems + type(MudTreatmentProblemsType)::MudTreatmentProblems + type(OtherProblemsType)::OtherProblems + type(PumpProblemsType)::PumpProblems + type(RotaryProblemsType)::RotaryProblems + end type SimulationDataType + diff --git a/include/alloc.h b/include/alloc.h new file mode 100644 index 0000000..771f9fe --- /dev/null +++ b/include/alloc.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2020, Michael Grunder + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef HIREDIS_ALLOC_H +#define HIREDIS_ALLOC_H + +#include /* for size_t */ +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure pointing to our actually configured allocators */ +typedef struct hiredisAllocFuncs { + void *(*mallocFn)(size_t); + void *(*callocFn)(size_t,size_t); + void *(*reallocFn)(void*,size_t); + char *(*strdupFn)(const char*); + void (*freeFn)(void*); +} hiredisAllocFuncs; + +hiredisAllocFuncs hiredisSetAllocators(hiredisAllocFuncs *ha); +void hiredisResetAllocators(void); + +#ifndef _WIN32 + +/* Hiredis' configured allocator function pointer struct */ +extern hiredisAllocFuncs hiredisAllocFns; + +static inline void *hi_malloc(size_t size) { + return hiredisAllocFns.mallocFn(size); +} + +static inline void *hi_calloc(size_t nmemb, size_t size) { + /* Overflow check as the user can specify any arbitrary allocator */ + if (SIZE_MAX / size < nmemb) + return NULL; + + return hiredisAllocFns.callocFn(nmemb, size); +} + +static inline void *hi_realloc(void *ptr, size_t size) { + return hiredisAllocFns.reallocFn(ptr, size); +} + +static inline char *hi_strdup(const char *str) { + return hiredisAllocFns.strdupFn(str); +} + +static inline void hi_free(void *ptr) { + hiredisAllocFns.freeFn(ptr); +} + +#else + +void *hi_malloc(size_t size); +void *hi_calloc(size_t nmemb, size_t size); +void *hi_realloc(void *ptr, size_t size); +char *hi_strdup(const char *str); +void hi_free(void *ptr); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HIREDIS_ALLOC_H */ diff --git a/include/async.h b/include/async.h new file mode 100644 index 0000000..4f94660 --- /dev/null +++ b/include/async.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_ASYNC_H +#define __HIREDIS_ASYNC_H +#include "hiredis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct redisAsyncContext; /* need forward declaration of redisAsyncContext */ +struct dict; /* dictionary header is included in async.c */ + +/* Reply callback prototype and container */ +typedef void (redisCallbackFn)(struct redisAsyncContext*, void*, void*); +typedef struct redisCallback { + struct redisCallback *next; /* simple singly linked list */ + redisCallbackFn *fn; + int pending_subs; + int unsubscribe_sent; + void *privdata; +} redisCallback; + +/* List of callbacks for either regular replies or pub/sub */ +typedef struct redisCallbackList { + redisCallback *head, *tail; +} redisCallbackList; + +/* Connection callback prototypes */ +typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status); +typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status); +typedef void (redisConnectCallbackNC)(struct redisAsyncContext *, int status); +typedef void(redisTimerCallback)(void *timer, void *privdata); + +/* Context for an async connection to Redis */ +typedef struct redisAsyncContext { + /* Hold the regular context, so it can be realloc'ed. */ + redisContext c; + + /* Setup error flags so they can be used directly. */ + int err; + char *errstr; + + /* Not used by hiredis */ + void *data; + void (*dataCleanup)(void *privdata); + + /* Event library data and hooks */ + struct { + void *data; + + /* Hooks that are called when the library expects to start + * reading/writing. These functions should be idempotent. */ + void (*addRead)(void *privdata); + void (*delRead)(void *privdata); + void (*addWrite)(void *privdata); + void (*delWrite)(void *privdata); + void (*cleanup)(void *privdata); + void (*scheduleTimer)(void *privdata, struct timeval tv); + } ev; + + /* Called when either the connection is terminated due to an error or per + * user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */ + redisDisconnectCallback *onDisconnect; + + /* Called when the first write event was received. */ + redisConnectCallback *onConnect; + redisConnectCallbackNC *onConnectNC; + + /* Regular command callbacks */ + redisCallbackList replies; + + /* Address used for connect() */ + struct sockaddr *saddr; + size_t addrlen; + + /* Subscription callbacks */ + struct { + redisCallbackList replies; + struct dict *channels; + struct dict *patterns; + int pending_unsubs; + } sub; + + /* Any configured RESP3 PUSH handler */ + redisAsyncPushFn *push_cb; +} redisAsyncContext; + +/* Functions that proxy to hiredis */ +redisAsyncContext *redisAsyncConnectWithOptions(const redisOptions *options); +redisAsyncContext *redisAsyncConnect(const char *ip, int port); +redisAsyncContext *redisAsyncConnectBind(const char *ip, int port, const char *source_addr); +redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port, + const char *source_addr); +redisAsyncContext *redisAsyncConnectUnix(const char *path); +int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn); +int redisAsyncSetConnectCallbackNC(redisAsyncContext *ac, redisConnectCallbackNC *fn); +int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn); + +redisAsyncPushFn *redisAsyncSetPushCallback(redisAsyncContext *ac, redisAsyncPushFn *fn); +int redisAsyncSetTimeout(redisAsyncContext *ac, struct timeval tv); +void redisAsyncDisconnect(redisAsyncContext *ac); +void redisAsyncFree(redisAsyncContext *ac); + +/* Handle read/write events */ +void redisAsyncHandleRead(redisAsyncContext *ac); +void redisAsyncHandleWrite(redisAsyncContext *ac); +void redisAsyncHandleTimeout(redisAsyncContext *ac); +void redisAsyncRead(redisAsyncContext *ac); +void redisAsyncWrite(redisAsyncContext *ac); + +/* Command functions for an async context. Write the command to the + * output buffer and register the provided callback. */ +int redisvAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, va_list ap); +int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...); +int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen); +int redisAsyncFormattedCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/async_private.h b/include/async_private.h new file mode 100644 index 0000000..ea0558d --- /dev/null +++ b/include/async_private.h @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_ASYNC_PRIVATE_H +#define __HIREDIS_ASYNC_PRIVATE_H + +#define _EL_ADD_READ(ctx) \ + do { \ + refreshTimeout(ctx); \ + if ((ctx)->ev.addRead) (ctx)->ev.addRead((ctx)->ev.data); \ + } while (0) +#define _EL_DEL_READ(ctx) do { \ + if ((ctx)->ev.delRead) (ctx)->ev.delRead((ctx)->ev.data); \ + } while(0) +#define _EL_ADD_WRITE(ctx) \ + do { \ + refreshTimeout(ctx); \ + if ((ctx)->ev.addWrite) (ctx)->ev.addWrite((ctx)->ev.data); \ + } while (0) +#define _EL_DEL_WRITE(ctx) do { \ + if ((ctx)->ev.delWrite) (ctx)->ev.delWrite((ctx)->ev.data); \ + } while(0) +#define _EL_CLEANUP(ctx) do { \ + if ((ctx)->ev.cleanup) (ctx)->ev.cleanup((ctx)->ev.data); \ + ctx->ev.cleanup = NULL; \ + } while(0) + +static inline void refreshTimeout(redisAsyncContext *ctx) { + #define REDIS_TIMER_ISSET(tvp) \ + (tvp && ((tvp)->tv_sec || (tvp)->tv_usec)) + + #define REDIS_EL_TIMER(ac, tvp) \ + if ((ac)->ev.scheduleTimer && REDIS_TIMER_ISSET(tvp)) { \ + (ac)->ev.scheduleTimer((ac)->ev.data, *(tvp)); \ + } + + if (ctx->c.flags & REDIS_CONNECTED) { + REDIS_EL_TIMER(ctx, ctx->c.command_timeout); + } else { + REDIS_EL_TIMER(ctx, ctx->c.connect_timeout); + } +} + +void __redisAsyncDisconnect(redisAsyncContext *ac); +void redisProcessCallbacks(redisAsyncContext *ac); + +#endif /* __HIREDIS_ASYNC_PRIVATE_H */ diff --git a/include/dict.h b/include/dict.h new file mode 100644 index 0000000..6ad0acd --- /dev/null +++ b/include/dict.h @@ -0,0 +1,125 @@ +/* Hash table implementation. + * + * This file implements in memory hash tables with insert/del/replace/find/ + * get-random-element operations. Hash tables will auto resize if needed + * tables of power of two in size are used, collisions are handled by + * chaining. See the source code for more information... :) + * + * Copyright (c) 2006-2010, Salvatore Sanfilippo + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __DICT_H +#define __DICT_H + +#define DICT_OK 0 +#define DICT_ERR 1 + +/* Unused arguments generate annoying warnings... */ +#define DICT_NOTUSED(V) ((void) V) + +typedef struct dictEntry { + void *key; + void *val; + struct dictEntry *next; +} dictEntry; + +typedef struct dictType { + unsigned int (*hashFunction)(const void *key); + void *(*keyDup)(void *privdata, const void *key); + void *(*valDup)(void *privdata, const void *obj); + int (*keyCompare)(void *privdata, const void *key1, const void *key2); + void (*keyDestructor)(void *privdata, void *key); + void (*valDestructor)(void *privdata, void *obj); +} dictType; + +typedef struct dict { + dictEntry **table; + dictType *type; + unsigned long size; + unsigned long sizemask; + unsigned long used; + void *privdata; +} dict; + +typedef struct dictIterator { + dict *ht; + int index; + dictEntry *entry, *nextEntry; +} dictIterator; + +/* This is the initial size of every hash table */ +#define DICT_HT_INITIAL_SIZE 4 + +/* ------------------------------- Macros ------------------------------------*/ +#define dictFreeEntryVal(ht, entry) \ + if ((ht)->type->valDestructor) \ + (ht)->type->valDestructor((ht)->privdata, (entry)->val) + +#define dictSetHashVal(ht, entry, _val_) do { \ + if ((ht)->type->valDup) \ + entry->val = (ht)->type->valDup((ht)->privdata, _val_); \ + else \ + entry->val = (_val_); \ +} while(0) + +#define dictFreeEntryKey(ht, entry) \ + if ((ht)->type->keyDestructor) \ + (ht)->type->keyDestructor((ht)->privdata, (entry)->key) + +#define dictSetHashKey(ht, entry, _key_) do { \ + if ((ht)->type->keyDup) \ + entry->key = (ht)->type->keyDup((ht)->privdata, _key_); \ + else \ + entry->key = (_key_); \ +} while(0) + +#define dictCompareHashKeys(ht, key1, key2) \ + (((ht)->type->keyCompare) ? \ + (ht)->type->keyCompare((ht)->privdata, key1, key2) : \ + (key1) == (key2)) + +#define dictHashKey(ht, key) (ht)->type->hashFunction(key) + +#define dictGetEntryKey(he) ((he)->key) +#define dictGetEntryVal(he) ((he)->val) +#define dictSlots(ht) ((ht)->size) +#define dictSize(ht) ((ht)->used) + +/* API */ +static unsigned int dictGenHashFunction(const unsigned char *buf, int len); +static dict *dictCreate(dictType *type, void *privDataPtr); +static int dictExpand(dict *ht, unsigned long size); +static int dictAdd(dict *ht, void *key, void *val); +static int dictReplace(dict *ht, void *key, void *val); +static int dictDelete(dict *ht, const void *key); +static void dictRelease(dict *ht); +static dictEntry * dictFind(dict *ht, const void *key); +static void dictInitIterator(dictIterator *iter, dict *ht); +static dictEntry *dictNext(dictIterator *iter); + +#endif /* __DICT_H */ diff --git a/include/fmacros.h b/include/fmacros.h new file mode 100644 index 0000000..754a53c --- /dev/null +++ b/include/fmacros.h @@ -0,0 +1,14 @@ +#ifndef __HIREDIS_FMACRO_H +#define __HIREDIS_FMACRO_H + +#ifndef _AIX +#define _XOPEN_SOURCE 600 +#define _POSIX_C_SOURCE 200112L +#endif + +#if defined(__APPLE__) && defined(__MACH__) +/* Enable TCP_KEEPALIVE */ +#define _DARWIN_C_SOURCE +#endif + +#endif diff --git a/include/hiredis.h b/include/hiredis.h new file mode 100644 index 0000000..e1e9e51 --- /dev/null +++ b/include/hiredis.h @@ -0,0 +1,366 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2014, Pieter Noordhuis + * Copyright (c) 2015, Matt Stancliff , + * Jan-Erik Rediger + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_H +#define __HIREDIS_H +#include "read.h" +#include /* for va_list */ +#ifndef _MSC_VER +#include /* for struct timeval */ +#else +struct timeval; /* forward declaration */ +typedef long long ssize_t; +#endif +#include /* uintXX_t, etc */ +#include "sds.h" /* for sds */ +#include "alloc.h" /* for allocation wrappers */ + +#define HIREDIS_MAJOR 1 +#define HIREDIS_MINOR 1 +#define HIREDIS_PATCH 0 +#define HIREDIS_SONAME 1.1.0 + +/* Connection type can be blocking or non-blocking and is set in the + * least significant bit of the flags field in redisContext. */ +#define REDIS_BLOCK 0x1 + +/* Connection may be disconnected before being free'd. The second bit + * in the flags field is set when the context is connected. */ +#define REDIS_CONNECTED 0x2 + +/* The async API might try to disconnect cleanly and flush the output + * buffer and read all subsequent replies before disconnecting. + * This flag means no new commands can come in and the connection + * should be terminated once all replies have been read. */ +#define REDIS_DISCONNECTING 0x4 + +/* Flag specific to the async API which means that the context should be clean + * up as soon as possible. */ +#define REDIS_FREEING 0x8 + +/* Flag that is set when an async callback is executed. */ +#define REDIS_IN_CALLBACK 0x10 + +/* Flag that is set when the async context has one or more subscriptions. */ +#define REDIS_SUBSCRIBED 0x20 + +/* Flag that is set when monitor mode is active */ +#define REDIS_MONITORING 0x40 + +/* Flag that is set when we should set SO_REUSEADDR before calling bind() */ +#define REDIS_REUSEADDR 0x80 + +/* Flag that is set when the async connection supports push replies. */ +#define REDIS_SUPPORTS_PUSH 0x100 + +/** + * Flag that indicates the user does not want the context to + * be automatically freed upon error + */ +#define REDIS_NO_AUTO_FREE 0x200 + +/* Flag that indicates the user does not want replies to be automatically freed */ +#define REDIS_NO_AUTO_FREE_REPLIES 0x400 + +/* Flags to prefer IPv6 or IPv4 when doing DNS lookup. (If both are set, + * AF_UNSPEC is used.) */ +#define REDIS_PREFER_IPV4 0x800 +#define REDIS_PREFER_IPV6 0x1000 + +#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */ + +/* number of times we retry to connect in the case of EADDRNOTAVAIL and + * SO_REUSEADDR is being used. */ +#define REDIS_CONNECT_RETRIES 10 + +/* Forward declarations for structs defined elsewhere */ +struct redisAsyncContext; +struct redisContext; + +/* RESP3 push helpers and callback prototypes */ +#define redisIsPushReply(r) (((redisReply*)(r))->type == REDIS_REPLY_PUSH) +typedef void (redisPushFn)(void *, void *); +typedef void (redisAsyncPushFn)(struct redisAsyncContext *, void *); + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is the reply object returned by redisCommand() */ +typedef struct redisReply { + int type; /* REDIS_REPLY_* */ + long long integer; /* The integer when type is REDIS_REPLY_INTEGER */ + double dval; /* The double when type is REDIS_REPLY_DOUBLE */ + size_t len; /* Length of string */ + char *str; /* Used for REDIS_REPLY_ERROR, REDIS_REPLY_STRING + REDIS_REPLY_VERB, REDIS_REPLY_DOUBLE (in additional to dval), + and REDIS_REPLY_BIGNUM. */ + char vtype[4]; /* Used for REDIS_REPLY_VERB, contains the null + terminated 3 character content type, such as "txt". */ + size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */ + struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */ +} redisReply; + +redisReader *redisReaderCreate(void); + +/* Function to free the reply objects hiredis returns by default. */ +void freeReplyObject(void *reply); + +/* Functions to format a command according to the protocol. */ +int redisvFormatCommand(char **target, const char *format, va_list ap); +int redisFormatCommand(char **target, const char *format, ...); +long long redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen); +long long redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen); +void redisFreeCommand(char *cmd); +void redisFreeSdsCommand(sds cmd); + +enum redisConnectionType { + REDIS_CONN_TCP, + REDIS_CONN_UNIX, + REDIS_CONN_USERFD +}; + +struct redisSsl; + +#define REDIS_OPT_NONBLOCK 0x01 +#define REDIS_OPT_REUSEADDR 0x02 +#define REDIS_OPT_PREFER_IPV4 0x04 +#define REDIS_OPT_PREFER_IPV6 0x08 +#define REDIS_OPT_PREFER_IP_UNSPEC (REDIS_OPT_PREFER_IPV4 | REDIS_OPT_PREFER_IPV6) + +/** + * Don't automatically free the async object on a connection failure, + * or other implicit conditions. Only free on an explicit call to disconnect() or free() + */ +#define REDIS_OPT_NOAUTOFREE 0x04 + +/* Don't automatically intercept and free RESP3 PUSH replies. */ +#define REDIS_OPT_NO_PUSH_AUTOFREE 0x08 + +/** + * Don't automatically free replies + */ +#define REDIS_OPT_NOAUTOFREEREPLIES 0x10 + +/* In Unix systems a file descriptor is a regular signed int, with -1 + * representing an invalid descriptor. In Windows it is a SOCKET + * (32- or 64-bit unsigned integer depending on the architecture), where + * all bits set (~0) is INVALID_SOCKET. */ +#ifndef _WIN32 +typedef int redisFD; +#define REDIS_INVALID_FD -1 +#else +#ifdef _WIN64 +typedef unsigned long long redisFD; /* SOCKET = 64-bit UINT_PTR */ +#else +typedef unsigned long redisFD; /* SOCKET = 32-bit UINT_PTR */ +#endif +#define REDIS_INVALID_FD ((redisFD)(~0)) /* INVALID_SOCKET */ +#endif + +typedef struct { + /* + * the type of connection to use. This also indicates which + * `endpoint` member field to use + */ + int type; + /* bit field of REDIS_OPT_xxx */ + int options; + /* timeout value for connect operation. If NULL, no timeout is used */ + const struct timeval *connect_timeout; + /* timeout value for commands. If NULL, no timeout is used. This can be + * updated at runtime with redisSetTimeout/redisAsyncSetTimeout. */ + const struct timeval *command_timeout; + union { + /** use this field for tcp/ip connections */ + struct { + const char *source_addr; + const char *ip; + int port; + } tcp; + /** use this field for unix domain sockets */ + const char *unix_socket; + /** + * use this field to have hiredis operate an already-open + * file descriptor */ + redisFD fd; + } endpoint; + + /* Optional user defined data/destructor */ + void *privdata; + void (*free_privdata)(void *); + + /* A user defined PUSH message callback */ + redisPushFn *push_cb; + redisAsyncPushFn *async_push_cb; +} redisOptions; + +/** + * Helper macros to initialize options to their specified fields. + */ +#define REDIS_OPTIONS_SET_TCP(opts, ip_, port_) do { \ + (opts)->type = REDIS_CONN_TCP; \ + (opts)->endpoint.tcp.ip = ip_; \ + (opts)->endpoint.tcp.port = port_; \ + } while(0) + +#define REDIS_OPTIONS_SET_UNIX(opts, path) do { \ + (opts)->type = REDIS_CONN_UNIX; \ + (opts)->endpoint.unix_socket = path; \ + } while(0) + +#define REDIS_OPTIONS_SET_PRIVDATA(opts, data, dtor) do { \ + (opts)->privdata = data; \ + (opts)->free_privdata = dtor; \ + } while(0) + +typedef struct redisContextFuncs { + void (*close)(struct redisContext *); + void (*free_privctx)(void *); + void (*async_read)(struct redisAsyncContext *); + void (*async_write)(struct redisAsyncContext *); + + /* Read/Write data to the underlying communication stream, returning the + * number of bytes read/written. In the event of an unrecoverable error + * these functions shall return a value < 0. In the event of a + * recoverable error, they should return 0. */ + ssize_t (*read)(struct redisContext *, char *, size_t); + ssize_t (*write)(struct redisContext *); +} redisContextFuncs; + + +/* Context for a connection to Redis */ +typedef struct redisContext { + const redisContextFuncs *funcs; /* Function table */ + + int err; /* Error flags, 0 when there is no error */ + char errstr[128]; /* String representation of error when applicable */ + redisFD fd; + int flags; + char *obuf; /* Write buffer */ + redisReader *reader; /* Protocol reader */ + + enum redisConnectionType connection_type; + struct timeval *connect_timeout; + struct timeval *command_timeout; + + struct { + char *host; + char *source_addr; + int port; + } tcp; + + struct { + char *path; + } unix_sock; + + /* For non-blocking connect */ + struct sockaddr *saddr; + size_t addrlen; + + /* Optional data and corresponding destructor users can use to provide + * context to a given redisContext. Not used by hiredis. */ + void *privdata; + void (*free_privdata)(void *); + + /* Internal context pointer presently used by hiredis to manage + * SSL connections. */ + void *privctx; + + /* An optional RESP3 PUSH handler */ + redisPushFn *push_cb; +} redisContext; + +redisContext *redisConnectWithOptions(const redisOptions *options); +redisContext *redisConnect(const char *ip, int port); +redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv); +redisContext *redisConnectNonBlock(const char *ip, int port); +redisContext *redisConnectBindNonBlock(const char *ip, int port, + const char *source_addr); +redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port, + const char *source_addr); +redisContext *redisConnectUnix(const char *path); +redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv); +redisContext *redisConnectUnixNonBlock(const char *path); +redisContext *redisConnectFd(redisFD fd); + +/** + * Reconnect the given context using the saved information. + * + * This re-uses the exact same connect options as in the initial connection. + * host, ip (or path), timeout and bind address are reused, + * flags are used unmodified from the existing context. + * + * Returns REDIS_OK on successful connect or REDIS_ERR otherwise. + */ +int redisReconnect(redisContext *c); + +redisPushFn *redisSetPushCallback(redisContext *c, redisPushFn *fn); +int redisSetTimeout(redisContext *c, const struct timeval tv); +int redisEnableKeepAlive(redisContext *c); +void redisFree(redisContext *c); +redisFD redisFreeKeepFd(redisContext *c); +int redisBufferRead(redisContext *c); +int redisBufferWrite(redisContext *c, int *done); + +/* In a blocking context, this function first checks if there are unconsumed + * replies to return and returns one if so. Otherwise, it flushes the output + * buffer to the socket and reads until it has a reply. In a non-blocking + * context, it will return unconsumed replies until there are no more. */ +int redisGetReply(redisContext *c, void **reply); +int redisGetReplyFromReader(redisContext *c, void **reply); + +/* Write a formatted command to the output buffer. Use these functions in blocking mode + * to get a pipeline of commands. */ +int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len); + +/* Write a command to the output buffer. Use these functions in blocking mode + * to get a pipeline of commands. */ +int redisvAppendCommand(redisContext *c, const char *format, va_list ap); +int redisAppendCommand(redisContext *c, const char *format, ...); +int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); + +/* Issue a command to Redis. In a blocking context, it is identical to calling + * redisAppendCommand, followed by redisGetReply. The function will return + * NULL if there was an error in performing the request, otherwise it will + * return the reply. In a non-blocking context, it is identical to calling + * only redisAppendCommand and will always return NULL. */ +void *redisvCommand(redisContext *c, const char *format, va_list ap); +void *redisCommand(redisContext *c, const char *format, ...); +void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/hiredis_ssl.h b/include/hiredis_ssl.h new file mode 100644 index 0000000..cef8893 --- /dev/null +++ b/include/hiredis_ssl.h @@ -0,0 +1,163 @@ + +/* + * Copyright (c) 2019, Redis Labs + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_SSL_H +#define __HIREDIS_SSL_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is the underlying struct for SSL in ssl.h, which is not included to + * keep build dependencies short here. + */ +struct ssl_st; + +/* A wrapper around OpenSSL SSL_CTX to allow easy SSL use without directly + * calling OpenSSL. + */ +typedef struct redisSSLContext redisSSLContext; + +/** + * Initialization errors that redisCreateSSLContext() may return. + */ + +typedef enum { + REDIS_SSL_CTX_NONE = 0, /* No Error */ + REDIS_SSL_CTX_CREATE_FAILED, /* Failed to create OpenSSL SSL_CTX */ + REDIS_SSL_CTX_CERT_KEY_REQUIRED, /* Client cert and key must both be specified or skipped */ + REDIS_SSL_CTX_CA_CERT_LOAD_FAILED, /* Failed to load CA Certificate or CA Path */ + REDIS_SSL_CTX_CLIENT_CERT_LOAD_FAILED, /* Failed to load client certificate */ + REDIS_SSL_CTX_CLIENT_DEFAULT_CERT_FAILED, /* Failed to set client default certificate directory */ + REDIS_SSL_CTX_PRIVATE_KEY_LOAD_FAILED, /* Failed to load private key */ + REDIS_SSL_CTX_OS_CERTSTORE_OPEN_FAILED, /* Failed to open system certifcate store */ + REDIS_SSL_CTX_OS_CERT_ADD_FAILED /* Failed to add CA certificates obtained from system to the SSL context */ +} redisSSLContextError; + +/* Constants that mirror OpenSSL's verify modes. By default, + * REDIS_SSL_VERIFY_PEER is used with redisCreateSSLContext(). + * Some Redis clients disable peer verification if there are no + * certificates specified. + */ +#define REDIS_SSL_VERIFY_NONE 0x00 +#define REDIS_SSL_VERIFY_PEER 0x01 +#define REDIS_SSL_VERIFY_FAIL_IF_NO_PEER_CERT 0x02 +#define REDIS_SSL_VERIFY_CLIENT_ONCE 0x04 +#define REDIS_SSL_VERIFY_POST_HANDSHAKE 0x08 + +/* Options to create an OpenSSL context. */ +typedef struct { + const char *cacert_filename; + const char *capath; + const char *cert_filename; + const char *private_key_filename; + const char *server_name; + int verify_mode; +} redisSSLOptions; + +/** + * Return the error message corresponding with the specified error code. + */ + +const char *redisSSLContextGetError(redisSSLContextError error); + +/** + * Helper function to initialize the OpenSSL library. + * + * OpenSSL requires one-time initialization before it can be used. Callers should + * call this function only once, and only if OpenSSL is not directly initialized + * elsewhere. + */ +int redisInitOpenSSL(void); + +/** + * Helper function to initialize an OpenSSL context that can be used + * to initiate SSL connections. + * + * cacert_filename is an optional name of a CA certificate/bundle file to load + * and use for validation. + * + * capath is an optional directory path where trusted CA certificate files are + * stored in an OpenSSL-compatible structure. + * + * cert_filename and private_key_filename are optional names of a client side + * certificate and private key files to use for authentication. They need to + * be both specified or omitted. + * + * server_name is an optional and will be used as a server name indication + * (SNI) TLS extension. + * + * If error is non-null, it will be populated in case the context creation fails + * (returning a NULL). + */ + +redisSSLContext *redisCreateSSLContext(const char *cacert_filename, const char *capath, + const char *cert_filename, const char *private_key_filename, + const char *server_name, redisSSLContextError *error); + +/** + * Helper function to initialize an OpenSSL context that can be used + * to initiate SSL connections. This is a more extensible version of redisCreateSSLContext(). + * + * options contains a structure of SSL options to use. + * + * If error is non-null, it will be populated in case the context creation fails + * (returning a NULL). +*/ +redisSSLContext *redisCreateSSLContextWithOptions(redisSSLOptions *options, + redisSSLContextError *error); + +/** + * Free a previously created OpenSSL context. + */ +void redisFreeSSLContext(redisSSLContext *redis_ssl_ctx); + +/** + * Initiate SSL on an existing redisContext. + * + * This is similar to redisInitiateSSL() but does not require the caller + * to directly interact with OpenSSL, and instead uses a redisSSLContext + * previously created using redisCreateSSLContext(). + */ + +int redisInitiateSSLWithContext(redisContext *c, redisSSLContext *redis_ssl_ctx); + +/** + * Initiate SSL/TLS negotiation on a provided OpenSSL SSL object. + */ + +int redisInitiateSSL(redisContext *c, struct ssl_st *ssl); + +#ifdef __cplusplus +} +#endif + +#endif /* __HIREDIS_SSL_H */ diff --git a/include/net.h b/include/net.h new file mode 100644 index 0000000..9f43283 --- /dev/null +++ b/include/net.h @@ -0,0 +1,56 @@ +/* Extracted from anet.c to work properly with Hiredis error reporting. + * + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2014, Pieter Noordhuis + * Copyright (c) 2015, Matt Stancliff , + * Jan-Erik Rediger + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __NET_H +#define __NET_H + +#include "hiredis.h" + +void redisNetClose(redisContext *c); +ssize_t redisNetRead(redisContext *c, char *buf, size_t bufcap); +ssize_t redisNetWrite(redisContext *c); + +int redisCheckSocketError(redisContext *c); +int redisContextSetTimeout(redisContext *c, const struct timeval tv); +int redisContextConnectTcp(redisContext *c, const char *addr, int port, const struct timeval *timeout); +int redisContextConnectBindTcp(redisContext *c, const char *addr, int port, + const struct timeval *timeout, + const char *source_addr); +int redisContextConnectUnix(redisContext *c, const char *path, const struct timeval *timeout); +int redisKeepAlive(redisContext *c, int interval); +int redisCheckConnectDone(redisContext *c, int *completed); + +int redisSetTcpNoDelay(redisContext *c); + +#endif diff --git a/include/read.h b/include/read.h new file mode 100644 index 0000000..2d74d77 --- /dev/null +++ b/include/read.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +#ifndef __HIREDIS_READ_H +#define __HIREDIS_READ_H +#include /* for size_t */ + +#define REDIS_ERR -1 +#define REDIS_OK 0 + +/* When an error occurs, the err flag in a context is set to hold the type of + * error that occurred. REDIS_ERR_IO means there was an I/O error and you + * should use the "errno" variable to find out what is wrong. + * For other values, the "errstr" field will hold a description. */ +#define REDIS_ERR_IO 1 /* Error in read or write */ +#define REDIS_ERR_EOF 3 /* End of file */ +#define REDIS_ERR_PROTOCOL 4 /* Protocol error */ +#define REDIS_ERR_OOM 5 /* Out of memory */ +#define REDIS_ERR_TIMEOUT 6 /* Timed out */ +#define REDIS_ERR_OTHER 2 /* Everything else... */ + +#define REDIS_REPLY_STRING 1 +#define REDIS_REPLY_ARRAY 2 +#define REDIS_REPLY_INTEGER 3 +#define REDIS_REPLY_NIL 4 +#define REDIS_REPLY_STATUS 5 +#define REDIS_REPLY_ERROR 6 +#define REDIS_REPLY_DOUBLE 7 +#define REDIS_REPLY_BOOL 8 +#define REDIS_REPLY_MAP 9 +#define REDIS_REPLY_SET 10 +#define REDIS_REPLY_ATTR 11 +#define REDIS_REPLY_PUSH 12 +#define REDIS_REPLY_BIGNUM 13 +#define REDIS_REPLY_VERB 14 + +/* Default max unused reader buffer. */ +#define REDIS_READER_MAX_BUF (1024*16) + +/* Default multi-bulk element limit */ +#define REDIS_READER_MAX_ARRAY_ELEMENTS ((1LL<<32) - 1) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct redisReadTask { + int type; + long long elements; /* number of elements in multibulk container */ + int idx; /* index in parent (array) object */ + void *obj; /* holds user-generated value for a read task */ + struct redisReadTask *parent; /* parent task */ + void *privdata; /* user-settable arbitrary field */ +} redisReadTask; + +typedef struct redisReplyObjectFunctions { + void *(*createString)(const redisReadTask*, char*, size_t); + void *(*createArray)(const redisReadTask*, size_t); + void *(*createInteger)(const redisReadTask*, long long); + void *(*createDouble)(const redisReadTask*, double, char*, size_t); + void *(*createNil)(const redisReadTask*); + void *(*createBool)(const redisReadTask*, int); + void (*freeObject)(void*); +} redisReplyObjectFunctions; + +typedef struct redisReader { + int err; /* Error flags, 0 when there is no error */ + char errstr[128]; /* String representation of error when applicable */ + + char *buf; /* Read buffer */ + size_t pos; /* Buffer cursor */ + size_t len; /* Buffer length */ + size_t maxbuf; /* Max length of unused buffer */ + long long maxelements; /* Max multi-bulk elements */ + + redisReadTask **task; + int tasks; + + int ridx; /* Index of current read task */ + void *reply; /* Temporary reply pointer */ + + redisReplyObjectFunctions *fn; + void *privdata; +} redisReader; + +/* Public API for the protocol parser. */ +redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn); +void redisReaderFree(redisReader *r); +int redisReaderFeed(redisReader *r, const char *buf, size_t len); +int redisReaderGetReply(redisReader *r, void **reply); + +#define redisReaderSetPrivdata(_r, _p) (int)(((redisReader*)(_r))->privdata = (_p)) +#define redisReaderGetObject(_r) (((redisReader*)(_r))->reply) +#define redisReaderGetError(_r) (((redisReader*)(_r))->errstr) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/sds.h b/include/sds.h new file mode 100644 index 0000000..d9b6761 --- /dev/null +++ b/include/sds.h @@ -0,0 +1,280 @@ +/* SDSLib 2.0 -- A C dynamic strings library + * + * Copyright (c) 2006-2015, Salvatore Sanfilippo + * Copyright (c) 2015, Oran Agra + * Copyright (c) 2015, Redis Labs, Inc + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __SDS_H +#define __SDS_H + +#define SDS_MAX_PREALLOC (1024*1024) +#ifdef _MSC_VER +typedef long long ssize_t; +#define SSIZE_MAX (LLONG_MAX >> 1) +#ifndef __clang__ +#define __attribute__(x) +#endif +#endif + +#include +#include +#include + +typedef char *sds; + +/* Note: sdshdr5 is never used, we just access the flags byte directly. + * However is here to document the layout of type 5 SDS strings. */ +struct __attribute__ ((__packed__)) sdshdr5 { + unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr8 { + uint8_t len; /* used */ + uint8_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr16 { + uint16_t len; /* used */ + uint16_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr32 { + uint32_t len; /* used */ + uint32_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr64 { + uint64_t len; /* used */ + uint64_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; + +#define SDS_TYPE_5 0 +#define SDS_TYPE_8 1 +#define SDS_TYPE_16 2 +#define SDS_TYPE_32 3 +#define SDS_TYPE_64 4 +#define SDS_TYPE_MASK 7 +#define SDS_TYPE_BITS 3 +#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))); +#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)))) +#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS) + +static inline size_t sdslen(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + return SDS_TYPE_5_LEN(flags); + case SDS_TYPE_8: + return SDS_HDR(8,s)->len; + case SDS_TYPE_16: + return SDS_HDR(16,s)->len; + case SDS_TYPE_32: + return SDS_HDR(32,s)->len; + case SDS_TYPE_64: + return SDS_HDR(64,s)->len; + } + return 0; +} + +static inline size_t sdsavail(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: { + return 0; + } + case SDS_TYPE_8: { + SDS_HDR_VAR(8,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_16: { + SDS_HDR_VAR(16,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_32: { + SDS_HDR_VAR(32,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_64: { + SDS_HDR_VAR(64,s); + return sh->alloc - sh->len; + } + } + return 0; +} + +static inline void sdssetlen(sds s, size_t newlen) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + { + unsigned char *fp = ((unsigned char*)s)-1; + *fp = (unsigned char)(SDS_TYPE_5 | (newlen << SDS_TYPE_BITS)); + } + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->len = (uint8_t)newlen; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->len = (uint16_t)newlen; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->len = (uint32_t)newlen; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->len = (uint64_t)newlen; + break; + } +} + +static inline void sdsinclen(sds s, size_t inc) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + { + unsigned char *fp = ((unsigned char*)s)-1; + unsigned char newlen = SDS_TYPE_5_LEN(flags)+(unsigned char)inc; + *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS); + } + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->len += (uint8_t)inc; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->len += (uint16_t)inc; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->len += (uint32_t)inc; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->len += (uint64_t)inc; + break; + } +} + +/* sdsalloc() = sdsavail() + sdslen() */ +static inline size_t sdsalloc(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + return SDS_TYPE_5_LEN(flags); + case SDS_TYPE_8: + return SDS_HDR(8,s)->alloc; + case SDS_TYPE_16: + return SDS_HDR(16,s)->alloc; + case SDS_TYPE_32: + return SDS_HDR(32,s)->alloc; + case SDS_TYPE_64: + return SDS_HDR(64,s)->alloc; + } + return 0; +} + +static inline void sdssetalloc(sds s, size_t newlen) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + /* Nothing to do, this type has no total allocation info. */ + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->alloc = (uint8_t)newlen; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->alloc = (uint16_t)newlen; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->alloc = (uint32_t)newlen; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->alloc = (uint64_t)newlen; + break; + } +} + +sds sdsnewlen(const void *init, size_t initlen); +sds sdsnew(const char *init); +sds sdsempty(void); +sds sdsdup(const sds s); +void sdsfree(sds s); +sds sdsgrowzero(sds s, size_t len); +sds sdscatlen(sds s, const void *t, size_t len); +sds sdscat(sds s, const char *t); +sds sdscatsds(sds s, const sds t); +sds sdscpylen(sds s, const char *t, size_t len); +sds sdscpy(sds s, const char *t); + +sds sdscatvprintf(sds s, const char *fmt, va_list ap); +#ifdef __GNUC__ +sds sdscatprintf(sds s, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); +#else +sds sdscatprintf(sds s, const char *fmt, ...); +#endif + +sds sdscatfmt(sds s, char const *fmt, ...); +sds sdstrim(sds s, const char *cset); +int sdsrange(sds s, ssize_t start, ssize_t end); +void sdsupdatelen(sds s); +void sdsclear(sds s); +int sdscmp(const sds s1, const sds s2); +sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count); +void sdsfreesplitres(sds *tokens, int count); +void sdstolower(sds s); +void sdstoupper(sds s); +sds sdsfromlonglong(long long value); +sds sdscatrepr(sds s, const char *p, size_t len); +sds *sdssplitargs(const char *line, int *argc); +sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen); +sds sdsjoin(char **argv, int argc, char *sep); +sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen); + +/* Low level functions exposed to the user API */ +sds sdsMakeRoomFor(sds s, size_t addlen); +void sdsIncrLen(sds s, int incr); +sds sdsRemoveFreeSpace(sds s); +size_t sdsAllocSize(sds s); +void *sdsAllocPtr(sds s); + +/* Export the allocator used by SDS to the program using SDS. + * Sometimes the program SDS is linked to, may use a different set of + * allocators, but may want to allocate or free things that SDS will + * respectively free or allocate. */ +void *sds_malloc(size_t size); +void *sds_realloc(void *ptr, size_t size); +void sds_free(void *ptr); + +#ifdef REDIS_TEST +int sdsTest(int argc, char *argv[]); +#endif + +#endif diff --git a/include/sdsalloc.h b/include/sdsalloc.h new file mode 100644 index 0000000..5538dd9 --- /dev/null +++ b/include/sdsalloc.h @@ -0,0 +1,44 @@ +/* SDSLib 2.0 -- A C dynamic strings library + * + * Copyright (c) 2006-2015, Salvatore Sanfilippo + * Copyright (c) 2015, Oran Agra + * Copyright (c) 2015, Redis Labs, Inc + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/* SDS allocator selection. + * + * This file is used in order to change the SDS allocator at compile time. + * Just define the following defines to what you want to use. Also add + * the include of your alternate allocator if needed (not needed in order + * to use the default libc allocator). */ + +#include "alloc.h" + +#define s_malloc hi_malloc +#define s_realloc hi_realloc +#define s_free hi_free diff --git a/include/sockcompat.h b/include/sockcompat.h new file mode 100644 index 0000000..6ca5d9f --- /dev/null +++ b/include/sockcompat.h @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2019, Marcus Geelnard + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __SOCKCOMPAT_H +#define __SOCKCOMPAT_H + +#ifndef _WIN32 +/* For POSIX systems we use the standard BSD socket API. */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else +/* For Windows we use winsock. */ +#undef _WIN32_WINNT +#define _WIN32_WINNT 0x0600 /* To get WSAPoll etc. */ +#include +#include +#include +#include +#include + +#ifdef _MSC_VER +typedef long long ssize_t; +#endif + +/* Emulate the parts of the BSD socket API that we need (override the winsock signatures). */ +int win32_getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); +const char *win32_gai_strerror(int errcode); +void win32_freeaddrinfo(struct addrinfo *res); +SOCKET win32_socket(int domain, int type, int protocol); +int win32_ioctl(SOCKET fd, unsigned long request, unsigned long *argp); +int win32_bind(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen); +int win32_connect(SOCKET sockfd, const struct sockaddr *addr, socklen_t addrlen); +int win32_getsockopt(SOCKET sockfd, int level, int optname, void *optval, socklen_t *optlen); +int win32_setsockopt(SOCKET sockfd, int level, int optname, const void *optval, socklen_t optlen); +int win32_close(SOCKET fd); +ssize_t win32_recv(SOCKET sockfd, void *buf, size_t len, int flags); +ssize_t win32_send(SOCKET sockfd, const void *buf, size_t len, int flags); +typedef ULONG nfds_t; +int win32_poll(struct pollfd *fds, nfds_t nfds, int timeout); + +int win32_redisKeepAlive(SOCKET sockfd, int interval_ms); + +#ifndef REDIS_SOCKCOMPAT_IMPLEMENTATION +#define getaddrinfo(node, service, hints, res) win32_getaddrinfo(node, service, hints, res) +#undef gai_strerror +#define gai_strerror(errcode) win32_gai_strerror(errcode) +#define freeaddrinfo(res) win32_freeaddrinfo(res) +#define socket(domain, type, protocol) win32_socket(domain, type, protocol) +#define ioctl(fd, request, argp) win32_ioctl(fd, request, argp) +#define bind(sockfd, addr, addrlen) win32_bind(sockfd, addr, addrlen) +#define connect(sockfd, addr, addrlen) win32_connect(sockfd, addr, addrlen) +#define getsockopt(sockfd, level, optname, optval, optlen) win32_getsockopt(sockfd, level, optname, optval, optlen) +#define setsockopt(sockfd, level, optname, optval, optlen) win32_setsockopt(sockfd, level, optname, optval, optlen) +#define close(fd) win32_close(fd) +#define recv(sockfd, buf, len, flags) win32_recv(sockfd, buf, len, flags) +#define send(sockfd, buf, len, flags) win32_send(sockfd, buf, len, flags) +#define poll(fds, nfds, timeout) win32_poll(fds, nfds, timeout) +#endif /* REDIS_SOCKCOMPAT_IMPLEMENTATION */ +#endif /* _WIN32 */ + +#endif /* __SOCKCOMPAT_H */ diff --git a/include/win32.h b/include/win32.h new file mode 100644 index 0000000..04289c6 --- /dev/null +++ b/include/win32.h @@ -0,0 +1,56 @@ +#ifndef _WIN32_HELPER_INCLUDE +#define _WIN32_HELPER_INCLUDE +#ifdef _MSC_VER + +#include /* for struct timeval */ + +#ifndef inline +#define inline __inline +#endif + +#ifndef strcasecmp +#define strcasecmp stricmp +#endif + +#ifndef strncasecmp +#define strncasecmp strnicmp +#endif + +#ifndef va_copy +#define va_copy(d,s) ((d) = (s)) +#endif + +#ifndef snprintf +#define snprintf c99_snprintf + +__inline int c99_vsnprintf(char* str, size_t size, const char* format, va_list ap) +{ + int count = -1; + + if (size != 0) + count = _vsnprintf_s(str, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + + return count; +} + +__inline int c99_snprintf(char* str, size_t size, const char* format, ...) +{ + int count; + va_list ap; + + va_start(ap, format); + count = c99_vsnprintf(str, size, format, ap); + va_end(ap); + + return count; +} +#endif +#endif /* _MSC_VER */ + +#ifdef _WIN32 +#define strerror_r(errno,buf,len) strerror_s(buf,len,errno) +#endif /* _WIN32 */ + +#endif /* _WIN32_HELPER_INCLUDE */ diff --git a/lib/.json_module.F90.cflags.heritage b/lib/.json_module.F90.cflags.heritage new file mode 100644 index 0000000..346c076 --- /dev/null +++ b/lib/.json_module.F90.cflags.heritage @@ -0,0 +1 @@ +-c -O2 -warn -stand f08 -diag-disable 7601 -diag-disable 4013 -diag-disable 5142 -traceback \ No newline at end of file diff --git a/lib/json_file_module.mod b/lib/json_file_module.mod new file mode 100644 index 0000000000000000000000000000000000000000..f00a81c2539eccf61a343652b17be159415a9283 GIT binary patch literal 223440 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 literal 0 HcmV?d00001 diff --git a/lib/json_file_module.o b/lib/json_file_module.o new file mode 100644 index 0000000000000000000000000000000000000000..45768c51b5a31cd991a49a60932eb6c34b05081f GIT binary patch literal 651000 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 literal 0 HcmV?d00001 diff --git a/lib/json_kinds.mod b/lib/json_kinds.mod new file mode 100644 index 0000000000000000000000000000000000000000..460b9afb1e61b12ea0e752c446e3410daf3bf13d GIT binary patch literal 2229 zcmcIl&2AGh5T0%Lr--UWg#%I}g^;R1SW*s+M5X3un{GEvs!fRKX$6EzP$>i=o`4sC z8%G|112=A{5)zMq#6xi70rZmZdd z0>4ph(ODA-5>YMmO7-;ug#q~iRjL8iAp*0ggi6L%$oQNLAa!yn6N3{cEs$eCwq#-? zY|^5dQv)ZrU=+fgGR&E_SK5pA+aaZZ$aK805+{?X?0A(R>Xhn!Rb_e2 zP(hp`dPh}>a;WE#cvQrItcYuYITAue`3G0r+pkj$?zS=>CMxJ|x`7}K?| zan#w-7b6kT=rWbT^JyZF^~xkjtTnaozrpYdOx*N4J8nWtSbB!cV_2Y6KP(mAyLR1ye!Fj0eEJn71T1182aF=ArWaPekR3)G+pB;6kHBnLmhfARzL z=x_K1ILTBEac{|(L>D$G1Gv_!i@N(b`91RRR$)&(kt_MX}1$dUDq2GTR zcBN>Z)J*87idm0pEWz*JYy`l?U)FL_k+ob{&Z2Rbl{tKV4quqz%g9uW{Rx}vvs8Uo zxKy2x-BbXuht9ZM%ojemnZ)mKjEvrA4f}d!@RUA{RX|3aW2?Q`^J0>1#Qd*wriJXu zIEsTdh{V1Q6z&Fb0HQ4=h&UX_Acmtj6qmPmM=}mNeGp;Ke~f}bi18@spozklz+e@e zhW5DJ^d6HVf$kvj+NWrpQ*55;h0QuDv!=!49e1srslK^35E!GKgdW)YVXM!rCvc1T zZL}1#&(N?7alY0wgne|VPmAggP)nukN%y$Eo-<5Q%f^SuW_=BW!G$5jEPD801kctN;v4rME`&{ zkDk4F^XS=&R}*jEz4`-u-g$T0o!vsZ8l3Lzd_D6%?>n4oV6HTji25oN`j^+j}Uoy#3q6ZqZzDy6y)>mHfk7tv~KdNe9ai8fJtKKnrQ_w)PO z^RX#ND#oVo`oSGv8h+FBq!ujJ>~cfuRv21$rRoJsPT7huj^D7C>`+ERTX$E2<|0;2 zS+6%j$6r!x(JRko{xy~GOQimGr2T57Z%BVA%2wzS9#wT*!lSC5OL$bZ>=GWSR!~Pi zYEX<&zO#$Qh;9gBZj`q?o^rffu}-~tZI2`Hd{)8%HL-U>S(%P&b6E)`i2q0^OOz&5 z$0@d?Iwrlex}7yZ`L_3gZ$x`!mU5iaeEiAeV(}&8(pCz)2Dl5MT#vmICW&XV5)La@ zdnc58O2k!UnB|Mff!ro8eE_--9BcZ+sb&S`tMks#tzNB(5X*#0o zSqV?<5n;ER^q&bw_aN+c4r51C&Ag!_l%-N{IXbaDjBotOjD+#IJaz7ZGQfZEB_SH) zJ282B04fRalqz!CPw9-k$8$*v(Ow^bnM7vG>l^3SH|Q*CUy;X^D|8XCJcPq4N=|C~H9*V#KXXO%9smFU literal 0 HcmV?d00001 diff --git a/lib/json_module.o b/lib/json_module.o new file mode 100644 index 0000000000000000000000000000000000000000..c528203b70a0d8b72ebadd32cca83e865f016dda GIT binary patch literal 2104 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 literal 0 HcmV?d00001 diff --git a/lib/json_string_utilities.o b/lib/json_string_utilities.o new file mode 100644 index 0000000000000000000000000000000000000000..ea8f06eeee1fb978edafed2f12dccc9650d31450 GIT binary patch literal 45392 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 literal 0 HcmV?d00001 diff --git a/lib/json_value_module.o b/lib/json_value_module.o new file mode 100644 index 0000000000000000000000000000000000000000..f30f87f83dde9ecc09e2059ed8af847cdae3c8dc GIT binary patch literal 350640 zcmeEv3w&Hvwf9LI+CY#ALLoeqfdr_cn0HcxI@4y#8JK|pEfy4$kft<}CLx_bK^`ed zw8xP$!x<)^)w^#Ars_0ECk13R<1%yz16a)zmu_1^l)V6xneE+rf+B0+ZoJmsf z^1J*#=htRt{%7sA*Is+=wby>mEuqNbSvfhgEqUcwAGLDym$diJrH3WI1^83II@&tY zvOc}KqrKtUrnc^uhE*NQyW3jMUc8{h18vB}8dh~SEN@vI>*~0^f!Q>7bhR{CD>}Lw zRR!e5rRG_|#LG&kUHLwiT(@>p9-yF6IY)ZG?qXl-wed9!bCTGi6fa!q$r zTZ7fmaLJO3BjF|W!A0jcR8&_ni{?(`KSf$RZEe45wdTQMDy*S9*4ow@Yi(IgP*zG_-Dw;KspIjeN{_LR~8KFs@TfahK*E~ zmr|~!Zdod-7AVW%5O6sL@WCCkqRzw-Kq&ZgMPX)8d}71uXh8oZcTmwQ{)bzMzjlOFuN+Ci+Np}W0x zDgjnCp-HWQ1&|?RFHbrd#Ju>zkCT{{GfxqUgrcDfmZ(&QHC1?`<%g1kR^bc<(&Q