00001 subroutine set
00002
00003 use global
00004
00005
00006 implicit none
00007
00008
00009
00010 integer,pointer :: IM(:,:,:,:)
00011
00012
00013 integer, pointer :: bcVec(:)
00014 integer, pointer :: maxBC
00015
00016
00017 integer,pointer :: minI,minJ,maxI,maxJ,maxT
00018
00019 integer,pointer :: myMaxI,myMaxJ,myMaxT
00020
00021 integer,pointer :: allBC
00022
00023 integer i,j,t,bc
00024
00025 integer dummy
00026
00027 integer myI,myJ,myT,myBC
00028
00029 integer bcVal
00030
00031 integer,allocatable :: jVecTest(:,:),iVecTest(:),tVecTest(:)
00032
00033 integer,allocatable :: bcVecTest(:)
00034
00035 integer,pointer :: mysetVec(:)
00036
00037 integer,allocatable :: setDofVec(:)
00038
00039
00040
00041
00042
00043
00044
00045
00046 IM=>myModel%physics(currentPhysics)%domain(currentDomain)%dofMatrix
00047
00048 minI=>myModel%physics(currentPhysics)%domain(currentDomain)%minI
00049 minJ=>myModel%physics(currentPhysics)%domain(currentDomain)%minJ
00050 maxI=>myModel%physics(currentPhysics)%domain(currentDomain)%maxI
00051 maxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%maxJ
00052
00053
00054
00055
00056
00057 dof=>myModel%physics(currentPhysics)%dof
00058
00059
00060
00061 allocate(setDofVec(dof))
00062
00063 setDofVec=0
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078 allBC=>myModel%physics(currentPhysics)%domain(currentDomain)%allBC
00079 allocate(bcVecTest(allBc))
00080 bcVecTest=0
00081
00082
00083 do j=minJ,maxJ
00084
00085 do i=minI,maxI
00086
00087 do t=1,size(IM,dim=3)
00088
00089
00090 if ((IM(i,j,t,flag).eq.1).and.(IM(i,j,t,absolute).ne.0)) then
00091
00092
00093
00094 bcVecTest(IM(i,j,1,boundary))=1
00095
00096 end if
00097
00098 end do
00099
00100
00101 end do
00102
00103
00104 end do
00105
00106
00107
00108 maxBC=>myModel%physics(currentPhysics)%domain(currentDomain)%set%maxBC
00109 maxBC=0
00110 do i=1,allBc
00111
00112 if (bcVecTest(i).eq.1) then
00113
00114 maxBc=maxBc+1
00115
00116 end if
00117
00118 end do
00119
00120
00121 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec(maxBC))
00122
00123 bcVec=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec
00124 bcVec=0
00125
00126 myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec=0
00127
00128 dummy=1
00129
00130 do i=1,allBc
00131
00132 if (bcVecTest(i).eq.1) then
00133
00134 bcVec(dummy)=i
00135 dummy=dummy+1
00136
00137 end if
00138
00139 end do
00140
00141
00142
00143
00144
00145
00146
00147
00148 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(allBc))
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161 do myT=1,allBc
00162 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(myT)%maxJ=0
00163 end do
00164
00165
00166
00167 allocate(jVecTest(minJ:maxJ,maxBc))
00168 jVecTest=0
00169
00170
00171
00172 do j=minJ,maxJ
00173
00174
00175 if (maxval(IM(:,j,:,flag)).eq.0) cycle
00176
00177
00178
00179 do myBC=1,maxBc
00180
00181
00182 do i=minI,maxI
00183
00184
00185
00186
00187
00188
00189 dummy=IM(i,j,absolute,boundary)
00190
00191
00192
00193
00194
00195
00196
00197 if (maxVal(IM(i,j,:,absolute)).eq.0) cycle
00198
00199 if (maxVal(IM(i,j,:,flag)).eq.0) cycle
00200
00201
00202 bc=bcVec(myBC)
00203
00204 myMaxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%maxJ
00205
00206 if (dummy.eq.bcVec(myBC)) then
00207
00208
00209 myMaxJ=myMaxJ+1
00210
00211
00212
00213 jVecTest(j,myBC)=1
00214
00215 exit
00216
00217 end if
00218
00219
00220 end do
00221
00222
00223 end do
00224
00225
00226 end do
00227
00228
00229
00230
00231
00232 do myBC=1,maxBc
00233
00234 bc=bcVec(myBC)
00235
00236 myMaxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%maxJ
00237
00238
00239
00240
00241
00242 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myMaxJ))
00243 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myMaxJ)=0
00244
00245
00246
00247 dummy=1
00248
00249 do myJ=minJ,maxJ
00250
00251 if (jVecTest(myJ,myBC).eq.1) then
00252
00253
00254
00255 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(dummy)=myJ
00256
00257 dummy=dummy+1
00258
00259 end if
00260
00261 end do
00262
00263
00264 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myMaxJ))
00265
00266
00267
00268
00269 do myJ=1,myMaxJ
00270
00271 j=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myJ)
00272
00273
00274
00275
00276
00277
00278 myMaxI=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%maxI
00279 myMaxI=0
00280
00281
00282 allocate(iVecTest(minI:maxI))
00283 iVecTest=0
00284
00285
00286 do i=minI,maxI
00287
00288
00289
00290 if (maxVal(IM(i,j,:,absolute)).eq.0) cycle
00291
00292 if (maxVal(IM(i,j,:,flag)).eq.0) cycle
00293
00294 if (IM(i,j,absolute,boundary).ne.bc) cycle
00295
00296
00297
00298 myMaxI=myMaxI+1
00299
00300 iVecTest(i)=1
00301
00302 end do
00303
00304
00305
00306
00307
00308 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myMaxI))
00309 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec(myMaxI))
00310
00311 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec=0
00312
00313
00314
00315
00316 dummy=1
00317
00318 do myI=minI,maxI
00319
00320 if (iVecTest(myI).eq.1) then
00321
00322 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec(dummy)=myI
00323
00324 dummy=dummy+1
00325
00326 end if
00327
00328 end do
00329
00330 deallocate(iVecTest)
00331
00332 end do
00333
00334 end do
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 do myBC=1,maxBC
00345
00346 bc=myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec(myBc)
00347
00348 myMaxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%maxJ
00349
00350 do myJ=1,myMaxJ
00351
00352 j=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myJ)
00353
00354 myMaxI=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%maxI
00355
00356
00357
00358 do myI=1,myMaxI
00359
00360 i=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec(myI)
00361
00362
00363
00364
00365
00366
00367
00368 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%endIndex(dof))
00369 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%endIndex=0
00370
00371 myMaxT=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%maxT
00372 myMaxT=0
00373
00374
00375 allocate(tVecTest(dof))
00376 tVecTest=0
00377
00378 do t=1,dof
00379
00380
00381 if (IM(i,j,t,flag).eq.1) then
00382
00383 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%endIndex(t)=1
00384
00385 myMaxT=myMaxT+1
00386
00387 tVecTest(t)=1
00388
00389 setDofVec(t)=1
00390
00391 end if
00392
00393
00394 end do
00395
00396 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%tVec(myMaxT))
00397 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%tVec=0
00398
00399
00400
00401 dummy=1
00402
00403 do t=1,dof
00404
00405 if (tVecTest(t).eq.1) then
00406
00407 myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%tVec(dummy)=t
00408
00409 dummy=dummy+1
00410
00411 end if
00412
00413 end do
00414
00415
00416 deallocate(tVecTest)
00417
00418
00419 end do
00420
00421
00422
00423 end do
00424
00425
00426 end do
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441 setDof=>myModel%physics(currentPhysics)%domain(currentDomain)%setDof
00442
00443 setDof=0
00444
00445 do t=1,dof
00446
00447 if (setDofVec(t).eq.1) setDof=setDof+1
00448
00449 end do
00450
00451
00452
00453
00454 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%dofVec(setDof))
00455 myModel%physics(currentPhysics)%domain(currentDomain)%dofVec=0
00456
00457
00458 dummy=1
00459 do t=1,dof
00460
00461 if (setDofVec(t).eq.1) then
00462
00463 myModel%physics(currentPhysics)%domain(currentDomain)%dofVec(dummy)=t
00464 dummy=dummy+1
00465
00466 end if
00467
00468 end do
00469
00470
00471
00472
00473 IM(:,:,:,relative)=0
00474
00475 dummy=1
00476
00477 myModel%physics(currentPhysics)%domain(currentDomain)%firstIndex=dummy+globalCorrection
00478
00479 select case(relativeModel)
00480
00481
00482 case(relativeLex)
00483
00484 minI=>myModel%physics(currentPhysics)%domain(currentDomain)%minI
00485 minJ=>myModel%physics(currentPhysics)%domain(currentDomain)%minJ
00486 maxI=>myModel%physics(currentPhysics)%domain(currentDomain)%maxI
00487 maxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%maxJ
00488
00489
00490 do j=minJ,maxJ
00491
00492
00493 do i=minI,maxI
00494
00495 do t=1,dof
00496
00497 if (IM(i,j,t,absolute).eq.0) cycle
00498
00499 if (IM(i,j,t,flag).eq.0) cycle
00500
00501 IM(i,j,t,relative)=dummy+globalCorrection
00502
00503 dummy=dummy+1
00504
00505 end do
00506
00507 end do
00508
00509 end do
00510
00511
00512 case(relativeBC)
00513
00514 do myBc=1,maxBc
00515
00516 bc=myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec(myBc)
00517 maxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%maxJ
00518
00519
00520
00521
00522 do myJ=1,maxJ
00523
00524 j=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myJ)
00525 maxI=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%maxI
00526
00527
00528
00529 do myI=1,maxI
00530
00531 i=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec(myI)
00532 maxT=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%maxT
00533
00534 do myT=1,maxT
00535
00536 t=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%tVec(myT)
00537
00538 IM(i,j,t,relative)=dummy+globalCorrection
00539
00540 dummy=dummy+1
00541
00542 end do
00543
00544 end do
00545
00546 end do
00547
00548
00549
00550
00551 end do
00552
00553 case default
00554
00555 print*,'invalid relative indexing option'
00556 print*,'demona-set stop!'
00557 stop
00558
00559
00560 end select
00561
00562
00563 currentSetLength=dummy-1
00564
00565 myModel%physics(currentPhysics)%domain(currentDomain)%lastIndex=currentSetLength
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576 allocate(myModel%physics(currentPhysics)%domain(currentDomain)%setVec(currentSetLength))
00577
00578 mysetVec=>myModel%physics(currentPhysics)%domain(currentDomain)%setVec
00579
00580
00581 do myBc=1,maxBc
00582
00583 bc=myModel%physics(currentPhysics)%domain(currentDomain)%set%bcVec(myBc)
00584 maxJ=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%maxJ
00585
00586
00587
00588
00589 do myJ=1,maxJ
00590
00591 j=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%jVec(myJ)
00592 maxI=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%maxI
00593
00594
00595
00596 do myI=1,maxI
00597
00598 i=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%iVec(myI)
00599 maxT=>myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%maxT
00600
00601 do myT=1,maxT
00602
00603 t=myModel%physics(currentPhysics)%domain(currentDomain)%set%bc(bc)%j(myJ)%i(myI)%tVec(myT)
00604
00605 mysetVec(IM(i,j,t,relative)-globalCorrection)=IM(i,j,t,absolute)
00606
00607 end do
00608
00609 end do
00610
00611 end do
00612
00613
00614
00615 end do
00616
00617 globalCorrection=currentSetLength+globalCorrection
00618
00619 end subroutine set