Simulation Core
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1354 lines
47 KiB

  1. module CManifolds
  2. ! use CStack
  3. ! use CArrangement
  4. use SimulationVariables
  5. use ManifoldVariables
  6. implicit none
  7. contains
  8. subroutine ManifoldToJson(parent)
  9. type(json_value),pointer :: parent
  10. type(json_value),pointer :: p
  11. type(json_core) :: json
  12. logical :: valve_states(ValveCount)
  13. integer :: i
  14. ! 1. create new node
  15. call json%create_object(p,'Manifold')
  16. ! 2. add member of data type to new node
  17. DO I=1,ValveCount
  18. valve_states(i) = data%state%Manifold%Valve(i)%Status
  19. ENDDO
  20. call json%add(p, "valves", valve_states)
  21. ! 3. add new node to parent
  22. call json%add(parent,p)
  23. end subroutine
  24. subroutine PathFinding_Setup()
  25. ! use CSimulationVariables
  26. implicit none
  27. data%state%manifold%IsTraverse = .false.
  28. call Setup()
  29. !call OnSimulationInitialization%Add(PathFinding_Init)
  30. !call OnSimulationStop%Add(PathFinding_Init)
  31. !!**call OnpPathFindingStep%Add(PathFinding_Step)
  32. !!**call OnpPathFindingOutput%Add(PathFinding_Output)
  33. ! !**call OnpPathFindingMain%Add(PathFindingMainBody)
  34. end subroutine
  35. subroutine PathFinding_Init
  36. implicit none
  37. data%state%manifold%IsTraverse = .false.
  38. call Setup()
  39. end subroutine PathFinding_Init
  40. subroutine PathFinding_Step
  41. if (data%state%manifold%IsPathsDirty) then
  42. data%state%manifold%IsPathsDirty = .false.
  43. call Traverse()
  44. endif
  45. end subroutine PathFinding_Step
  46. ! subroutine PathFinding_Output
  47. ! implicit none
  48. ! end subroutine PathFinding_Output
  49. ! subroutine PathFindingMainBody
  50. ! ! use CSimulationVariables
  51. ! implicit none
  52. ! loop : do
  53. ! if(IsStopped) call Quit()
  54. ! call sleepqq(50)
  55. ! if (Manifold%IsPathsDirty) then
  56. ! Manifold%IsPathsDirty = .false.
  57. ! call Traverse()
  58. ! endif
  59. ! end do loop
  60. ! end subroutine PathFindingMainBody
  61. subroutine Traverse() bind(C,name="Traverse")
  62. use CLog5
  63. implicit none
  64. integer :: i, Duration
  65. integer, dimension(8) :: StartTime,EndTime !TODO: clean up
  66. call DATE_AND_TIME(values=StartTime) !TODO: clean up
  67. !**call BeforeTraverse%RunAll()
  68. if(allocated(data%state%manifold%OpenPaths)) deallocate(data%state%manifold%OpenPaths)
  69. do i=MinSource, MaxSource
  70. if(IsValveOpen(i)) then
  71. call AddRootNode(i)
  72. call AddChildren(data%state%manifold%Valve(i))
  73. endif
  74. enddo
  75. call PostProcess(data%state%manifold%OpenPaths)
  76. !**call AfterTraverse%RunAll()
  77. data%state%manifold%IsTraverse = .true.
  78. !TODO: clean up
  79. #ifdef Log5
  80. CALL DATE_AND_TIME(values=EndTime)
  81. Duration= EndTime(8) - StartTime(8)
  82. !if(print_log) print*, 'Duration= ', Duration, 'ms'
  83. call Log_5('Duration= ', Duration)
  84. call DisplayOpenPaths()
  85. call Log_5('==========================================')
  86. #endif
  87. end subroutine
  88. subroutine PostProcess(pathArr)
  89. implicit none
  90. type(Path), allocatable, intent(inout) :: pathArr(:)
  91. integer :: i
  92. if(.not.allocated(pathArr)) return
  93. i = 1
  94. do
  95. call pathArr(i)%Purge(MinRelation, MaxRelation)
  96. if(pathArr(i)%Length() <= 2) then
  97. call RemovePath(pathArr, i)
  98. else
  99. i = i + 1
  100. endif
  101. if(i > size(pathArr)) exit
  102. enddo
  103. end subroutine
  104. subroutine AddRootNode(valve)
  105. implicit none
  106. integer, intent(in) :: valve
  107. call data%state%manifold%Fringe%Push(valve)
  108. end subroutine
  109. recursive subroutine AddChildren(node)
  110. implicit none
  111. type(Arrangement), intent(inout) :: node
  112. integer :: i,t
  113. do i=1, data%state%manifold%Valve(node%Number)%Length()
  114. t = data%state%manifold%Valve(node%Number)%Adjacent(i)
  115. if(IsValveOpen(t)) then
  116. if(data%state%manifold%Fringe%DoesHave(t)) cycle
  117. call data%state%manifold%Fringe%Push(t)
  118. if(data%state%manifold%Valve(t)%IsSource()) then
  119. call AddPath(data%state%manifold%OpenPaths, data%state%manifold%Fringe%List)
  120. call data%state%manifold%Fringe%Pop()
  121. cycle
  122. endif
  123. call AddChildren(data%state%manifold%Valve(node%Adjacent(i)))
  124. end if
  125. enddo
  126. call data%state%manifold%Fringe%Pop()
  127. end subroutine
  128. logical function IsValveOpen(no)
  129. implicit none
  130. integer, intent(in) :: no
  131. IsValveOpen = data%state%manifold%Valve(no)%Status
  132. end function
  133. subroutine AddPath(pathArr, p)
  134. implicit none
  135. type(Path), intent(in) :: p
  136. type(Path), allocatable, intent(inout) :: pathArr(:)
  137. type(Path), allocatable :: tempArr(:)
  138. integer :: i, isize
  139. if(p%IsNull()) return
  140. if(p%Length()<=1) return
  141. !**call OnpPathOpen%RunAll(p%Valves)
  142. if(allocated(pathArr)) then
  143. isize = size(pathArr)
  144. ! check to see if already have a path same as p
  145. do i=1,isize
  146. if(pathArr(i)%First()==p%First() .and. pathArr(i)%Last()==p%Last()) then
  147. ! if there is then
  148. ! check to see if both have exacly a same length
  149. if(pathArr(i)%Length()==p%Length())then
  150. ! now they are the same so ignore adding this one
  151. return
  152. else
  153. !if they have different lengths then choose the shorter one
  154. if(pathArr(i)%Length()>p%Length())pathArr(i) = p
  155. return
  156. endif
  157. endif
  158. end do
  159. !TODO: if p last valve is input source then ignore adding it
  160. !TODO: if p start valve is output source then ignore adding it
  161. ! if p is a new entry then add it to the collections of found paths
  162. allocate(tempArr(isize+1))
  163. do i=1,isize
  164. tempArr(i) = pathArr(i)
  165. end do
  166. tempArr(isize+1) = p
  167. deallocate(pathArr)
  168. call move_alloc(tempArr, pathArr)
  169. else
  170. allocate(pathArr(1))
  171. pathArr(1) = p
  172. end if
  173. endsubroutine
  174. subroutine RemovePath(pathArr, index)
  175. implicit none
  176. integer, intent(in) :: index
  177. type(Path), allocatable, intent(inout) :: pathArr(:)
  178. type(Path), allocatable :: tempArr(:)
  179. integer :: i
  180. logical :: found
  181. if(index <= 0 .or. index > size(pathArr)) return
  182. if(.not.allocated(pathArr))return
  183. allocate(tempArr(size(pathArr)-1))
  184. found = .false.
  185. do i=1, size(pathArr)
  186. if(i==index) then
  187. found = .true.
  188. cycle
  189. end if
  190. if(found) then
  191. tempArr(i-1) = pathArr(i)
  192. !!**call OnpPathClose%RunAll(pathArr(i)%Valves)
  193. else
  194. tempArr(i) = pathArr(i)
  195. endif
  196. end do
  197. deallocate(pathArr)
  198. call move_alloc(tempArr, pathArr)
  199. endsubroutine
  200. subroutine Setup()
  201. implicit none
  202. integer :: i
  203. ! initialize all valves
  204. do i = 1, ValveCount
  205. call data%state%manifold%Valve(i)%init(i)
  206. end do
  207. ! open source valves
  208. do i = MinSource , MaxSource
  209. data%state%manifold%Valve(i)%Status = .true.
  210. data%state%manifold%Valve(i)%ValveType = InputOutput
  211. end do
  212. do i = MinRelation , MaxRelation
  213. data%state%manifold%Valve(i)%Status = .true.
  214. data%state%manifold%Valve(i)%ValveType = Relation
  215. end do
  216. ! make adjustments
  217. call data%state%manifold%Valve(1)%AdjacentTo(91)
  218. call data%state%manifold%Valve(2)%AdjacentTo(92)
  219. call data%state%manifold%Valve(2)%AdjacentTo(117)
  220. call data%state%manifold%Valve(3)%AdjacentTo(93)
  221. call data%state%manifold%Valve(3)%AdjacentTo(118)
  222. call data%state%manifold%Valve(4)%AdjacentTo(94)
  223. call data%state%manifold%Valve(5)%AdjacentTo(95)
  224. call data%state%manifold%Valve(6)%AdjacentTo(91)
  225. call data%state%manifold%Valve(6)%AdjacentTo(92)
  226. call data%state%manifold%Valve(7)%AdjacentTo(92)
  227. call data%state%manifold%Valve(7)%AdjacentTo(93)
  228. call data%state%manifold%Valve(8)%AdjacentTo(93)
  229. call data%state%manifold%Valve(8)%AdjacentTo(94)
  230. call data%state%manifold%Valve(9)%AdjacentTo(91)
  231. call data%state%manifold%Valve(9)%AdjacentTo(96)
  232. call data%state%manifold%Valve(10)%AdjacentTo(94)
  233. call data%state%manifold%Valve(10)%AdjacentTo(98)
  234. call data%state%manifold%Valve(11)%AdjacentTo(96)
  235. call data%state%manifold%Valve(11)%AdjacentTo(97)
  236. call data%state%manifold%Valve(12)%AdjacentTo(97)
  237. call data%state%manifold%Valve(12)%AdjacentTo(98)
  238. call data%state%manifold%Valve(13)%AdjacentTo(96)
  239. call data%state%manifold%Valve(13)%AdjacentTo(99)
  240. call data%state%manifold%Valve(14)%AdjacentTo(78)
  241. call data%state%manifold%Valve(14)%AdjacentTo(97)
  242. !call Valve(14)%AdjacentTo(126)
  243. call data%state%manifold%Valve(15)%AdjacentTo(98)
  244. call data%state%manifold%Valve(15)%AdjacentTo(99)
  245. call data%state%manifold%Valve(16)%AdjacentTo(121)
  246. !call Valve(16)%AdjacentTo()
  247. call data%state%manifold%Valve(17)%AdjacentTo(122)
  248. !call Valve(17)%AdjacentTo()
  249. call data%state%manifold%Valve(18)%AdjacentTo(123)
  250. !call Valve(18)%AdjacentTo()
  251. call data%state%manifold%Valve(19)%AdjacentTo(101)
  252. call data%state%manifold%Valve(19)%AdjacentTo(102)
  253. call data%state%manifold%Valve(20)%AdjacentTo(100)
  254. call data%state%manifold%Valve(21)%AdjacentTo(101)
  255. call data%state%manifold%Valve(22)%AdjacentTo(102)
  256. call data%state%manifold%Valve(23)%AdjacentTo(71)
  257. call data%state%manifold%Valve(24)%AdjacentTo(71)
  258. call data%state%manifold%Valve(25)%AdjacentTo(108)
  259. call data%state%manifold%Valve(25)%AdjacentTo(118)
  260. call data%state%manifold%Valve(26)%AdjacentTo(109)
  261. call data%state%manifold%Valve(26)%AdjacentTo(117)
  262. call data%state%manifold%Valve(27)%AdjacentTo(32)
  263. call data%state%manifold%Valve(27)%AdjacentTo(108)
  264. call data%state%manifold%Valve(28)%AdjacentTo(33)
  265. call data%state%manifold%Valve(28)%AdjacentTo(108)
  266. call data%state%manifold%Valve(29)%AdjacentTo(110)
  267. call data%state%manifold%Valve(29)%AdjacentTo(113)
  268. call data%state%manifold%Valve(30)%AdjacentTo(34)
  269. call data%state%manifold%Valve(30)%AdjacentTo(109)
  270. call data%state%manifold%Valve(31)%AdjacentTo(35)
  271. call data%state%manifold%Valve(31)%AdjacentTo(109)
  272. call data%state%manifold%Valve(32)%AdjacentTo(27)
  273. call data%state%manifold%Valve(32)%AdjacentTo(61)
  274. call data%state%manifold%Valve(33)%AdjacentTo(28)
  275. call data%state%manifold%Valve(33)%AdjacentTo(62)
  276. call data%state%manifold%Valve(34)%AdjacentTo(30)
  277. call data%state%manifold%Valve(34)%AdjacentTo(63)
  278. call data%state%manifold%Valve(35)%AdjacentTo(31)
  279. call data%state%manifold%Valve(35)%AdjacentTo(64)
  280. call data%state%manifold%Valve(36)%AdjacentTo(116)
  281. call data%state%manifold%Valve(37)%AdjacentTo(78)
  282. call data%state%manifold%Valve(38)%AdjacentTo(71)
  283. call data%state%manifold%Valve(39)%AdjacentTo(77)
  284. !call Valve(40)%AdjacentTo(105)
  285. call data%state%manifold%Valve(40)%AdjacentTo(80)
  286. call data%state%manifold%Valve(41)%AdjacentTo(77)
  287. call data%state%manifold%Valve(42)%AdjacentTo(71)
  288. call data%state%manifold%Valve(43)%AdjacentTo(106)
  289. call data%state%manifold%Valve(44)%AdjacentTo(77)
  290. call data%state%manifold%Valve(45)%AdjacentTo(71)
  291. call data%state%manifold%Valve(46)%AdjacentTo(104)
  292. call data%state%manifold%Valve(47)%AdjacentTo(104)
  293. call data%state%manifold%Valve(47)%AdjacentTo(117)
  294. call data%state%manifold%Valve(48)%AdjacentTo(69)
  295. call data%state%manifold%Valve(48)%AdjacentTo(79)
  296. call data%state%manifold%Valve(49)%AdjacentTo(104)
  297. call data%state%manifold%Valve(49)%AdjacentTo(79)
  298. !call Valve(50)%AdjacentTo(48)
  299. call data%state%manifold%Valve(50)%AdjacentTo(51)
  300. !call Valve(50)%AdjacentTo(54)
  301. call data%state%manifold%Valve(50)%AdjacentTo(104)
  302. call data%state%manifold%Valve(51)%AdjacentTo(50)
  303. call data%state%manifold%Valve(51)%AdjacentTo(52)
  304. call data%state%manifold%Valve(52)%AdjacentTo(51)
  305. !call Valve(52)%AdjacentTo(127)
  306. call data%state%manifold%Valve(52)%AdjacentTo(80)
  307. !call Valve(53)%AdjacentTo(103)
  308. !call Valve(53)%AdjacentTo(105)
  309. call data%state%manifold%Valve(53)%AdjacentTo(80)
  310. !call Valve(54)%AdjacentTo(69)
  311. !call Valve(54)%AdjacentTo(124)
  312. !call Valve(55)%AdjacentTo(103)
  313. !call Valve(55)%AdjacentTo(124)
  314. call data%state%manifold%Valve(56)%AdjacentTo(128)
  315. call data%state%manifold%Valve(56)%AdjacentTo(127)
  316. !call Valve(57)%AdjacentTo(14)
  317. !call Valve(57)%AdjacentTo(103)
  318. !call Valve(57)%AdjacentTo(126)
  319. call data%state%manifold%Valve(58)%AdjacentTo(78)
  320. call data%state%manifold%Valve(59)%AdjacentTo(78)
  321. call data%state%manifold%Valve(60)%AdjacentTo(78)
  322. call data%state%manifold%Valve(61)%AdjacentTo(32)
  323. call data%state%manifold%Valve(61)%AdjacentTo(115)
  324. call data%state%manifold%Valve(62)%AdjacentTo(33)
  325. call data%state%manifold%Valve(62)%AdjacentTo(114)
  326. call data%state%manifold%Valve(63)%AdjacentTo(112)
  327. call data%state%manifold%Valve(63)%AdjacentTo(34)
  328. call data%state%manifold%Valve(64)%AdjacentTo(35)
  329. call data%state%manifold%Valve(64)%AdjacentTo(111)
  330. call data%state%manifold%Valve(65)%AdjacentTo(120)
  331. call data%state%manifold%Valve(66)%AdjacentTo(120)
  332. call data%state%manifold%Valve(67)%AdjacentTo(73)
  333. call data%state%manifold%Valve(68)%AdjacentTo(125)
  334. call data%state%manifold%Valve(68)%AdjacentTo(126)
  335. call data%state%manifold%Valve(69)%AdjacentTo(48)
  336. call data%state%manifold%Valve(69)%AdjacentTo(124)
  337. !call Valve(70)%AdjacentTo()
  338. !call Valve(70)%AdjacentTo()
  339. call data%state%manifold%Valve(71)%AdjacentTo(20)
  340. call data%state%manifold%Valve(71)%AdjacentTo(44)
  341. call data%state%manifold%Valve(71)%AdjacentTo(59)
  342. call data%state%manifold%Valve(72)%AdjacentTo(21)
  343. call data%state%manifold%Valve(72)%AdjacentTo(23)
  344. call data%state%manifold%Valve(73)%AdjacentTo(22)
  345. call data%state%manifold%Valve(74)%AdjacentTo(24)
  346. !call Valve(75)%AdjacentTo()
  347. !call Valve(76)%AdjacentTo()
  348. call data%state%manifold%Valve(77)%AdjacentTo(43)
  349. call data%state%manifold%Valve(77)%AdjacentTo(58)
  350. !call Valve(78)%AdjacentTo()
  351. call data%state%manifold%Valve(79)%AdjacentTo(48)
  352. call data%state%manifold%Valve(79)%AdjacentTo(49)
  353. call data%state%manifold%Valve(80)%AdjacentTo(52)
  354. call data%state%manifold%Valve(80)%AdjacentTo(107)
  355. call data%state%manifold%Valve(81)%AdjacentTo(53)
  356. call data%state%manifold%Valve(82)%AdjacentTo(16)
  357. call data%state%manifold%Valve(83)%AdjacentTo(17)
  358. call data%state%manifold%Valve(84)%AdjacentTo(18)
  359. !call Valve(85)%AdjacentTo()
  360. !call Valve(86)%AdjacentTo()
  361. !call Valve(87)%AdjacentTo()
  362. !call Valve(88)%AdjacentTo()
  363. !!call Valve(89)%AdjacentTo()
  364. !call Valve(90)%AdjacentTo()
  365. call data%state%manifold%Valve(91)%AdjacentTo(6)
  366. call data%state%manifold%Valve(91)%AdjacentTo(9)
  367. call data%state%manifold%Valve(91)%AdjacentTo(75)
  368. call data%state%manifold%Valve(92)%AdjacentTo(6)
  369. call data%state%manifold%Valve(92)%AdjacentTo(7)
  370. call data%state%manifold%Valve(92)%AdjacentTo(2)
  371. call data%state%manifold%Valve(93)%AdjacentTo(3)
  372. call data%state%manifold%Valve(93)%AdjacentTo(7)
  373. call data%state%manifold%Valve(93)%AdjacentTo(8)
  374. call data%state%manifold%Valve(94)%AdjacentTo(8)
  375. call data%state%manifold%Valve(94)%AdjacentTo(10)
  376. call data%state%manifold%Valve(94)%AdjacentTo(95)
  377. call data%state%manifold%Valve(95)%AdjacentTo(76)
  378. call data%state%manifold%Valve(95)%AdjacentTo(94)
  379. call data%state%manifold%Valve(96)%AdjacentTo(9)
  380. call data%state%manifold%Valve(96)%AdjacentTo(11)
  381. call data%state%manifold%Valve(96)%AdjacentTo(13)
  382. call data%state%manifold%Valve(97)%AdjacentTo(11)
  383. call data%state%manifold%Valve(97)%AdjacentTo(12)
  384. call data%state%manifold%Valve(97)%AdjacentTo(14)
  385. call data%state%manifold%Valve(98)%AdjacentTo(10)
  386. call data%state%manifold%Valve(98)%AdjacentTo(12)
  387. call data%state%manifold%Valve(98)%AdjacentTo(15)
  388. call data%state%manifold%Valve(99)%AdjacentTo(13)
  389. call data%state%manifold%Valve(99)%AdjacentTo(15)
  390. call data%state%manifold%Valve(99)%AdjacentTo(125)
  391. !call Valve(100)%AdjacentTo(16)
  392. call data%state%manifold%Valve(100)%AdjacentTo(82)
  393. call data%state%manifold%Valve(100)%AdjacentTo(101)
  394. !call Valve(101)%AdjacentTo(17)
  395. call data%state%manifold%Valve(101)%AdjacentTo(19)
  396. call data%state%manifold%Valve(101)%AdjacentTo(83)
  397. call data%state%manifold%Valve(101)%AdjacentTo(100)
  398. !call Valve(102)%AdjacentTo(18)
  399. call data%state%manifold%Valve(102)%AdjacentTo(19)
  400. call data%state%manifold%Valve(102)%AdjacentTo(84)
  401. !call Valve(103)%AdjacentTo(53)
  402. !call Valve(103)%AdjacentTo(56)
  403. call data%state%manifold%Valve(103)%AdjacentTo(124)
  404. !call Valve(103)%AdjacentTo(56)
  405. !call Valve(103)%AdjacentTo(78)
  406. call data%state%manifold%Valve(104)%AdjacentTo(46)
  407. call data%state%manifold%Valve(104)%AdjacentTo(47)
  408. call data%state%manifold%Valve(104)%AdjacentTo(49)
  409. call data%state%manifold%Valve(104)%AdjacentTo(50)
  410. !call Valve(105)%AdjacentTo(53)
  411. !call Valve(105)%AdjacentTo(107)
  412. !call Valve(105)%AdjacentTo(127)
  413. call data%state%manifold%Valve(106)%AdjacentTo(40)
  414. call data%state%manifold%Valve(106)%AdjacentTo(45)
  415. call data%state%manifold%Valve(107)%AdjacentTo(41)
  416. !call Valve(107)%AdjacentTo(105)
  417. call data%state%manifold%Valve(107)%AdjacentTo(119)
  418. !call Valve(107)%AdjacentTo(42)
  419. call data%state%manifold%Valve(108)%AdjacentTo(25)
  420. call data%state%manifold%Valve(108)%AdjacentTo(27)
  421. call data%state%manifold%Valve(108)%AdjacentTo(28)
  422. call data%state%manifold%Valve(108)%AdjacentTo(110)
  423. call data%state%manifold%Valve(109)%AdjacentTo(26)
  424. call data%state%manifold%Valve(109)%AdjacentTo(30)
  425. call data%state%manifold%Valve(109)%AdjacentTo(31)
  426. call data%state%manifold%Valve(109)%AdjacentTo(110)
  427. call data%state%manifold%Valve(110)%AdjacentTo(29)
  428. call data%state%manifold%Valve(110)%AdjacentTo(85)
  429. call data%state%manifold%Valve(110)%AdjacentTo(108)
  430. call data%state%manifold%Valve(110)%AdjacentTo(109)
  431. call data%state%manifold%Valve(111)%AdjacentTo(37)
  432. call data%state%manifold%Valve(111)%AdjacentTo(64)
  433. call data%state%manifold%Valve(111)%AdjacentTo(112)
  434. call data%state%manifold%Valve(112)%AdjacentTo(63)
  435. call data%state%manifold%Valve(112)%AdjacentTo(111)
  436. call data%state%manifold%Valve(112)%AdjacentTo(113)
  437. call data%state%manifold%Valve(113)%AdjacentTo(29)
  438. call data%state%manifold%Valve(113)%AdjacentTo(112)
  439. call data%state%manifold%Valve(113)%AdjacentTo(114)
  440. call data%state%manifold%Valve(114)%AdjacentTo(62)
  441. call data%state%manifold%Valve(114)%AdjacentTo(113)
  442. call data%state%manifold%Valve(114)%AdjacentTo(115)
  443. call data%state%manifold%Valve(115)%AdjacentTo(36)
  444. call data%state%manifold%Valve(115)%AdjacentTo(61)
  445. call data%state%manifold%Valve(115)%AdjacentTo(114)
  446. call data%state%manifold%Valve(116)%AdjacentTo(38)
  447. call data%state%manifold%Valve(116)%AdjacentTo(39)
  448. call data%state%manifold%Valve(117)%AdjacentTo(2)
  449. call data%state%manifold%Valve(117)%AdjacentTo(26)
  450. call data%state%manifold%Valve(117)%AdjacentTo(47)
  451. call data%state%manifold%Valve(118)%AdjacentTo(3)
  452. call data%state%manifold%Valve(118)%AdjacentTo(25)
  453. call data%state%manifold%Valve(118)%AdjacentTo(46)
  454. call data%state%manifold%Valve(119)%AdjacentTo(42)
  455. call data%state%manifold%Valve(119)%AdjacentTo(60)
  456. call data%state%manifold%Valve(119)%AdjacentTo(107)
  457. call data%state%manifold%Valve(120)%AdjacentTo(71)
  458. !call Valve(121)%AdjacentTo(16)
  459. call data%state%manifold%Valve(121)%AdjacentTo(1)
  460. call data%state%manifold%Valve(121)%AdjacentTo(65)
  461. !call Valve(122)%AdjacentTo(17)
  462. call data%state%manifold%Valve(122)%AdjacentTo(4)
  463. call data%state%manifold%Valve(122)%AdjacentTo(66)
  464. !call Valve(123)%AdjacentTo(18)
  465. call data%state%manifold%Valve(123)%AdjacentTo(5)
  466. call data%state%manifold%Valve(123)%AdjacentTo(67)
  467. !call Valve(124)%AdjacentTo(54)
  468. !call Valve(124)%AdjacentTo(55)
  469. call data%state%manifold%Valve(124)%AdjacentTo(69)
  470. call data%state%manifold%Valve(124)%AdjacentTo(103)
  471. call data%state%manifold%Valve(125)%AdjacentTo(68)
  472. call data%state%manifold%Valve(125)%AdjacentTo(99)
  473. ! call Valve(125)%AdjacentTo(126)
  474. call data%state%manifold%Valve(126)%AdjacentTo(128)
  475. call data%state%manifold%Valve(126)%AdjacentTo(68)
  476. !call Valve(126)%AdjacentTo(125)
  477. call data%state%manifold%Valve(127)%AdjacentTo(56)
  478. call data%state%manifold%Valve(127)%AdjacentTo(78)
  479. !call Valve(127)%AdjacentTo(105)
  480. call data%state%manifold%Valve(128)%AdjacentTo(56)
  481. call data%state%manifold%Valve(128)%AdjacentTo(126)
  482. ! initialization
  483. call ChangeValve(60, .true.)
  484. call RemoveIBop()
  485. call ToggleFillupHead(.false.)
  486. call ToggleMudBox(.false.)
  487. call RemoveTopDriveIBop()
  488. call InstallSafetyValve_KellyMode()
  489. call KellyDisconnected()
  490. end subroutine
  491. subroutine KellyConnected() !Bind(C,name='KellyConnected')
  492. implicit none
  493. call data%state%manifold%Valve(127)%RemoveAdjacent(78)
  494. call data%state%manifold%Valve(127)%AdjacentTo(103)
  495. call data%state%manifold%Valve(103)%AdjacentTo(127)
  496. if(print_log) print*, 'KellyConnected()'
  497. data%state%manifold%IsPathsDirty = .true.
  498. end subroutine
  499. subroutine KellyDisconnected() !Bind(C,name='KellyDisconnected')
  500. implicit none
  501. call data%state%manifold%Valve(127)%RemoveAdjacent(103)
  502. call data%state%manifold%Valve(103)%RemoveAdjacent(127)
  503. call data%state%manifold%Valve(127)%AdjacentTo(78)
  504. if(print_log) print*, 'KellyDisconnected()'
  505. data%state%manifold%IsPathsDirty = .true.
  506. end subroutine
  507. subroutine InstallSafetyValve_KellyMode()
  508. implicit none
  509. data%state%manifold%IsSafetyValveInstalled_KellyMode = .true.
  510. call RemoveTopDriveIBop()
  511. ! Remove Safey Valve (54)
  512. call data%state%manifold%Valve(124)%RemoveAdjacent(54)
  513. call data%state%manifold%Valve(54)%RemoveAdjacent(124)
  514. call data%state%manifold%Valve(69)%RemoveAdjacent(54)
  515. call data%state%manifold%Valve(54)%RemoveAdjacent(69)
  516. ! Remove 126-103 cnn
  517. call data%state%manifold%Valve(128)%RemoveAdjacent(127)
  518. call data%state%manifold%Valve(127)%RemoveAdjacent(128)
  519. ! now make cnn
  520. call data%state%manifold%Valve(124)%AdjacentTo(69)
  521. call data%state%manifold%Valve(69)%AdjacentTo(124)
  522. call data%state%manifold%Valve(128)%AdjacentTo(56)
  523. call data%state%manifold%Valve(56)%AdjacentTo(128)
  524. call data%state%manifold%Valve(56)%AdjacentTo(127)
  525. call data%state%manifold%Valve(127)%AdjacentTo(56)
  526. #ifdef deb
  527. if(print_log) print*, 'InstallSafetyValve_KellyMode()'
  528. #endif
  529. data%Equipments%DrillingConsole%IRSafetyValveLed = 1
  530. call OpenSafetyValve_KellyMode()
  531. end subroutine
  532. subroutine RemoveSafetyValve_KellyMode()
  533. implicit none
  534. data%state%manifold%IsSafetyValveInstalled_KellyMode = .false.
  535. call data%state%manifold%Valve(128)%RemoveAdjacent(56)
  536. call data%state%manifold%Valve(56)%RemoveAdjacent(128)
  537. call data%state%manifold%Valve(127)%RemoveAdjacent(56)
  538. call data%state%manifold%Valve(56)%RemoveAdjacent(127)
  539. call data%state%manifold%Valve(127)%AdjacentTo(128)
  540. call data%state%manifold%Valve(128)%AdjacentTo(127)
  541. data%Equipments%DrillingConsole%IRSafetyValveLed = 0
  542. call CloseSafetyValve_KellyMode()
  543. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  544. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  545. #ifdef deb
  546. if(print_log) print*, 'RemoveSafetyValve_KellyMode()'
  547. #endif
  548. end subroutine
  549. subroutine OpenSafetyValve_KellyMode()
  550. implicit none
  551. if(.not.data%state%manifold%IsSafetyValveInstalled_KellyMode) return
  552. data%Equipments%DrillingConsole%OpenSafetyValveLed = 1
  553. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  554. data%state%manifold%SafetyValve = .true.
  555. call ChangeValve(56, data%state%manifold%SafetyValve)
  556. #ifdef deb
  557. if(print_log) print*, 'OpenSafetyValve_KellyMode()'
  558. #endif
  559. end subroutine
  560. subroutine CloseSafetyValve_KellyMode()
  561. implicit none
  562. if(.not.data%state%manifold%IsSafetyValveInstalled_KellyMode) return
  563. data%Equipments%DrillingConsole%CloseSafetyValveLed = 1
  564. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  565. data%state%manifold%SafetyValve = .false.
  566. call ChangeValve(56, data%state%manifold%SafetyValve)
  567. #ifdef deb
  568. if(print_log) print*, 'CloseSafetyValve_KellyMode()'
  569. #endif
  570. end subroutine
  571. subroutine InstallSafetyValve_TripMode()
  572. implicit none
  573. data%state%manifold%IsSafetyValveInstalled_TripMode = .true.
  574. call data%state%manifold%Valve(128)%RemoveAdjacent(56)
  575. call data%state%manifold%Valve(56)%RemoveAdjacent(128)
  576. call data%state%manifold%Valve(127)%RemoveAdjacent(56)
  577. call data%state%manifold%Valve(56)%RemoveAdjacent(127)
  578. call data%state%manifold%Valve(69)%RemoveAdjacent(124)
  579. call data%state%manifold%Valve(124)%RemoveAdjacent(69)
  580. call data%state%manifold%Valve(127)%AdjacentTo(128)
  581. call data%state%manifold%Valve(128)%AdjacentTo(127)
  582. call data%state%manifold%Valve(124)%AdjacentTo(54)
  583. call data%state%manifold%Valve(54)%AdjacentTo(124)
  584. call data%state%manifold%Valve(54)%AdjacentTo(69)
  585. call data%state%manifold%Valve(69)%AdjacentTo(54)
  586. data%Equipments%DrillingConsole%IRSafetyValveLed = 1
  587. call OpenSafetyValve_TripMode()
  588. #ifdef deb
  589. if(print_log) print*, 'InstallSafetyValve_TripMode()'
  590. #endif
  591. end subroutine
  592. subroutine RemoveSafetyValve_TripMode()
  593. implicit none
  594. data%state%manifold%IsSafetyValveInstalled_TripMode = .false.
  595. call data%state%manifold%Valve(124)%RemoveAdjacent(54)
  596. call data%state%manifold%Valve(54)%RemoveAdjacent(124)
  597. call data%state%manifold%Valve(54)%RemoveAdjacent(69)
  598. call data%state%manifold%Valve(69)%RemoveAdjacent(54)
  599. call data%state%manifold%Valve(124)%AdjacentTo(69)
  600. call data%state%manifold%Valve(69)%AdjacentTo(124)
  601. data%Equipments%DrillingConsole%IRSafetyValveLed = 0
  602. call CloseSafetyValve_TripMode()
  603. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  604. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  605. if(print_log) print*, 'RemoveSafetyValve_TripMode()'
  606. end subroutine
  607. subroutine OpenSafetyValve_TripMode()
  608. implicit none
  609. if(.not.data%state%manifold%IsSafetyValveInstalled_TripMode) return
  610. data%Equipments%DrillingConsole%OpenSafetyValveLed = 1
  611. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  612. data%state%manifold%SafetyValve = .true.
  613. call ChangeValve(54, data%state%manifold%SafetyValve)
  614. #ifdef deb
  615. if(print_log) print*, 'OpenSafetyValve_TripMode()'
  616. #endif
  617. end subroutine
  618. subroutine CloseSafetyValve_TripMode()
  619. implicit none
  620. if(.not.data%state%manifold%IsSafetyValveInstalled_TripMode) return
  621. data%Equipments%DrillingConsole%CloseSafetyValveLed = 1
  622. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  623. data%state%manifold%SafetyValve = .false.
  624. call ChangeValve(54, data%state%manifold%SafetyValve)
  625. #ifdef deb
  626. if(print_log) print*, 'CloseSafetyValve_TripMode()'
  627. #endif
  628. end subroutine
  629. subroutine InstallSafetyValve_TopDrive()
  630. implicit none
  631. data%state%manifold%IsSafetyValveInstalled_TopDrive = .true.
  632. call data%state%manifold%Valve(128)%RemoveAdjacent(56)
  633. call data%state%manifold%Valve(56)%RemoveAdjacent(128)
  634. call data%state%manifold%Valve(127)%RemoveAdjacent(56)
  635. call data%state%manifold%Valve(56)%RemoveAdjacent(127)
  636. call data%state%manifold%Valve(69)%RemoveAdjacent(124)
  637. call data%state%manifold%Valve(124)%RemoveAdjacent(69)
  638. call data%state%manifold%Valve(124)%AdjacentTo(54)
  639. call data%state%manifold%Valve(54)%AdjacentTo(124)
  640. call data%state%manifold%Valve(54)%AdjacentTo(69)
  641. call data%state%manifold%Valve(69)%AdjacentTo(54)
  642. data%Equipments%DrillingConsole%IRSafetyValveLed = 1
  643. call OpenSafetyValve_TopDrive()
  644. #ifdef deb
  645. if(print_log) print*, 'InstallSafetyValve_TopDrive()'
  646. #endif
  647. end subroutine
  648. subroutine RemoveSafetyValve_TopDrive()
  649. implicit none
  650. data%state%manifold%IsSafetyValveInstalled_TopDrive = .false.
  651. call data%state%manifold%Valve(124)%RemoveAdjacent(54)
  652. call data%state%manifold%Valve(54)%RemoveAdjacent(124)
  653. call data%state%manifold%Valve(54)%RemoveAdjacent(69)
  654. call data%state%manifold%Valve(69)%RemoveAdjacent(54)
  655. call data%state%manifold%Valve(124)%AdjacentTo(69)
  656. call data%state%manifold%Valve(69)%AdjacentTo(124)
  657. data%Equipments%DrillingConsole%IRSafetyValveLed = 0
  658. call CloseSafetyValve_TopDrive()
  659. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  660. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  661. #ifdef deb
  662. if(print_log) print*, 'RemoveSafetyValve_TopDrive()'
  663. #endif
  664. end subroutine
  665. subroutine OpenSafetyValve_TopDrive()
  666. implicit none
  667. if(.not.data%state%manifold%IsSafetyValveInstalled_TopDrive) return
  668. data%Equipments%DrillingConsole%OpenSafetyValveLed = 1
  669. data%Equipments%DrillingConsole%CloseSafetyValveLed = 0
  670. data%state%manifold%SafetyValve = .true.
  671. #ifdef deb
  672. if(print_log) print*, 'OpenSafetyValve_TopDrive()'
  673. #endif
  674. call ChangeValve(54, data%state%manifold%SafetyValve)
  675. end subroutine
  676. subroutine CloseSafetyValve_TopDrive()
  677. implicit none
  678. if(.not.data%state%manifold%IsSafetyValveInstalled_TopDrive) return
  679. data%Equipments%DrillingConsole%CloseSafetyValveLed = 1
  680. data%Equipments%DrillingConsole%OpenSafetyValveLed = 0
  681. data%state%manifold%SafetyValve = .false.
  682. #ifdef deb
  683. if(print_log) print*, 'CloseSafetyValve_TopDrive()'
  684. #endif
  685. call ChangeValve(54, data%state%manifold%SafetyValve)
  686. end subroutine
  687. subroutine InstallIBop()
  688. implicit none
  689. data%state%manifold%IsIBopInstalled = .true.
  690. call data%state%manifold%Valve(103)%RemoveAdjacent(124)
  691. call data%state%manifold%Valve(124)%RemoveAdjacent(103)
  692. call data%state%manifold%Valve(55)%AdjacentTo(103)
  693. call data%state%manifold%Valve(55)%AdjacentTo(124)
  694. call data%state%manifold%Valve(103)%AdjacentTo(55)
  695. call data%state%manifold%Valve(124)%AdjacentTo(55)
  696. #ifdef deb
  697. if(print_log) print*, 'InstallIBop()'
  698. #endif
  699. data%Equipments%DrillingConsole%IRIBopLed = 1
  700. call OpenIBop()
  701. end subroutine
  702. subroutine RemoveIBop()
  703. implicit none
  704. data%state%manifold%IsIBopInstalled = .false.
  705. call data%state%manifold%Valve(55)%RemoveAdjacent(103)
  706. call data%state%manifold%Valve(55)%RemoveAdjacent(124)
  707. call data%state%manifold%Valve(103)%RemoveAdjacent(55)
  708. call data%state%manifold%Valve(124)%RemoveAdjacent(55)
  709. call data%state%manifold%Valve(103)%AdjacentTo(124)
  710. call data%state%manifold%Valve(124)%AdjacentTo(103)
  711. #ifdef deb
  712. if(print_log) print*, 'RemoveIBop()'
  713. #endif
  714. data%Equipments%DrillingConsole%IRIBopLed = 0
  715. data%state%manifold%IBop = .false.
  716. call ChangeValve(55, data%state%manifold%IBop)
  717. end subroutine
  718. subroutine OpenIBop()
  719. implicit none
  720. if(.not.data%state%manifold%IsIBopInstalled) return
  721. data%state%manifold%IBop = .true.
  722. #ifdef deb
  723. if(print_log) print*, 'OpenIBop()'
  724. #endif
  725. call ChangeValve(55, data%state%manifold%IBop)
  726. end subroutine
  727. subroutine CloseIBop()
  728. implicit none
  729. if(.not.data%state%manifold%IsIBopInstalled) return
  730. data%state%manifold%IBop = .false.
  731. #ifdef deb
  732. if(print_log) print*, 'CloseIBop()'
  733. #endif
  734. call ChangeValve(55, data%state%manifold%IBop)
  735. end subroutine
  736. subroutine InstallKellyCock()
  737. implicit none
  738. data%state%manifold%IsKellyCockInstalled = .true.
  739. call data%state%manifold%Valve(125)%RemoveAdjacent(126)
  740. call data%state%manifold%Valve(126)%RemoveAdjacent(125)
  741. call data%state%manifold%Valve(125)%AdjacentTo(68)
  742. call data%state%manifold%Valve(68)%AdjacentTo(125)
  743. call data%state%manifold%Valve(68)%AdjacentTo(126)
  744. call data%state%manifold%Valve(126)%AdjacentTo(68)
  745. #ifdef deb
  746. if(print_log) print*, 'InstallKellyCock()'
  747. #endif
  748. call OpenKellyCock()
  749. end subroutine
  750. subroutine RemoveKellyCock()
  751. implicit none
  752. data%state%manifold%IsKellyCockInstalled = .false.
  753. call data%state%manifold%Valve(125)%RemoveAdjacent(68)
  754. call data%state%manifold%Valve(126)%RemoveAdjacent(68)
  755. call data%state%manifold%Valve(68)%RemoveAdjacent(125)
  756. call data%state%manifold%Valve(68)%RemoveAdjacent(126)
  757. call data%state%manifold%Valve(125)%AdjacentTo(126)
  758. call data%state%manifold%Valve(126)%AdjacentTo(125)
  759. data%state%manifold%KellyCock = .false.
  760. call ChangeValve(68, data%state%manifold%KellyCock)
  761. data%Equipments%DrillingConsole%CloseKellyCockLed = 0
  762. data%Equipments%DrillingConsole%OpenKellyCockLed = 0
  763. #ifdef deb
  764. if(print_log) print*, 'RemoveKellyCock()'
  765. #endif
  766. end subroutine
  767. subroutine OpenKellyCock()
  768. implicit none
  769. if(.not.data%state%manifold%IsKellyCockInstalled) return
  770. data%Equipments%DrillingConsole%OpenKellyCockLed = 1
  771. data%Equipments%DrillingConsole%CloseKellyCockLed = 0
  772. data%state%manifold%KellyCock = .true.
  773. #ifdef deb
  774. if(print_log) print*, 'OpenKellyCock()'
  775. #endif
  776. call ChangeValve(68, data%state%manifold%KellyCock)
  777. end subroutine
  778. subroutine CloseKellyCock()
  779. implicit none
  780. if(.not.data%state%manifold%IsKellyCockInstalled) return
  781. data%Equipments%DrillingConsole%CloseKellyCockLed = 1
  782. data%Equipments%DrillingConsole%OpenKellyCockLed = 0
  783. data%state%manifold%KellyCock = .false.
  784. #ifdef deb
  785. if(print_log) print*, 'CloseKellyCock()'
  786. #endif
  787. call ChangeValve(68, data%state%manifold%KellyCock)
  788. end subroutine
  789. subroutine InstallTopDriveIBop()
  790. implicit none
  791. data%state%manifold%IsTopDriveIBopInstalled = .true.
  792. call data%state%manifold%Valve(126)%RemoveAdjacent(128)
  793. call data%state%manifold%Valve(128)%RemoveAdjacent(126)
  794. call data%state%manifold%Valve(126)%AdjacentTo(70)
  795. call data%state%manifold%Valve(70)%AdjacentTo(126)
  796. call data%state%manifold%Valve(128)%AdjacentTo(70)
  797. call data%state%manifold%Valve(70)%AdjacentTo(128)
  798. #ifdef deb
  799. if(print_log) print*, 'InstallTopDriveIBop()'
  800. #endif
  801. call OpenTopDriveIBop()
  802. end subroutine
  803. subroutine RemoveTopDriveIBop()
  804. implicit none
  805. data%state%manifold%IsTopDriveIBopInstalled = .false.
  806. call data%state%manifold%Valve(126)%RemoveAdjacent(70)
  807. call data%state%manifold%Valve(70)%RemoveAdjacent(126)
  808. call data%state%manifold%Valve(128)%RemoveAdjacent(70)
  809. call data%state%manifold%Valve(70)%RemoveAdjacent(128)
  810. call data%state%manifold%Valve(126)%AdjacentTo(128)
  811. call data%state%manifold%Valve(128)%AdjacentTo(126)
  812. #ifdef deb
  813. if(print_log) print*, 'RemoveTopDriveIBop()'
  814. #endif
  815. data%state%manifold%TopDriveIBop = .false.
  816. call ChangeValve(70, data%state%manifold%TopDriveIBop)
  817. end subroutine
  818. subroutine OpenTopDriveIBop()
  819. implicit none
  820. if(.not.data%state%manifold%IsTopDriveIBopInstalled) return
  821. data%state%manifold%TopDriveIBop = .true.
  822. call ChangeValve(70, data%state%manifold%TopDriveIBop)
  823. #ifdef deb
  824. if(print_log) print*, 'OpenTopDriveIBop()'
  825. #endif
  826. end subroutine
  827. subroutine CloseTopDriveIBop()
  828. implicit none
  829. if(.not.data%state%manifold%IsTopDriveIBopInstalled) return
  830. data%state%manifold%TopDriveIBop = .false.
  831. call ChangeValve(70, data%state%manifold%TopDriveIBop)
  832. #ifdef deb
  833. if(print_log) print*, 'CloseTopDriveIBop()'
  834. #endif
  835. end subroutine
  836. subroutine InstallFloatValve()
  837. implicit none
  838. data%state%manifold%IsFloatValveInstalled = .true.
  839. call data%state%manifold%Valve(69)%RemoveAdjacent(79)
  840. call data%state%manifold%Valve(79)%RemoveAdjacent(69)
  841. call data%state%manifold%Valve(48)%AdjacentTo(69)
  842. call data%state%manifold%Valve(48)%AdjacentTo(79)
  843. call data%state%manifold%Valve(69)%AdjacentTo(48)
  844. call data%state%manifold%Valve(79)%AdjacentTo(48)
  845. #ifdef deb
  846. if(print_log) print*, 'InstallFloatValve()'
  847. #endif
  848. call OpenFloatValve()
  849. end subroutine
  850. subroutine RemoveFloatValve()
  851. implicit none
  852. data%state%manifold%IsFloatValveInstalled = .false.
  853. call data%state%manifold%Valve(48)%RemoveAdjacent(69)
  854. call data%state%manifold%Valve(48)%RemoveAdjacent(79)
  855. call data%state%manifold%Valve(69)%RemoveAdjacent(48)
  856. call data%state%manifold%Valve(79)%RemoveAdjacent(48)
  857. call data%state%manifold%Valve(69)%AdjacentTo(79)
  858. call data%state%manifold%Valve(79)%AdjacentTo(69)
  859. #ifdef deb
  860. if(print_log) print*, 'RemoveFloatValve()'
  861. #endif
  862. data%state%manifold%FloatValve = .false.
  863. call ChangeValve(48, data%state%manifold%FloatValve)
  864. end subroutine
  865. subroutine OpenFloatValve()
  866. implicit none
  867. if(.not.data%state%manifold%IsFloatValveInstalled) return
  868. data%state%manifold%FloatValve = .true.
  869. #ifdef deb
  870. if(print_log) print*, 'OpenFloatValve()'
  871. #endif
  872. call ChangeValve(48, data%state%manifold%FloatValve)
  873. end subroutine
  874. subroutine CloseFloatValve()
  875. implicit none
  876. if(.not.data%state%manifold%IsFloatValveInstalled) return
  877. data%state%manifold%FloatValve = .false.
  878. #ifdef deb
  879. if(print_log) print*, 'CloseFloatValve()'
  880. #endif
  881. call ChangeValve(48, data%state%manifold%FloatValve)
  882. end subroutine
  883. subroutine ToggleFillupHead(v)
  884. implicit none
  885. logical, intent(in) :: v
  886. if(v) then
  887. call data%state%manifold%Valve(14)%RemoveAdjacent(78)
  888. call data%state%manifold%Valve(14)%AdjacentTo(57)
  889. call data%state%manifold%Valve(57)%AdjacentTo(14)
  890. call data%state%manifold%Valve(57)%AdjacentTo(103)
  891. call data%state%manifold%Valve(103)%AdjacentTo(57)
  892. else
  893. call data%state%manifold%Valve(14)%RemoveAdjacent(57)
  894. call data%state%manifold%Valve(57)%RemoveAdjacent(14)
  895. call data%state%manifold%Valve(57)%RemoveAdjacent(103)
  896. call data%state%manifold%Valve(103)%RemoveAdjacent(57)
  897. call data%state%manifold%Valve(14)%AdjacentTo(78)
  898. endif
  899. data%state%manifold%IsPathsDirty = .true.
  900. call ChangeValve(57, .true.)
  901. end subroutine
  902. subroutine ToggleMudBox(v)
  903. implicit none
  904. logical, intent(in) :: v
  905. call ChangeValve(53, v)
  906. end subroutine
  907. subroutine ToggleMiddleRams(v)
  908. implicit none
  909. logical, intent(in) :: v
  910. data%state%manifold%Valve(50)%Status = v
  911. call ChangeValve(69, v)
  912. end subroutine
  913. subroutine ToggleValve(i) bind(C,name="ToggleValve")
  914. integer :: i
  915. logical :: currentStatus
  916. currentStatus = data%State%Manifold%Valve(i)%Status
  917. call ChangeValve(i,.not. currentStatus)
  918. end subroutine
  919. subroutine ChangeValve(i, state)
  920. implicit none
  921. integer, intent(in) :: i
  922. logical, intent(in) :: state
  923. if(data%state%manifold%Valve(i)%Status==state) return
  924. data%state%manifold%Valve(i)%Status = state
  925. if(i == 41 .or. i == 42) then
  926. if(data%state%manifold%Valve(41)%Status == .false. .and. data%state%manifold%Valve(42)%Status == .false.) then
  927. data%state%manifold%Valve(60)%Status = .true.
  928. else
  929. data%state%manifold%Valve(60)%Status = .false.
  930. endif
  931. endif
  932. #ifdef deb
  933. if(print_log) print*, 'Valve(', i, ') = ', state
  934. #endif
  935. !call Traverse()
  936. data%state%manifold%IsPathsDirty = .true.
  937. end subroutine
  938. subroutine DisplayOpenPaths()
  939. implicit none
  940. integer :: i
  941. if(allocated(data%state%manifold%OpenPaths)) then
  942. do i = 1, size(data%state%manifold%OpenPaths)
  943. call data%state%manifold%OpenPaths(i)%Display()
  944. end do
  945. end if
  946. end subroutine
  947. subroutine DisplayOpenPathsWrite()
  948. implicit none
  949. integer :: i
  950. if(allocated(data%state%manifold%OpenPaths)) then
  951. do i = 1, size(data%state%manifold%OpenPaths)
  952. call data%state%manifold%OpenPaths(i)%DisplayWrite()
  953. end do
  954. end if
  955. end subroutine
  956. end module CManifolds