test program for smoothing, adjacency and modification
authorDmitriy Ofman <ofman1@uiuc.edu>
Mon, 1 Aug 2005 23:55:01 +0000 (23:55 +0000)
committerDmitriy Ofman <ofman1@uiuc.edu>
Mon, 1 Aug 2005 23:55:01 +0000 (23:55 +0000)
12 files changed:
examples/fem/adapt/test/mesh1.node [new file with mode: 0644]
examples/fem/adapt/test/mesh1.tri [new file with mode: 0644]
examples/fem/adapt/test/out.1024.ele [new file with mode: 0644]
examples/fem/adapt/test/out.1024.node [new file with mode: 0644]
examples/fem/adapt/test/pgm.1.C [new file with mode: 0644]
examples/fem/adapt/test/pgm.C [new file with mode: 0644]
examples/fem/adapt/test/pgm.h [new file with mode: 0644]
examples/fem/adapt/test/pgm.o [new file with mode: 0644]
examples/fem/adapt/test/vector2d.h [new file with mode: 0644]
examples/fem/adapt/test/xxx.1.edge [new file with mode: 0644]
examples/fem/adapt/test/xxx.1.ele [new file with mode: 0644]
examples/fem/adapt/test/xxx.1.node [new file with mode: 0644]

diff --git a/examples/fem/adapt/test/mesh1.node b/examples/fem/adapt/test/mesh1.node
new file mode 100644 (file)
index 0000000..70b806c
--- /dev/null
@@ -0,0 +1,59 @@
+57  2  0  1
+   1    0  0    -6
+   2    0.02  0    -2
+   3    0.02  0.02    -2
+   4    0.01  0.02    -2
+   5    0.01  0.01    -1
+   6    0  0.01    -6
+   7    0.01  0    -1
+   8    0.02  0.01    -2
+   9    0  0.0050000000000000001    -6
+  10    0.014999999999999999  0.005000000000000001    0
+  11    0.01  0.014999999999999999    -1
+  12    0.00390625  0    -1
+  13    0.00390625  0.01    -1
+  14    0.0069531249999999992  0.005000000000000001    0
+  15    0.0019531249999999993  0.0025000000000000001    0
+  16    0.0034765624999999992  0.0057031249999999981    0
+  17    0.0049240695224719092  0.0028081109550561804    0
+  18    0.0069531250000000001  0    -1
+  19    0.0084765624999999997  0.0025000000000000009    0
+  20    0.010976562499999998  0.0057376098632812506    0
+  21    0.014999999999999999  0    -1
+  22    0.011587703499251497  0.0026816791831376311    0
+  23    0.013576307093918881  0.0085763070939188814    0
+  24    0.02  0.0050000000000000001    -2
+  25    0.01390625  0.02    -2
+  26    0.013066758233450429  0.012500000000000001    0
+  27    0.013564266231855108  0.016241295912613196    0
+  28    0.02  0.014999999999999999    -2
+  29    0.016953124999999999  0.02    -2
+  30    0.016460378771708153  0.013952451616417925    0
+  31    0.017094619701834859  0.0079053802981651419    0
+  32    0.015829098106544193  0.010829443868521395    0
+  33    0.018476562499999998  0.017500000000000002    0
+  34    0.01583273656343865  0.017603090933189181    0
+  35    0.018223968712046377  0.011970654878770496    0
+  36    0.0069531250000000001  0.01    -1
+  37    0.0084765624999999997  0.0075000000000000006    0
+  38    0.0054296875000000005  0.0076777343749999984    0
+  39    0.012500000000000001  0    -1
+  40    0.0019140624999999991  0.0044824218749999999    0
+  41    0.001953125  0.008025390625    0
+  42    0.0091061821669161658  0.0045978468478082906    0
+  43    0.014204820751447649  0.0025000000000000005    0
+  44    0.017500000000000002  0    -1
+  45    0.012832619785600696  0.0045197189793690432    0
+  46    0.011296874093085477  0.0080540628322544675    0
+  47    0.01  0.012500000000000001    -1
+  48    0.012229300284308835  0.010396311211792197    0
+  49    0.011953125  0.018282794425981051    0
+  50    0.01216413856546906  0.014523754693104738    0
+  51    0.014331590608741146  0.014235532442613665    0
+  52    0.015121721263931479  0.0071199887093841823    0
+  53    0.017500000000000002  0.0054053802981651414    0
+  54    0.02  0.0074999999999999997    -2
+  55    0.017939474336792497  0.015458539537264178    0
+  56    0.02  0.001953125    -2
+  57    0.01740146277415424  0.0027026901490825707    0
+# Generated by triangle -a0.000005 mesh1.poly
diff --git a/examples/fem/adapt/test/mesh1.tri b/examples/fem/adapt/test/mesh1.tri
new file mode 100644 (file)
index 0000000..fa14b4e
--- /dev/null
@@ -0,0 +1,90 @@
+88  3  0
+   1      18    19    17
+   2      14    19    42
+   3      40    41     9
+   4      17    19    14
+   5      23    48    46
+   6      11    50    49
+   7      31    54     8
+   8      36    13    38
+   9      39    43    22
+  10      48     5    46
+  11      25    49    27
+  12      31     8    35
+  13       9     1    15
+  14      16    40    17
+  15      15    40     9
+  16       1    12    15
+  17      17    15    12
+  18      37     5    36
+  19       6    41    13
+  20      18     7    19
+  21      16    17    14
+  22       7    22    19
+  23      17    12    18
+  24      43    39    21
+  25      20    45    23
+  26      42    37    14
+  27      10    57    53
+  28      22    20    42
+  29      45    10    52
+  30      57    21    44
+  31      32    52    31
+  32      25    27    34
+  33      50    27    49
+  34      48    47     5
+  35      28    55    35
+  36      30    55    34
+  37      28     3    33
+  38      30    34    51
+  39      34    33    29
+  40      48    32    26
+  41       3    29    33
+  42      31    52    53
+  43      31    35    32
+  44      32    30    51
+  45      52    32    23
+  46      35    55    30
+  47      25    34    29
+  48      34    27    51
+  49      28    35     8
+  50      30    32    35
+  51      37    20    46
+  52      38    13    41
+  53      38    37    36
+  54      16    14    38
+  55      37    38    14
+  56      17    40    15
+  57      22     7    39
+  58      41    40    16
+  59       9    41     6
+  60      38    41    16
+  61      22    42    19
+  62      37    42    20
+  63      53    57    24
+  64      45    43    10
+  65      24    57    56
+  66      44    56    57
+  67      20    22    45
+  68      43    45    22
+  69      37    46     5
+  70      20    23    46
+  71      32    48    23
+  72      50    47    26
+  73      47    48    26
+  74      25     4    49
+  75      11    49     4
+  76      47    50    11
+  77      51    50    26
+  78      50    51    27
+  79      32    51    26
+  80      45    52    23
+  81      53    52    10
+  82      10    43    57
+  83      54    53    24
+  84      28    33    55
+  85      53    54    31
+  86      34    55    33
+  87      44     2    56
+  88      21    57    43
+# Generated by triangle -a0.000005 mesh1.poly
diff --git a/examples/fem/adapt/test/out.1024.ele b/examples/fem/adapt/test/out.1024.ele
new file mode 100644 (file)
index 0000000..eca29e7
--- /dev/null
@@ -0,0 +1,1025 @@
+1024 3 0
+1 290 82 146 
+2 291 83 147 
+3 148 292 84 
+4 85 149 293 
+5 294 86 150 
+6 295 87 151 
+7 152 296 88 
+8 89 153 297 
+9 154 298 90 
+10 155 299 91 
+11 92 156 300 
+12 301 93 157 
+13 94 158 302 
+14 95 159 303 
+15 304 96 160 
+16 161 305 97 
+17 162 306 98 
+18 163 307 99 
+19 100 164 308 
+20 309 101 165 
+21 166 310 102 
+22 167 311 103 
+23 104 168 312 
+24 313 105 169 
+25 170 314 106 
+26 171 315 107 
+27 108 172 316 
+28 317 109 173 
+29 318 110 174 
+30 319 111 175 
+31 176 320 112 
+32 113 177 321 
+33 322 82 178 
+34 323 83 179 
+35 180 324 84 
+36 85 181 325 
+37 182 326 114 
+38 183 327 115 
+39 116 184 328 
+40 329 117 185 
+41 118 186 330 
+42 119 187 331 
+43 332 120 188 
+44 189 333 121 
+45 334 114 190 
+46 335 115 191 
+47 192 336 116 
+48 117 193 337 
+49 194 338 98 
+50 195 339 99 
+51 100 196 340 
+52 341 101 197 
+53 342 122 198 
+54 343 123 199 
+55 200 344 124 
+56 125 201 345 
+57 346 106 202 
+58 347 107 203 
+59 204 348 108 
+60 109 205 349 
+61 126 206 350 
+62 127 207 351 
+63 352 128 208 
+64 209 353 129 
+65 210 354 130 
+66 211 355 131 
+67 132 212 356 
+68 357 133 213 
+69 358 46 150 
+70 359 47 151 
+71 152 360 48 
+72 49 153 361 
+73 154 362 50 
+74 155 363 51 
+75 52 156 364 
+76 365 53 157 
+77 366 134 214 
+78 367 135 215 
+79 216 368 136 
+80 137 217 369 
+81 138 218 370 
+82 139 219 371 
+83 372 140 220 
+84 221 373 141 
+85 58 218 374 
+86 59 219 375 
+87 376 60 220 
+88 221 377 61 
+89 222 378 130 
+90 223 379 131 
+91 132 224 380 
+92 381 133 225 
+93 382 62 174 
+94 383 63 175 
+95 176 384 64 
+96 65 177 385 
+97 26 178 386 
+98 27 179 387 
+99 388 28 180 
+100 181 389 29 
+101 182 390 66 
+102 183 391 67 
+103 68 184 392 
+104 393 69 185 
+105 70 186 394 
+106 71 187 395 
+107 396 72 188 
+108 189 397 73 
+109 134 226 398 
+110 135 227 399 
+111 400 136 228 
+112 229 401 137 
+113 210 402 42 
+114 211 403 43 
+115 44 212 404 
+116 405 45 213 
+117 406 102 230 
+118 407 103 231 
+119 232 408 104 
+120 105 233 409 
+121 234 26 386 
+122 235 27 387 
+123 388 236 28 
+124 29 389 237 
+125 78 206 410 
+126 79 207 411 
+127 412 80 208 
+128 209 413 81 
+129 238 414 82 
+130 239 415 83 
+131 84 240 416 
+132 417 85 241 
+133 242 418 86 
+134 243 419 87 
+135 88 244 420 
+136 421 89 245 
+137 90 298 170 
+138 91 299 171 
+139 172 92 300 
+140 301 173 93 
+141 422 94 246 
+142 423 95 247 
+143 248 424 96 
+144 97 249 425 
+145 98 306 166 
+146 99 307 167 
+147 168 100 308 
+148 309 169 101 
+149 102 250 426 
+150 103 251 427 
+151 428 104 252 
+152 253 429 105 
+153 106 254 430 
+154 107 255 431 
+155 432 108 256 
+156 257 433 109 
+157 258 434 110 
+158 259 435 111 
+159 112 260 436 
+160 437 113 261 
+161 82 414 242 
+162 83 415 243 
+163 244 84 416 
+164 417 245 85 
+165 114 326 198 
+166 115 327 199 
+167 200 116 328 
+168 329 201 117 
+169 438 118 262 
+170 439 119 263 
+171 264 440 120 
+172 121 265 441 
+173 442 11 258 
+174 443 13 259 
+175 260 444 10 
+176 12 261 445 
+177 238 446 14 
+178 239 447 15 
+179 16 240 448 
+180 449 17 241 
+181 266 450 122 
+182 267 451 123 
+183 124 268 452 
+184 453 125 269 
+185 106 430 234 
+186 107 431 235 
+187 236 108 432 
+188 433 237 109 
+189 454 126 270 
+190 455 127 271 
+191 272 456 128 
+192 129 273 457 
+193 130 354 146 
+194 131 355 147 
+195 148 132 356 
+196 357 149 133 
+197 274 46 358 
+198 275 47 359 
+199 360 276 48 
+200 49 361 277 
+201 112 436 222 
+202 110 434 223 
+203 224 113 437 
+204 435 225 111 
+205 366 158 134 
+206 367 159 135 
+207 136 368 160 
+208 161 137 369 
+209 162 138 370 
+210 163 139 371 
+211 372 164 140 
+212 141 373 165 
+213 250 458 39 
+214 251 459 41 
+215 38 252 460 
+216 461 40 253 
+217 254 462 26 
+218 255 463 27 
+219 28 256 464 
+220 465 29 257 
+221 454 226 126 
+222 455 227 127 
+223 128 456 228 
+224 229 129 457 
+225 466 46 274 
+226 467 47 275 
+227 276 468 48 
+228 49 277 469 
+229 86 418 230 
+230 87 419 231 
+231 232 88 420 
+232 421 233 89 
+233 70 394 278 
+234 71 395 279 
+235 280 72 396 
+236 397 281 73 
+237 30 190 470 
+238 31 191 471 
+239 472 32 192 
+240 193 473 33 
+241 124 452 194 
+242 122 450 195 
+243 196 125 453 
+244 451 197 123 
+245 102 426 266 
+246 103 427 267 
+247 268 104 428 
+248 429 269 105 
+249 474 142 282 
+250 475 143 283 
+251 284 476 144 
+252 145 285 477 
+253 78 410 286 
+254 79 411 287 
+255 288 80 412 
+256 413 289 81 
+257 146 82 322 
+258 147 83 323 
+259 324 148 84 
+260 85 325 149 
+261 150 478 30 
+262 151 479 31 
+263 32 152 480 
+264 481 33 153 
+265 34 154 482 
+266 35 155 483 
+267 484 36 156 
+268 157 485 37 
+269 486 30 158 
+270 487 31 159 
+271 160 488 32 
+272 33 161 489 
+273 338 162 98 
+274 339 163 99 
+275 100 340 164 
+276 165 101 341 
+277 406 166 102 
+278 407 167 103 
+279 104 408 168 
+280 169 105 409 
+281 346 170 106 
+282 347 171 107 
+283 108 348 172 
+284 173 109 349 
+285 174 490 35 
+286 175 491 37 
+287 34 176 492 
+288 493 36 177 
+289 178 494 46 
+290 179 495 47 
+291 48 180 496 
+292 497 49 181 
+293 334 182 114 
+294 335 183 115 
+295 116 336 184 
+296 185 117 337 
+297 498 34 186 
+298 499 35 187 
+299 188 500 36 
+300 37 189 501 
+301 190 502 62 
+302 191 503 63 
+303 64 192 504 
+304 505 65 193 
+305 42 194 506 
+306 43 195 507 
+307 508 44 196 
+308 197 509 45 
+309 198 510 11 
+310 199 511 13 
+311 10 200 512 
+312 513 12 201 
+313 202 514 74 
+314 203 515 75 
+315 76 204 516 
+316 517 77 205 
+317 518 35 206 
+318 519 37 207 
+319 208 520 34 
+320 36 209 521 
+321 378 210 130 
+322 379 211 131 
+323 132 380 212 
+324 213 133 381 
+325 486 150 30 
+326 487 151 31 
+327 32 488 152 
+328 153 33 489 
+329 34 492 154 
+330 35 490 155 
+331 156 36 493 
+332 491 157 37 
+333 214 134 398 
+334 215 135 399 
+335 400 216 136 
+336 137 401 217 
+337 522 5 218 
+338 523 5 219 
+339 220 524 5 
+340 5 221 525 
+341 218 5 523 
+342 219 5 525 
+343 522 220 5 
+344 5 524 221 
+345 50 222 526 
+346 51 223 527 
+347 528 52 224 
+348 225 529 53 
+349 518 174 35 
+350 519 175 37 
+351 34 520 176 
+352 177 36 521 
+353 178 46 466 
+354 179 47 467 
+355 468 180 48 
+356 49 469 181 
+357 30 478 182 
+358 31 479 183 
+359 184 32 480 
+360 481 185 33 
+361 186 34 482 
+362 187 35 483 
+363 484 188 36 
+364 37 485 189 
+365 530 62 226 
+366 531 63 227 
+367 228 532 64 
+368 65 229 533 
+369 10 512 210 
+370 11 510 211 
+371 212 12 513 
+372 511 213 13 
+373 230 534 66 
+374 231 535 67 
+375 68 232 536 
+376 537 69 233 
+377 474 234 142 
+378 475 235 143 
+379 144 476 236 
+380 237 145 477 
+381 206 35 499 
+382 207 37 501 
+383 498 208 34 
+384 36 500 209 
+385 290 238 82 
+386 291 239 83 
+387 84 292 240 
+388 241 85 293 
+389 294 242 86 
+390 295 243 87 
+391 88 296 244 
+392 245 89 297 
+393 90 170 538 
+394 91 171 539 
+395 540 92 172 
+396 173 541 93 
+397 246 94 302 
+398 247 95 303 
+399 304 248 96 
+400 97 305 249 
+401 446 166 14 
+402 447 167 15 
+403 16 448 168 
+404 169 17 449 
+405 102 310 250 
+406 103 311 251 
+407 252 104 312 
+408 313 253 105 
+409 106 314 254 
+410 107 315 255 
+411 256 108 316 
+412 317 257 109 
+413 318 258 110 
+414 319 259 111 
+415 112 320 260 
+416 261 113 321 
+417 494 242 46 
+418 495 243 47 
+419 48 496 244 
+420 245 49 497 
+421 442 198 11 
+422 443 199 13 
+423 10 444 200 
+424 201 12 445 
+425 262 118 330 
+426 263 119 331 
+427 332 264 120 
+428 121 333 265 
+429 502 258 62 
+430 503 259 63 
+431 64 504 260 
+432 261 65 505 
+433 42 506 238 
+434 43 507 239 
+435 240 44 508 
+436 509 241 45 
+437 342 266 122 
+438 343 267 123 
+439 124 344 268 
+440 269 125 345 
+441 514 234 74 
+442 515 235 75 
+443 76 516 236 
+444 237 77 517 
+445 270 126 350 
+446 271 127 351 
+447 352 272 128 
+448 129 353 273 
+449 462 146 26 
+450 463 147 27 
+451 28 464 148 
+452 149 29 465 
+453 422 274 94 
+454 423 275 95 
+455 96 424 276 
+456 277 97 425 
+457 362 222 50 
+458 363 223 51 
+459 52 364 224 
+460 225 53 365 
+461 158 30 470 
+462 159 31 471 
+463 472 160 32 
+464 33 473 161 
+465 38 460 162 
+466 39 458 163 
+467 164 40 461 
+468 459 165 41 
+469 58 374 250 
+470 59 375 251 
+471 252 60 376 
+472 377 253 61 
+473 50 526 254 
+474 51 527 255 
+475 256 52 528 
+476 529 257 53 
+477 226 62 382 
+478 227 63 383 
+479 384 228 64 
+480 65 385 229 
+481 142 274 542 
+482 143 275 543 
+483 544 144 276 
+484 277 545 145 
+485 390 230 66 
+486 391 231 67 
+487 68 392 232 
+488 233 69 393 
+489 278 90 538 
+490 279 91 539 
+491 540 280 92 
+492 93 541 281 
+493 190 62 530 
+494 191 63 531 
+495 532 192 64 
+496 65 533 193 
+497 402 194 42 
+498 403 195 43 
+499 44 404 196 
+500 197 45 405 
+501 534 266 66 
+502 535 267 67 
+503 68 536 268 
+504 269 69 537 
+505 282 142 542 
+506 283 143 543 
+507 544 284 144 
+508 145 545 285 
+509 286 119 439 
+510 287 121 441 
+511 438 288 118 
+512 120 440 289 
+513 42 290 146 
+514 43 291 147 
+515 148 44 292 
+516 293 149 45 
+517 46 294 150 
+518 47 295 151 
+519 152 48 296 
+520 297 153 49 
+521 154 50 298 
+522 155 51 299 
+523 300 156 52 
+524 53 301 157 
+525 302 158 54 
+526 303 159 55 
+527 56 304 160 
+528 161 57 305 
+529 162 58 306 
+530 163 59 307 
+531 308 164 60 
+532 61 309 165 
+533 166 58 310 
+534 167 59 311 
+535 312 168 60 
+536 61 313 169 
+537 170 50 314 
+538 171 51 315 
+539 316 172 52 
+540 53 317 173 
+541 62 318 174 
+542 63 319 175 
+543 176 64 320 
+544 321 177 65 
+545 26 322 178 
+546 27 323 179 
+547 180 28 324 
+548 325 181 29 
+549 182 66 326 
+550 183 67 327 
+551 328 184 68 
+552 69 329 185 
+553 330 186 70 
+554 331 187 71 
+555 72 332 188 
+556 189 73 333 
+557 30 334 190 
+558 31 335 191 
+559 192 32 336 
+560 337 193 33 
+561 194 38 338 
+562 195 39 339 
+563 340 196 40 
+564 41 341 197 
+565 66 342 198 
+566 67 343 199 
+567 200 68 344 
+568 345 201 69 
+569 18 346 202 
+570 19 347 203 
+571 204 20 348 
+572 349 205 21 
+573 350 206 78 
+574 351 207 79 
+575 80 352 208 
+576 209 81 353 
+577 210 42 354 
+578 211 43 355 
+579 356 212 44 
+580 45 357 213 
+581 94 358 150 
+582 95 359 151 
+583 152 96 360 
+584 361 153 97 
+585 154 112 362 
+586 155 110 363 
+587 364 156 113 
+588 111 365 157 
+589 54 366 214 
+590 55 367 215 
+591 216 56 368 
+592 369 217 57 
+593 370 218 58 
+594 371 219 59 
+595 60 372 220 
+596 221 61 373 
+597 374 218 139 
+598 375 219 141 
+599 138 376 220 
+600 221 140 377 
+601 222 10 378 
+602 223 11 379 
+603 380 224 12 
+604 13 381 225 
+605 126 382 174 
+606 127 383 175 
+607 176 128 384 
+608 385 177 129 
+609 386 178 142 
+610 387 179 143 
+611 144 388 180 
+612 181 145 389 
+613 182 86 390 
+614 183 87 391 
+615 392 184 88 
+616 89 393 185 
+617 394 186 90 
+618 395 187 91 
+619 92 396 188 
+620 189 93 397 
+621 398 226 22 
+622 399 227 23 
+623 24 400 228 
+624 229 25 401 
+625 210 124 402 
+626 211 122 403 
+627 404 212 125 
+628 123 405 213 
+629 14 406 230 
+630 15 407 231 
+631 232 16 408 
+632 409 233 17 
+633 234 386 142 
+634 235 387 143 
+635 144 236 388 
+636 389 145 237 
+637 410 206 119 
+638 411 207 121 
+639 118 412 208 
+640 209 120 413 
+641 238 14 414 
+642 239 15 415 
+643 416 240 16 
+644 17 417 241 
+645 242 14 418 
+646 243 15 419 
+647 420 244 16 
+648 17 421 245 
+649 298 50 170 
+650 299 51 171 
+651 172 300 52 
+652 53 173 301 
+653 6 422 246 
+654 7 423 247 
+655 248 8 424 
+656 425 249 9 
+657 306 58 166 
+658 307 59 167 
+659 168 308 60 
+660 61 169 309 
+661 426 250 39 
+662 427 251 41 
+663 38 428 252 
+664 253 40 429 
+665 430 254 26 
+666 431 255 27 
+667 28 432 256 
+668 257 29 433 
+669 258 11 434 
+670 259 13 435 
+671 436 260 10 
+672 12 437 261 
+673 414 14 242 
+674 415 15 243 
+675 244 416 16 
+676 17 245 417 
+677 326 66 198 
+678 327 67 199 
+679 200 328 68 
+680 69 201 329 
+681 1 438 262 
+682 3 439 263 
+683 264 2 440 
+684 441 265 4 
+685 114 442 258 
+686 115 443 259 
+687 260 116 444 
+688 445 261 117 
+689 238 98 446 
+690 239 99 447 
+691 448 240 100 
+692 101 449 241 
+693 266 39 450 
+694 267 41 451 
+695 452 268 38 
+696 40 453 269 
+697 430 26 234 
+698 431 27 235 
+699 236 432 28 
+700 29 237 433 
+701 22 454 270 
+702 23 455 271 
+703 272 24 456 
+704 457 273 25 
+705 354 42 146 
+706 355 43 147 
+707 148 356 44 
+708 45 149 357 
+709 274 358 94 
+710 275 359 95 
+711 96 276 360 
+712 361 97 277 
+713 436 10 222 
+714 434 11 223 
+715 224 437 12 
+716 13 225 435 
+717 54 158 366 
+718 55 159 367 
+719 368 56 160 
+720 161 369 57 
+721 162 370 58 
+722 163 371 59 
+723 60 164 372 
+724 373 61 165 
+725 250 139 458 
+726 251 141 459 
+727 460 252 138 
+728 140 461 253 
+729 254 130 462 
+730 255 131 463 
+731 464 256 132 
+732 133 465 257 
+733 22 226 454 
+734 23 227 455 
+735 456 24 228 
+736 229 457 25 
+737 142 466 274 
+738 143 467 275 
+739 276 144 468 
+740 469 277 145 
+741 418 14 230 
+742 419 15 231 
+743 232 420 16 
+744 17 233 421 
+745 394 90 278 
+746 395 91 279 
+747 280 396 92 
+748 93 281 397 
+749 470 190 134 
+750 471 191 135 
+751 136 472 192 
+752 193 137 473 
+753 452 38 194 
+754 450 39 195 
+755 196 453 40 
+756 41 197 451 
+757 426 39 266 
+758 427 41 267 
+759 268 428 38 
+760 40 269 429 
+761 74 474 282 
+762 75 475 283 
+763 284 76 476 
+764 477 285 77 
+765 410 119 286 
+766 411 121 287 
+767 288 412 118 
+768 120 289 413 
+769 146 322 26 
+770 147 323 27 
+771 28 148 324 
+772 325 29 149 
+773 150 86 478 
+774 151 87 479 
+775 480 152 88 
+776 89 481 153 
+777 482 154 90 
+778 483 155 91 
+779 92 484 156 
+780 157 93 485 
+781 94 486 158 
+782 95 487 159 
+783 160 96 488 
+784 489 161 97 
+785 38 162 338 
+786 39 163 339 
+787 340 40 164 
+788 165 341 41 
+789 14 166 406 
+790 15 167 407 
+791 408 16 168 
+792 169 409 17 
+793 18 170 346 
+794 19 171 347 
+795 348 20 172 
+796 173 349 21 
+797 174 110 490 
+798 175 111 491 
+799 492 176 112 
+800 113 493 177 
+801 178 82 494 
+802 179 83 495 
+803 496 180 84 
+804 85 497 181 
+805 30 182 334 
+806 31 183 335 
+807 336 32 184 
+808 185 337 33 
+809 118 498 186 
+810 119 499 187 
+811 188 120 500 
+812 501 189 121 
+813 190 114 502 
+814 191 115 503 
+815 504 192 116 
+816 117 505 193 
+817 506 194 98 
+818 507 195 99 
+819 100 508 196 
+820 197 101 509 
+821 198 122 510 
+822 199 123 511 
+823 512 200 124 
+824 125 513 201 
+825 202 106 514 
+826 203 107 515 
+827 516 204 108 
+828 109 517 205 
+829 126 518 206 
+830 127 519 207 
+831 208 128 520 
+832 521 209 129 
+833 10 210 378 
+834 11 211 379 
+835 380 12 212 
+836 213 381 13 
+837 94 150 486 
+838 95 151 487 
+839 488 96 152 
+840 153 489 97 
+841 492 112 154 
+842 490 110 155 
+843 156 493 113 
+844 111 157 491 
+845 214 398 22 
+846 215 399 23 
+847 24 216 400 
+848 401 25 217 
+849 138 522 218 
+850 139 523 219 
+851 220 140 524 
+852 525 221 141 
+853 218 523 139 
+854 219 525 141 
+855 138 220 522 
+856 524 140 221 
+857 526 222 130 
+858 527 223 131 
+859 132 528 224 
+860 225 133 529 
+861 126 174 518 
+862 127 175 519 
+863 520 128 176 
+864 177 521 129 
+865 178 466 142 
+866 179 467 143 
+867 144 180 468 
+868 469 145 181 
+869 478 86 182 
+870 479 87 183 
+871 184 480 88 
+872 89 185 481 
+873 186 482 90 
+874 187 483 91 
+875 92 188 484 
+876 485 93 189 
+877 134 530 226 
+878 135 531 227 
+879 228 136 532 
+880 533 229 137 
+881 512 124 210 
+882 510 122 211 
+883 212 513 125 
+884 123 213 511 
+885 230 102 534 
+886 231 103 535 
+887 536 232 104 
+888 105 537 233 
+889 74 234 474 
+890 75 235 475 
+891 476 76 236 
+892 237 477 77 
+893 206 499 119 
+894 207 501 121 
+895 118 208 498 
+896 500 120 209 
+897 42 238 290 
+898 43 239 291 
+899 292 44 240 
+900 241 293 45 
+901 46 242 294 
+902 47 243 295 
+903 296 48 244 
+904 245 297 49 
+905 538 170 18 
+906 539 171 19 
+907 20 540 172 
+908 173 21 541 
+909 246 302 54 
+910 247 303 55 
+911 56 248 304 
+912 305 57 249 
+913 98 166 446 
+914 99 167 447 
+915 448 100 168 
+916 169 449 101 
+917 310 58 250 
+918 311 59 251 
+919 252 312 60 
+920 61 253 313 
+921 314 50 254 
+922 315 51 255 
+923 256 316 52 
+924 53 257 317 
+925 62 258 318 
+926 63 259 319 
+927 320 64 260 
+928 261 321 65 
+929 82 242 494 
+930 83 243 495 
+931 496 84 244 
+932 245 497 85 
+933 114 198 442 
+934 115 199 443 
+935 444 116 200 
+936 201 445 117 
+937 262 330 70 
+938 263 331 71 
+939 72 264 332 
+940 333 73 265 
+941 114 258 502 
+942 115 259 503 
+943 504 116 260 
+944 261 505 117 
+945 506 98 238 
+946 507 99 239 
+947 240 508 100 
+948 101 241 509 
+949 66 266 342 
+950 67 267 343 
+951 344 68 268 
+952 269 345 69 
+953 106 234 514 
+954 107 235 515 
+955 516 108 236 
+956 237 517 109 
+957 270 350 78 
+958 271 351 79 
+959 80 272 352 
+960 353 81 273 
+961 130 146 462 
+962 131 147 463 
+963 464 132 148 
+964 149 465 133 
+965 6 274 422 
+966 7 275 423 
+967 424 8 276 
+968 277 425 9 
+969 112 222 362 
+970 110 223 363 
+971 364 113 224 
+972 225 365 111 
+973 158 470 134 
+974 159 471 135 
+975 136 160 472 
+976 473 137 161 
+977 460 138 162 
+978 458 139 163 
+979 164 461 140 
+980 141 165 459 
+981 374 139 250 
+982 375 141 251 
+983 252 376 138 
+984 140 253 377 
+985 526 130 254 
+986 527 131 255 
+987 256 528 132 
+988 133 257 529 
+989 226 382 126 
+990 227 383 127 
+991 128 228 384 
+992 385 129 229 
+993 542 274 6 
+994 543 275 7 
+995 8 544 276 
+996 277 9 545 
+997 86 230 390 
+998 87 231 391 
+999 392 88 232 
+1000 233 393 89 
+1001 278 538 18 
+1002 279 539 19 
+1003 20 280 540 
+1004 541 21 281 
+1005 190 530 134 
+1006 191 531 135 
+1007 136 192 532 
+1008 533 137 193 
+1009 124 194 402 
+1010 122 195 403 
+1011 404 125 196 
+1012 197 405 123 
+1013 102 266 534 
+1014 103 267 535 
+1015 536 104 268 
+1016 269 537 105 
+1017 282 542 6 
+1018 283 543 7 
+1019 8 284 544 
+1020 545 9 285 
+1021 286 439 3 
+1022 287 441 4 
+1023 1 288 438 
+1024 440 2 289 
diff --git a/examples/fem/adapt/test/out.1024.node b/examples/fem/adapt/test/out.1024.node
new file mode 100644 (file)
index 0000000..97ce31d
--- /dev/null
@@ -0,0 +1,546 @@
+545 2 0 0
+1 0.0000000000 0.0050000000 
+2 0.0000000000 0.0000000000 
+3 0.0050000000 0.0050000000 
+4 0.0050000000 0.0000000000 
+5 0.0025000000 0.0025000000 
+6 0.0025000000 0.0050000000 
+7 0.0050000000 0.0025000000 
+8 0.0000000000 0.0025000000 
+9 0.0025000000 0.0000000000 
+10 0.0012500000 0.0037500000 
+11 0.0037500000 0.0037500000 
+12 0.0012500000 0.0012500000 
+13 0.0037500000 0.0012500000 
+14 0.0025000000 0.0037500000 
+15 0.0037500000 0.0025000000 
+16 0.0012500000 0.0025000000 
+17 0.0025000000 0.0012500000 
+18 0.0012500000 0.0050000000 
+19 0.0050000000 0.0037500000 
+20 0.0000000000 0.0012500000 
+21 0.0037500000 0.0000000000 
+22 0.0037500000 0.0050000000 
+23 0.0050000000 0.0012500000 
+24 0.0000000000 0.0037500000 
+25 0.0012500000 0.0000000000 
+26 0.0018750000 0.0043750000 
+27 0.0043750000 0.0031250000 
+28 0.0006250000 0.0018750000 
+29 0.0031250000 0.0006250000 
+30 0.0031250000 0.0043750000 
+31 0.0043750000 0.0018750000 
+32 0.0006250000 0.0031250000 
+33 0.0018750000 0.0006250000 
+34 0.0006250000 0.0043750000 
+35 0.0043750000 0.0043750000 
+36 0.0006250000 0.0006250000 
+37 0.0043750000 0.0006250000 
+38 0.0018750000 0.0031250000 
+39 0.0031250000 0.0031250000 
+40 0.0018750000 0.0018750000 
+41 0.0031250000 0.0018750000 
+42 0.0018750000 0.0037500000 
+43 0.0037500000 0.0031250000 
+44 0.0012500000 0.0018750000 
+45 0.0031250000 0.0012500000 
+46 0.0025000000 0.0043750000 
+47 0.0043750000 0.0025000000 
+48 0.0006250000 0.0025000000 
+49 0.0025000000 0.0006250000 
+50 0.0012500000 0.0043750000 
+51 0.0043750000 0.0037500000 
+52 0.0006250000 0.0012500000 
+53 0.0037500000 0.0006250000 
+54 0.0031250000 0.0050000000 
+55 0.0050000000 0.0018750000 
+56 0.0000000000 0.0031250000 
+57 0.0018750000 0.0000000000 
+58 0.0025000000 0.0031250000 
+59 0.0031250000 0.0025000000 
+60 0.0018750000 0.0025000000 
+61 0.0025000000 0.0018750000 
+62 0.0037500000 0.0043750000 
+63 0.0043750000 0.0012500000 
+64 0.0006250000 0.0037500000 
+65 0.0012500000 0.0006250000 
+66 0.0031250000 0.0037500000 
+67 0.0037500000 0.0018750000 
+68 0.0012500000 0.0031250000 
+69 0.0018750000 0.0012500000 
+70 0.0006250000 0.0050000000 
+71 0.0050000000 0.0043750000 
+72 0.0000000000 0.0006250000 
+73 0.0043750000 0.0000000000 
+74 0.0018750000 0.0050000000 
+75 0.0050000000 0.0031250000 
+76 0.0000000000 0.0018750000 
+77 0.0031250000 0.0000000000 
+78 0.0043750000 0.0050000000 
+79 0.0050000000 0.0006250000 
+80 0.0000000000 0.0043750000 
+81 0.0006250000 0.0000000000 
+82 0.0021875000 0.0040625000 
+83 0.0040625000 0.0028125000 
+84 0.0009375000 0.0021875000 
+85 0.0028125000 0.0009375000 
+86 0.0028125000 0.0040625000 
+87 0.0040625000 0.0021875000 
+88 0.0009375000 0.0028125000 
+89 0.0021875000 0.0009375000 
+90 0.0009375000 0.0046875000 
+91 0.0046875000 0.0040625000 
+92 0.0003125000 0.0009375000 
+93 0.0040625000 0.0003125000 
+94 0.0028125000 0.0046875000 
+95 0.0046875000 0.0021875000 
+96 0.0003125000 0.0028125000 
+97 0.0021875000 0.0003125000 
+98 0.0021875000 0.0034375000 
+99 0.0034375000 0.0028125000 
+100 0.0015625000 0.0021875000 
+101 0.0028125000 0.0015625000 
+102 0.0028125000 0.0034375000 
+103 0.0034375000 0.0021875000 
+104 0.0015625000 0.0028125000 
+105 0.0021875000 0.0015625000 
+106 0.0015625000 0.0046875000 
+107 0.0046875000 0.0034375000 
+108 0.0003125000 0.0015625000 
+109 0.0034375000 0.0003125000 
+110 0.0040625000 0.0040625000 
+111 0.0040625000 0.0009375000 
+112 0.0009375000 0.0040625000 
+113 0.0009375000 0.0009375000 
+114 0.0034375000 0.0040625000 
+115 0.0040625000 0.0015625000 
+116 0.0009375000 0.0034375000 
+117 0.0015625000 0.0009375000 
+118 0.0003125000 0.0046875000 
+119 0.0046875000 0.0046875000 
+120 0.0003125000 0.0003125000 
+121 0.0046875000 0.0003125000 
+122 0.0034375000 0.0034375000 
+123 0.0034375000 0.0015625000 
+124 0.0015625000 0.0034375000 
+125 0.0015625000 0.0015625000 
+126 0.0040625000 0.0046875000 
+127 0.0046875000 0.0009375000 
+128 0.0003125000 0.0040625000 
+129 0.0009375000 0.0003125000 
+130 0.0015625000 0.0040625000 
+131 0.0040625000 0.0034375000 
+132 0.0009375000 0.0015625000 
+133 0.0034375000 0.0009375000 
+134 0.0034375000 0.0046875000 
+135 0.0046875000 0.0015625000 
+136 0.0003125000 0.0034375000 
+137 0.0015625000 0.0003125000 
+138 0.0021875000 0.0028125000 
+139 0.0028125000 0.0028125000 
+140 0.0021875000 0.0021875000 
+141 0.0028125000 0.0021875000 
+142 0.0021875000 0.0046875000 
+143 0.0046875000 0.0028125000 
+144 0.0003125000 0.0021875000 
+145 0.0028125000 0.0003125000 
+146 0.0018750000 0.0040625000 
+147 0.0040625000 0.0031250000 
+148 0.0009375000 0.0018750000 
+149 0.0031250000 0.0009375000 
+150 0.0028125000 0.0043750000 
+151 0.0043750000 0.0021875000 
+152 0.0006250000 0.0028125000 
+153 0.0021875000 0.0006250000 
+154 0.0009375000 0.0043750000 
+155 0.0043750000 0.0040625000 
+156 0.0006250000 0.0009375000 
+157 0.0040625000 0.0006250000 
+158 0.0031250000 0.0046875000 
+159 0.0046875000 0.0018750000 
+160 0.0003125000 0.0031250000 
+161 0.0018750000 0.0003125000 
+162 0.0021875000 0.0031250000 
+163 0.0031250000 0.0028125000 
+164 0.0018750000 0.0021875000 
+165 0.0028125000 0.0018750000 
+166 0.0025000000 0.0034375000 
+167 0.0034375000 0.0025000000 
+168 0.0015625000 0.0025000000 
+169 0.0025000000 0.0015625000 
+170 0.0012500000 0.0046875000 
+171 0.0046875000 0.0037500000 
+172 0.0003125000 0.0012500000 
+173 0.0037500000 0.0003125000 
+174 0.0040625000 0.0043750000 
+175 0.0043750000 0.0009375000 
+176 0.0006250000 0.0040625000 
+177 0.0009375000 0.0006250000 
+178 0.0021875000 0.0043750000 
+179 0.0043750000 0.0028125000 
+180 0.0006250000 0.0021875000 
+181 0.0028125000 0.0006250000 
+182 0.0031250000 0.0040625000 
+183 0.0040625000 0.0018750000 
+184 0.0009375000 0.0031250000 
+185 0.0018750000 0.0009375000 
+186 0.0006250000 0.0046875000 
+187 0.0046875000 0.0043750000 
+188 0.0003125000 0.0006250000 
+189 0.0043750000 0.0003125000 
+190 0.0034375000 0.0043750000 
+191 0.0043750000 0.0015625000 
+192 0.0006250000 0.0034375000 
+193 0.0015625000 0.0006250000 
+194 0.0018750000 0.0034375000 
+195 0.0034375000 0.0031250000 
+196 0.0015625000 0.0018750000 
+197 0.0031250000 0.0015625000 
+198 0.0034375000 0.0037500000 
+199 0.0037500000 0.0015625000 
+200 0.0012500000 0.0034375000 
+201 0.0015625000 0.0012500000 
+202 0.0015625000 0.0050000000 
+203 0.0050000000 0.0034375000 
+204 0.0000000000 0.0015625000 
+205 0.0034375000 0.0000000000 
+206 0.0043750000 0.0046875000 
+207 0.0046875000 0.0006250000 
+208 0.0003125000 0.0043750000 
+209 0.0006250000 0.0003125000 
+210 0.0015625000 0.0037500000 
+211 0.0037500000 0.0034375000 
+212 0.0012500000 0.0015625000 
+213 0.0034375000 0.0012500000 
+214 0.0034375000 0.0050000000 
+215 0.0050000000 0.0015625000 
+216 0.0000000000 0.0034375000 
+217 0.0015625000 0.0000000000 
+218 0.0025000000 0.0028125000 
+219 0.0028125000 0.0025000000 
+220 0.0021875000 0.0025000000 
+221 0.0025000000 0.0021875000 
+222 0.0012500000 0.0040625000 
+223 0.0040625000 0.0037500000 
+224 0.0009375000 0.0012500000 
+225 0.0037500000 0.0009375000 
+226 0.0037500000 0.0046875000 
+227 0.0046875000 0.0012500000 
+228 0.0003125000 0.0037500000 
+229 0.0012500000 0.0003125000 
+230 0.0028125000 0.0037500000 
+231 0.0037500000 0.0021875000 
+232 0.0012500000 0.0028125000 
+233 0.0021875000 0.0012500000 
+234 0.0018750000 0.0046875000 
+235 0.0046875000 0.0031250000 
+236 0.0003125000 0.0018750000 
+237 0.0031250000 0.0003125000 
+238 0.0021875000 0.0037500000 
+239 0.0037500000 0.0028125000 
+240 0.0012500000 0.0021875000 
+241 0.0028125000 0.0012500000 
+242 0.0025000000 0.0040625000 
+243 0.0040625000 0.0025000000 
+244 0.0009375000 0.0025000000 
+245 0.0025000000 0.0009375000 
+246 0.0028125000 0.0050000000 
+247 0.0050000000 0.0021875000 
+248 0.0000000000 0.0028125000 
+249 0.0021875000 0.0000000000 
+250 0.0028125000 0.0031250000 
+251 0.0031250000 0.0021875000 
+252 0.0018750000 0.0028125000 
+253 0.0021875000 0.0018750000 
+254 0.0015625000 0.0043750000 
+255 0.0043750000 0.0034375000 
+256 0.0006250000 0.0015625000 
+257 0.0034375000 0.0006250000 
+258 0.0037500000 0.0040625000 
+259 0.0040625000 0.0012500000 
+260 0.0009375000 0.0037500000 
+261 0.0012500000 0.0009375000 
+262 0.0003125000 0.0050000000 
+263 0.0050000000 0.0046875000 
+264 0.0000000000 0.0003125000 
+265 0.0046875000 0.0000000000 
+266 0.0031250000 0.0034375000 
+267 0.0034375000 0.0018750000 
+268 0.0015625000 0.0031250000 
+269 0.0018750000 0.0015625000 
+270 0.0040625000 0.0050000000 
+271 0.0050000000 0.0009375000 
+272 0.0000000000 0.0040625000 
+273 0.0009375000 0.0000000000 
+274 0.0025000000 0.0046875000 
+275 0.0046875000 0.0025000000 
+276 0.0003125000 0.0025000000 
+277 0.0025000000 0.0003125000 
+278 0.0009375000 0.0050000000 
+279 0.0050000000 0.0040625000 
+280 0.0000000000 0.0009375000 
+281 0.0040625000 0.0000000000 
+282 0.0021875000 0.0050000000 
+283 0.0050000000 0.0028125000 
+284 0.0000000000 0.0021875000 
+285 0.0028125000 0.0000000000 
+286 0.0046875000 0.0050000000 
+287 0.0050000000 0.0003125000 
+288 0.0000000000 0.0046875000 
+289 0.0003125000 0.0000000000 
+290 0.0020312500 0.0039062500 
+291 0.0039062500 0.0029687500 
+292 0.0010937500 0.0020312500 
+293 0.0029687500 0.0010937500 
+294 0.0026562500 0.0042187500 
+295 0.0042187500 0.0023437500 
+296 0.0007812500 0.0026562500 
+297 0.0023437500 0.0007812500 
+298 0.0010937500 0.0045312500 
+299 0.0045312500 0.0039062500 
+300 0.0004687500 0.0010937500 
+301 0.0039062500 0.0004687500 
+302 0.0029687500 0.0048437500 
+303 0.0048437500 0.0020312500 
+304 0.0001562500 0.0029687500 
+305 0.0020312500 0.0001562500 
+306 0.0023437500 0.0032812500 
+307 0.0032812500 0.0026562500 
+308 0.0017187500 0.0023437500 
+309 0.0026562500 0.0017187500 
+310 0.0026562500 0.0032812500 
+311 0.0032812500 0.0023437500 
+312 0.0017187500 0.0026562500 
+313 0.0023437500 0.0017187500 
+314 0.0014062500 0.0045312500 
+315 0.0045312500 0.0035937500 
+316 0.0004687500 0.0014062500 
+317 0.0035937500 0.0004687500 
+318 0.0039062500 0.0042187500 
+319 0.0042187500 0.0010937500 
+320 0.0007812500 0.0039062500 
+321 0.0010937500 0.0007812500 
+322 0.0020312500 0.0042187500 
+323 0.0042187500 0.0029687500 
+324 0.0007812500 0.0020312500 
+325 0.0029687500 0.0007812500 
+326 0.0032812500 0.0039062500 
+327 0.0039062500 0.0017187500 
+328 0.0010937500 0.0032812500 
+329 0.0017187500 0.0010937500 
+330 0.0004687500 0.0048437500 
+331 0.0048437500 0.0045312500 
+332 0.0001562500 0.0004687500 
+333 0.0045312500 0.0001562500 
+334 0.0032812500 0.0042187500 
+335 0.0042187500 0.0017187500 
+336 0.0007812500 0.0032812500 
+337 0.0017187500 0.0007812500 
+338 0.0020312500 0.0032812500 
+339 0.0032812500 0.0029687500 
+340 0.0017187500 0.0020312500 
+341 0.0029687500 0.0017187500 
+342 0.0032812500 0.0035937500 
+343 0.0035937500 0.0017187500 
+344 0.0014062500 0.0032812500 
+345 0.0017187500 0.0014062500 
+346 0.0014062500 0.0048437500 
+347 0.0048437500 0.0035937500 
+348 0.0001562500 0.0014062500 
+349 0.0035937500 0.0001562500 
+350 0.0042187500 0.0048437500 
+351 0.0048437500 0.0007812500 
+352 0.0001562500 0.0042187500 
+353 0.0007812500 0.0001562500 
+354 0.0017187500 0.0039062500 
+355 0.0039062500 0.0032812500 
+356 0.0010937500 0.0017187500 
+357 0.0032812500 0.0010937500 
+358 0.0026562500 0.0045312500 
+359 0.0045312500 0.0023437500 
+360 0.0004687500 0.0026562500 
+361 0.0023437500 0.0004687500 
+362 0.0010937500 0.0042187500 
+363 0.0042187500 0.0039062500 
+364 0.0007812500 0.0010937500 
+365 0.0039062500 0.0007812500 
+366 0.0032812500 0.0048437500 
+367 0.0048437500 0.0017187500 
+368 0.0001562500 0.0032812500 
+369 0.0017187500 0.0001562500 
+370 0.0023437500 0.0029687500 
+371 0.0029687500 0.0026562500 
+372 0.0020312500 0.0023437500 
+373 0.0026562500 0.0020312500 
+374 0.0026562500 0.0029687500 
+375 0.0029687500 0.0023437500 
+376 0.0020312500 0.0026562500 
+377 0.0023437500 0.0020312500 
+378 0.0014062500 0.0039062500 
+379 0.0039062500 0.0035937500 
+380 0.0010937500 0.0014062500 
+381 0.0035937500 0.0010937500 
+382 0.0039062500 0.0045312500 
+383 0.0045312500 0.0010937500 
+384 0.0004687500 0.0039062500 
+385 0.0010937500 0.0004687500 
+386 0.0020312500 0.0045312500 
+387 0.0045312500 0.0029687500 
+388 0.0004687500 0.0020312500 
+389 0.0029687500 0.0004687500 
+390 0.0029687500 0.0039062500 
+391 0.0039062500 0.0020312500 
+392 0.0010937500 0.0029687500 
+393 0.0020312500 0.0010937500 
+394 0.0007812500 0.0048437500 
+395 0.0048437500 0.0042187500 
+396 0.0001562500 0.0007812500 
+397 0.0042187500 0.0001562500 
+398 0.0035937500 0.0048437500 
+399 0.0048437500 0.0014062500 
+400 0.0001562500 0.0035937500 
+401 0.0014062500 0.0001562500 
+402 0.0017187500 0.0035937500 
+403 0.0035937500 0.0032812500 
+404 0.0014062500 0.0017187500 
+405 0.0032812500 0.0014062500 
+406 0.0026562500 0.0035937500 
+407 0.0035937500 0.0023437500 
+408 0.0014062500 0.0026562500 
+409 0.0023437500 0.0014062500 
+410 0.0045312500 0.0048437500 
+411 0.0048437500 0.0004687500 
+412 0.0001562500 0.0045312500 
+413 0.0004687500 0.0001562500 
+414 0.0023437500 0.0039062500 
+415 0.0039062500 0.0026562500 
+416 0.0010937500 0.0023437500 
+417 0.0026562500 0.0010937500 
+418 0.0026562500 0.0039062500 
+419 0.0039062500 0.0023437500 
+420 0.0010937500 0.0026562500 
+421 0.0023437500 0.0010937500 
+422 0.0026562500 0.0048437500 
+423 0.0048437500 0.0023437500 
+424 0.0001562500 0.0026562500 
+425 0.0023437500 0.0001562500 
+426 0.0029687500 0.0032812500 
+427 0.0032812500 0.0020312500 
+428 0.0017187500 0.0029687500 
+429 0.0020312500 0.0017187500 
+430 0.0017187500 0.0045312500 
+431 0.0045312500 0.0032812500 
+432 0.0004687500 0.0017187500 
+433 0.0032812500 0.0004687500 
+434 0.0039062500 0.0039062500 
+435 0.0039062500 0.0010937500 
+436 0.0010937500 0.0039062500 
+437 0.0010937500 0.0010937500 
+438 0.0001562500 0.0048437500 
+439 0.0048437500 0.0048437500 
+440 0.0001562500 0.0001562500 
+441 0.0048437500 0.0001562500 
+442 0.0035937500 0.0039062500 
+443 0.0039062500 0.0014062500 
+444 0.0010937500 0.0035937500 
+445 0.0014062500 0.0010937500 
+446 0.0023437500 0.0035937500 
+447 0.0035937500 0.0026562500 
+448 0.0014062500 0.0023437500 
+449 0.0026562500 0.0014062500 
+450 0.0032812500 0.0032812500 
+451 0.0032812500 0.0017187500 
+452 0.0017187500 0.0032812500 
+453 0.0017187500 0.0017187500 
+454 0.0039062500 0.0048437500 
+455 0.0048437500 0.0010937500 
+456 0.0001562500 0.0039062500 
+457 0.0010937500 0.0001562500 
+458 0.0029687500 0.0029687500 
+459 0.0029687500 0.0020312500 
+460 0.0020312500 0.0029687500 
+461 0.0020312500 0.0020312500 
+462 0.0017187500 0.0042187500 
+463 0.0042187500 0.0032812500 
+464 0.0007812500 0.0017187500 
+465 0.0032812500 0.0007812500 
+466 0.0023437500 0.0045312500 
+467 0.0045312500 0.0026562500 
+468 0.0004687500 0.0023437500 
+469 0.0026562500 0.0004687500 
+470 0.0032812500 0.0045312500 
+471 0.0045312500 0.0017187500 
+472 0.0004687500 0.0032812500 
+473 0.0017187500 0.0004687500 
+474 0.0020312500 0.0048437500 
+475 0.0048437500 0.0029687500 
+476 0.0001562500 0.0020312500 
+477 0.0029687500 0.0001562500 
+478 0.0029687500 0.0042187500 
+479 0.0042187500 0.0020312500 
+480 0.0007812500 0.0029687500 
+481 0.0020312500 0.0007812500 
+482 0.0007812500 0.0045312500 
+483 0.0045312500 0.0042187500 
+484 0.0004687500 0.0007812500 
+485 0.0042187500 0.0004687500 
+486 0.0029687500 0.0045312500 
+487 0.0045312500 0.0020312500 
+488 0.0004687500 0.0029687500 
+489 0.0020312500 0.0004687500 
+490 0.0042187500 0.0042187500 
+491 0.0042187500 0.0007812500 
+492 0.0007812500 0.0042187500 
+493 0.0007812500 0.0007812500 
+494 0.0023437500 0.0042187500 
+495 0.0042187500 0.0026562500 
+496 0.0007812500 0.0023437500 
+497 0.0026562500 0.0007812500 
+498 0.0004687500 0.0045312500 
+499 0.0045312500 0.0045312500 
+500 0.0004687500 0.0004687500 
+501 0.0045312500 0.0004687500 
+502 0.0035937500 0.0042187500 
+503 0.0042187500 0.0014062500 
+504 0.0007812500 0.0035937500 
+505 0.0014062500 0.0007812500 
+506 0.0020312500 0.0035937500 
+507 0.0035937500 0.0029687500 
+508 0.0014062500 0.0020312500 
+509 0.0029687500 0.0014062500 
+510 0.0035937500 0.0035937500 
+511 0.0035937500 0.0014062500 
+512 0.0014062500 0.0035937500 
+513 0.0014062500 0.0014062500 
+514 0.0017187500 0.0048437500 
+515 0.0048437500 0.0032812500 
+516 0.0001562500 0.0017187500 
+517 0.0032812500 0.0001562500 
+518 0.0042187500 0.0045312500 
+519 0.0045312500 0.0007812500 
+520 0.0004687500 0.0042187500 
+521 0.0007812500 0.0004687500 
+522 0.0023437500 0.0026562500 
+523 0.0026562500 0.0026562500 
+524 0.0023437500 0.0023437500 
+525 0.0026562500 0.0023437500 
+526 0.0014062500 0.0042187500 
+527 0.0042187500 0.0035937500 
+528 0.0007812500 0.0014062500 
+529 0.0035937500 0.0007812500 
+530 0.0035937500 0.0045312500 
+531 0.0045312500 0.0014062500 
+532 0.0004687500 0.0035937500 
+533 0.0014062500 0.0004687500 
+534 0.0029687500 0.0035937500 
+535 0.0035937500 0.0020312500 
+536 0.0014062500 0.0029687500 
+537 0.0020312500 0.0014062500 
+538 0.0010937500 0.0048437500 
+539 0.0048437500 0.0039062500 
+540 0.0001562500 0.0010937500 
+541 0.0039062500 0.0001562500 
+542 0.0023437500 0.0048437500 
+543 0.0048437500 0.0026562500 
+544 0.0001562500 0.0023437500 
+545 0.0026562500 0.0001562500 
diff --git a/examples/fem/adapt/test/pgm.1.C b/examples/fem/adapt/test/pgm.1.C
new file mode 100644 (file)
index 0000000..d1c174f
--- /dev/null
@@ -0,0 +1,484 @@
+#include "pgm.h"
+#include "mpi.h"
+#include "ckvector3d.h"
+#include "charm-api.h"
+#include "fem_mesh.h"
+#include "fem_adapt_new.h"
+
+
+extern void _registerFEMMeshModify(void);
+
+extern "C" void
+init(void)
+{
+  CkPrintf("init started\n");
+  double startTime=CmiWallTimer();
+  const char *eleName="mesh1.tri";
+  const char *nodeName="mesh1.node";
+  int nPts=0; //Number of nodes
+  vector2d *pts=0; //Node coordinates
+
+  CkPrintf("Reading node coordinates from %s\n",nodeName);
+  //Open and read the node coordinate file
+  {
+    char line[1024];
+    FILE *f=fopen(nodeName,"r");
+    if (f==NULL) die("Can't open node file!");
+    fgets(line,1024,f);
+    if (1!=sscanf(line,"%d",&nPts)) die("Can't read number of points!");
+    pts=new vector2d[nPts];
+    for (int i=0;i<nPts;i++) {
+      int ptNo;
+      if (NULL==fgets(line,1024,f)) die("Can't read node input line!");
+      if (3!=sscanf(line,"%d%lf%lf",&ptNo,&pts[i].x,&pts[i].y)) 
+       die("Can't parse node input line!");
+    }
+    fclose(f);
+  }
+  int nEle=0;
+  connRec *ele=NULL;
+  CkPrintf("Reading elements from %s\n",eleName);
+  //Open and read the element connectivity file
+  {
+    char line[1024];
+    FILE *f=fopen(eleName,"r");
+    if (f==NULL) die("Can't open element file!");
+    fgets(line,1024,f);
+    if (1!=sscanf(line,"%d",&nEle)) die("Can't read number of elements!");
+    ele=new connRec[nEle];
+    for (int i=0;i<nEle;i++) {
+      int elNo;
+      if (NULL==fgets(line,1024,f)) die("Can't read element input line!");
+      if (4!=sscanf(line,"%d%d%d%d",&elNo,&ele[i][0],&ele[i][1],&ele[i][2])) 
+       die("Can't parse element input line!");  
+      ele[i][0]--; //Fortran to C indexing
+      ele[i][1]--; //Fortran to C indexing
+      ele[i][2]--; //Fortran to C indexing
+    }
+    fclose(f);
+  }
+
+
+  int fem_mesh=FEM_Mesh_default_write(); // Tell framework we are writing to the mesh
+
+  CkPrintf("Passing node coords to framework\n");
+
+
+  FEM_Mesh_data(fem_mesh,        // Add nodes to the current mesh
+                FEM_NODE,        // We are registering nodes
+                FEM_DATA+0,      // Register the point locations which are normally 
+                                 // the first data elements for an FEM_NODE
+                (double *)pts,   // The array of point locations
+                0,               // 0 based indexing
+                nPts,            // The number of points
+                FEM_DOUBLE,      // Coordinates are doubles
+                2);              // Points have dimension 2 (x,y)
+
+  CkPrintf("Passing elements to framework\n");
+
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_ELEM+0,      // We are registering elements with type 0
+                                 // The next type of element could be registered with FEM_ELEM+1
+                FEM_CONN,        // Register the connectivity table for this
+                                 // data elements for this type of FEM entity
+                (int *)ele,      // The array of point locations
+                0,               // 0 based indexing
+                nEle,            // The number of elements
+                FEM_INDEX_0,     // We use zero based node numbering
+                3);              // Elements have degree 3, since triangles are defined 
+                                 // by three nodes
+  delete[] ele;
+  delete[] pts;
+
+
+
+
+  // Register values to the elements so we can keep track of them after partitioning
+  int *values;
+  values=new int[nEle];
+  for(int i=0;i<nEle;i++)values[i]=i;
+
+  // triangles
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_ELEM,      // We are registering elements with type 1
+                FEM_DATA,   
+                (int *)values,   // The array of point locations
+                0,               // 0 based indexing
+                nEle,            // The number of elements
+                FEM_INT,         // We use zero based node numbering
+                1);
+  
+  delete [] values;
+  values=new int[nPts];
+  for (int i=0; i<nPts; i++) values[i]=i;
+  
+  
+
+  // triangles
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_NODE,      // We are registering elements with type 1
+                FEM_DATA+1,   
+                (int *)values,   // The array of point locations
+                0,               // 0 based indexing
+                nPts,            // The number of elements
+                FEM_INT,         // We use zero based node numbering
+                1);
+
+  delete [] values; 
+
+  // add ghost layers
+
+       const int triangleFaces[6] = {0,1,2};
+       CkPrintf("Adding Ghost layers\n");
+    FEM_Add_ghost_layer(1,1);
+    FEM_Add_ghost_elem(0,3,triangleFaces);
+
+       CkPrintf("Finished with init (Reading took %.f s)\n",CmiWallTimer()-startTime);
+
+}
+
+
+// A driver() function 
+// driver() is required in all FEM programs
+extern "C" void
+driver(void)
+{
+  int *neighbors, *adjnodes, adjSz, *adjelems;
+  int nnodes,nelems,nelems2,ignored;
+  int i, myId=FEM_My_partition();
+  myGlobals g;
+  FEM_Register(&g,(FEM_PupFn)pup_myGlobals);
+  int mesh=FEM_Mesh_default_read(); // Tell framework we are reading data from the mesh
+  FEM_Mesh *meshP = FEM_Mesh_lookup(mesh, "driver");
+  _registerFEMMeshModify();
+
+  printf("partition %d is in driver\n", myId);
+
+   
+  // Get node data
+  nnodes=FEM_Mesh_get_length(mesh,FEM_NODE); // Get number of nodes
+  g.nnodes=nnodes;
+  g.coord=new vector2d[nnodes];
+  // Get node positions
+  FEM_Mesh_data(mesh, FEM_NODE, FEM_DATA+0, (double*)g.coord, 0, nnodes, FEM_DOUBLE, 2);  
+
+
+  // Get element data
+  nelems=FEM_Mesh_get_length(mesh,FEM_ELEM+0); // Get number of elements
+  g.nelems=nelems;
+  g.conn=new connRec[nelems];
+  // Get connectivity for elements
+  FEM_Mesh_data(mesh, FEM_ELEM+0, FEM_CONN, (int *)g.conn, 0, nelems, FEM_INDEX_0, 3);  
+
+
+  {
+       int j;
+       const int triangleFaces[6] = {0,1,1,2,2,0};
+       FEM_Add_elem2face_tuples(mesh, 0, 2, 3, triangleFaces);
+       FEM_Mesh_create_elem_elem_adjacency(mesh);
+       FEM_Mesh_allocate_valid_attr(mesh, FEM_ELEM+0);
+       FEM_Mesh_allocate_valid_attr(mesh, FEM_NODE);
+       FEM_Mesh_create_node_elem_adjacency(mesh);
+       FEM_Mesh_create_node_node_adjacency(mesh);
+
+       
+       FEM_Print_Mesh_Summary(mesh);
+       
+       int tuplesPerElem = 3;
+       int elementNum = 0;
+       
+
+       int *values, *nvalues;
+       double *valuesDouble, *nvaluesDouble;
+       values = new int[g.nelems];
+       nvalues = new int[g.nnodes];
+       valuesDouble = new double[g.nelems];
+       nvaluesDouble = new double[g.nnodes];
+
+       FEM_Mesh_data(mesh, FEM_ELEM+elementNum, FEM_DATA, values, 0, g.nelems, FEM_INT, 1);
+       FEM_Mesh_data(mesh, FEM_NODE, FEM_DATA+1, nvalues, 0, g.nnodes, FEM_INT, 1);
+
+       for (int i=0; i<g.nelems; i++) valuesDouble[i]=values[i];
+       for (int i=0; i<g.nnodes; i++) nvaluesDouble[i]=nvalues[i];
+
+       // ghost data
+       int ng=FEM_Mesh_get_length(mesh,FEM_GHOST+FEM_ELEM+elementNum); 
+       int *valuesg, *nvaluesg;
+       valuesg=new int[ng];
+       int ngn = FEM_Mesh_get_length(mesh,FEM_GHOST+FEM_NODE);
+       nvaluesg = new int[ngn];
+
+       FEM_Mesh_data(mesh, FEM_GHOST+FEM_ELEM+elementNum, FEM_DATA, valuesg, 0, ng, FEM_INT, 1);
+       FEM_Mesh_data(mesh, FEM_GHOST+FEM_NODE, FEM_DATA+1, nvaluesg, 0, ngn, FEM_INT, 1);
+
+/*  vector2d *coords;
+  connRec *conns;
+  conns=new connRec[g.nelems];
+  coords=new vector2d[g.nnodes];
+  for (int i=0; i<g.nnodes; i++) {
+    CkPrintf("oldCoords[%d]: (%f, %f)\n", i, g.coord[i].x, g.coord[i].y);
+    coords[nvalues[i]]=g.coord[i];  
+    CkPrintf("node %d has val %d\n", i, nvalues[i]);
+  }
+  for (int i=0; i<g.nelems;i++) {
+    for (int j=0; j<3; j++) {
+      conns[i][j]=nvalues[g.conn[i][j]];
+    }    
+  }*/
+  if(0) {
+       int t=0;
+       NetFEM n=NetFEM_Begin(FEM_My_partition(),t,2,NetFEM_WRITE);
+       NetFEM_Nodes(n,nnodes,(double *)g.coord,"Position (m)");
+//     NetFEM_Scalar(n,nvaluesDouble, 1, "nodeNums");
+       NetFEM_Elements(n,nelems,3,(int *)g.conn,"Triangles");
+       NetFEM_Scalar(n,valuesDouble,1,"elemNums");
+       NetFEM_End(n);
+  }
+
+
+
+       // Test out adjacencies here
+       CkPrintf("\n  *** TESTING E2E ADJACENCIES *** \n\n");
+       neighbors=new int[3];
+       for (int i=0; i<g.nelems; i++) {
+         meshP->e2e_getAll(i, neighbors);
+         CkPrintf(" %d:  e2e : ", myId);
+         if (values[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", values[i]);
+         for (j=0; j<3; j++) {
+           if (neighbors[j]<-1) 
+           {
+             if (valuesg[FEM_From_ghost_index(neighbors[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",valuesg[FEM_From_ghost_index(neighbors[j])]);
+           }
+           else if (neighbors[j]>-1) {
+             if (values[neighbors[j]]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", values[neighbors[j]]);
+           }
+           else {
+             CkPrintf("(%d) ", neighbors[j]);
+           }
+           if (j<2) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }
+
+       delete [] neighbors;    
+
+       CkPrintf("\n  *** TESTING E2N ADJACENCIES *** \n\n");
+       neighbors=new int[3];
+       for (int i=0; i<g.nelems; i++) {
+         meshP->e2n_getAll(i, neighbors);
+         CkPrintf(" %d:  e2n : ", myId);
+         if (values[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", values[i]);
+         for (j=0; j<3; j++) {
+           if (neighbors[j]<-1) 
+           {
+             if (nvaluesg[FEM_From_ghost_index(neighbors[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",neighbors[j]);
+           }
+           else if (neighbors[j]>-1) {
+             if (neighbors[j]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", neighbors[j]);//coords[i].x, g.coord[i].y
+           }
+           else {
+             CkPrintf("(%d) ", neighbors[j]);
+           }
+           if (j<2) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }
+
+      
+       CkPrintf("\n  *** TESTING N2N ADJACENCIES *** \n\n");
+       for (int i=0; i<g.nnodes; i++) {
+         meshP->n2n_getAll(i, &adjnodes, &adjSz);
+         CkPrintf(" %d:  n2n : ", myId);
+         if (i<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", i);
+         for (int j=0; j<adjSz; j++){
+           if (adjnodes[j]<-1) 
+           {
+             if (nvaluesg[FEM_From_ghost_index(adjnodes[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",adjnodes[j]);
+           }
+           else if (adjnodes[j]>-1) {
+             if (adjnodes[j]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", adjnodes[j]);
+           }
+           else {
+             CkPrintf("(%d) ", adjnodes[j]);
+           }
+           if (j<adjSz-1) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }       
+      
+       delete [] adjnodes;
+
+       CkPrintf("\n  *** TESTING N2E ADJACENCIES *** \n\n");
+       for (int i=0; i<g.nnodes; i++) {
+         meshP->n2e_getAll(i, &adjelems, &adjSz);
+         CkPrintf(" %d:  n2e : ", myId);
+         if (i<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", i);
+         for (int j=0; j<adjSz; j++){
+           if (adjelems[j]<-1) 
+           {
+             if (adjelems[j]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",adjelems[j]);
+           }
+           else if (adjnodes[j]>-1) {
+             if (adjelems[j]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", adjelems[j]);
+           }
+           else {
+             CkPrintf("(%d) ", adjelems[j]);
+           }
+           if (j<adjSz-1) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }       
+  }
+
+  {
+/*     int rank = 0;
+       MPI_Comm comm = MPI_COMM_WORLD;
+       MPI_Comm_rank(comm,&rank);
+       int adjs[2];
+       if(rank == 0) {
+         adjs[0] = 20;
+         adjs[1] = 21;
+       } else if(rank == 2) {
+         adjs[0] = 8;
+         adjs[1] = 16;
+       } else if(rank == 1) {
+         adjs[0] = 11;
+         adjs[1] = 9;
+       } else {
+         adjs[0] = 0;
+         adjs[1] = 1;
+       }
+       int newnode = 0;
+       MPI_Barrier(comm);
+       FEM_REF_INIT(mesh);
+       CkPrintf("Shadow arrays have been bound\n");
+
+       //if(rank == 0) {
+         FEM_Modify_Lock(mesh, adjs, 2, adjs, 0);
+         CkPrintf("locked chunk\n");
+         
+         newnode = FEM_add_node(mesh, adjs, 2, 0);
+         CkPrintf("newnode=%d\n", newnode);
+         FEM_Print_Mesh_Summary(mesh);
+
+         adjs[0] = newnode;
+         newnode = FEM_add_node(mesh, adjs, 2, 0);
+         CkPrintf("newnode=%d\n", newnode);
+
+         FEM_Print_Mesh_Summary(mesh);
+         int removenode = newnode;
+         FEM_remove_node(mesh, removenode);
+
+         FEM_Modify_Unlock(mesh);
+         CkPrintf("Unlocked chunk\n");
+         //}
+       FEM_Print_Mesh_Summary(mesh);
+       */
+       /*      
+       CkPrintf("Marking 5 nodes and one element as invalid\n");
+       FEM_set_entity_invalid(mesh, FEM_NODE, 5);
+       FEM_set_entity_invalid(mesh, FEM_NODE, 6);
+       FEM_set_entity_invalid(mesh, FEM_NODE, 7);
+       FEM_set_entity_invalid(mesh, FEM_NODE, 8);
+       FEM_set_entity_invalid(mesh, FEM_NODE, 9);      
+       FEM_set_entity_invalid(mesh, FEM_ELEM, 9);
+       FEM_Print_Mesh_Summary(mesh);
+       
+       CkPrintf("Marking 5 nodes and one element as valid again\n");
+       FEM_set_entity_valid(mesh, FEM_NODE, 5);
+       FEM_set_entity_valid(mesh, FEM_NODE, 6);
+       FEM_set_entity_valid(mesh, FEM_NODE, 7);
+       FEM_set_entity_valid(mesh, FEM_NODE, 8);
+       FEM_set_entity_valid(mesh, FEM_NODE, 9);        
+       FEM_set_entity_valid(mesh, FEM_ELEM, 9);
+       FEM_Print_Mesh_Summary(mesh);
+       */      
+       // add new nodes for a new element
+       /*      int newnode1 = FEM_add_node(mesh);
+       int newnode2 = FEM_add_node(mesh);
+       int newnode3 = FEM_add_node(mesh);
+       CkPrintf("3 new nodes\n");
+       FEM_Print_Mesh_Summary(mesh);   
+               
+       int e1conn[3];
+       e1conn[0]=newnode1;
+       e1conn[1]=newnode2;
+       e1conn[2]=newnode3;
+       int newel1 = FEM_add_element(mesh,e1conn,3);
+       CkPrintf("New Element\n");
+       FEM_Print_Mesh_Summary(mesh);           
+       */
+       /*
+       CkPrintf("chunk %d Waiting for Synchronization\n",rank);
+       MPI_Barrier(comm);
+       CkPrintf("Synchronized\n");
+       FEM_Print_Mesh_Summary(mesh);
+       //CkExit();
+       */  
+  }
+
+  int numghosttri=FEM_Mesh_get_length(mesh,FEM_GHOST+FEM_ELEM+0); // Get number of nodes
+  
+  
+   
+  CkPrintf("Driver finished.\n");
+}
+
+
+// A PUP function to allow for migration and load balancing of mesh partitions.
+// The PUP function is not needed if no migration or load balancing is desired.
+void pup_myGlobals(pup_er p,myGlobals *g) 
+{
+  FEM_Print("-------- called pup routine -------");
+  pup_int(p,&g->nnodes);
+  pup_int(p,&g->nelems);
+  int nnodes=g->nnodes, nelems=g->nelems;
+  if (pup_isUnpacking(p)) {
+    g->coord=new vector2d[nnodes];
+    g->conn=new connRec[nelems];
+    g->R_net=new vector2d[nnodes]; //Net force
+    g->d=new vector2d[nnodes];//Node displacement
+    g->v=new vector2d[nnodes];//Node velocity
+    g->a=new vector2d[nnodes];
+       g->S11=new double[nelems];
+       g->S22=new double[nelems];
+       g->S12=new double[nelems];
+  }
+  pup_doubles(p,(double *)g->coord,2*nnodes);
+  pup_ints(p,(int *)g->conn,3*nelems);
+  pup_doubles(p,(double *)g->R_net,2*nnodes);
+  pup_doubles(p,(double *)g->d,2*nnodes);
+  pup_doubles(p,(double *)g->v,2*nnodes);
+  pup_doubles(p,(double *)g->a,2*nnodes);
+  pup_doubles(p,(double *)g->S11,nelems);
+  pup_doubles(p,(double *)g->S22,nelems);
+  pup_doubles(p,(double *)g->S12,nelems);
+  if (pup_isDeleting(p)) {
+    delete[] g->coord;
+    delete[] g->conn;
+    delete[] g->R_net;
+    delete[] g->d;
+    delete[] g->v;
+    delete[] g->a;
+       delete[] g->S11;
+       delete[] g->S22;
+       delete[] g->S12;
+  }
+}
+
+
diff --git a/examples/fem/adapt/test/pgm.C b/examples/fem/adapt/test/pgm.C
new file mode 100644 (file)
index 0000000..ec8fdc4
--- /dev/null
@@ -0,0 +1,643 @@
+#include "pgm.h"
+#include "mpi.h"
+#include "ckvector3d.h"
+#include "charm-api.h"
+#include "fem_mesh.h"
+#include "fem_adapt_new.h"
+#include "fem_mesh_modify.h"
+
+
+extern void _registerFEMMeshModify(void);
+
+extern "C" void
+init(void)
+{
+  CkPrintf("init started\n");
+  double startTime=CmiWallTimer();
+  const char *eleName="mesh1.tri";
+  const char *nodeName="mesh1.node";
+  int nPts=0; //Number of nodes
+  vector2d *pts=0; //Node coordinates
+  int *bounds;
+
+  CkPrintf("Reading node coordinates from %s\n",nodeName);
+  //Open and read the node coordinate file
+  {
+    char line[1024];
+    FILE *f=fopen(nodeName,"r");
+    if (f==NULL) die("Can't open node file!");
+    fgets(line,1024,f);
+    if (1!=sscanf(line,"%d",&nPts)) die("Can't read number of points!");
+    pts=new vector2d[nPts];
+    bounds = new int[nPts];
+    for (int i=0;i<nPts;i++) {
+      int ptNo;
+      if (NULL==fgets(line,1024,f)) die("Can't read node input line!");
+      if (4!=sscanf(line,"%d%lf%lf%d",&ptNo,&pts[i].x,&pts[i].y, &bounds[i])) 
+       die("Can't parse node input line!");
+    }
+    fclose(f);
+  }
+  int nEle=0;
+  connRec *ele=NULL;
+  CkPrintf("Reading elements from %s\n",eleName);
+  //Open and read the element connectivity file
+  {
+    char line[1024];
+    FILE *f=fopen(eleName,"r");
+    if (f==NULL) die("Can't open element file!");
+    fgets(line,1024,f);
+    if (1!=sscanf(line,"%d",&nEle)) die("Can't read number of elements!");
+    ele=new connRec[nEle];
+    for (int i=0;i<nEle;i++) {
+      int elNo;
+      if (NULL==fgets(line,1024,f)) die("Can't read element input line!");
+      if (4!=sscanf(line,"%d%d%d%d",&elNo,&ele[i][0],&ele[i][1],&ele[i][2])) 
+       die("Can't parse element input line!");  
+      ele[i][0]--; //Fortran to C indexing
+      ele[i][1]--; //Fortran to C indexing
+      ele[i][2]--; //Fortran to C indexing
+    }
+    fclose(f);
+  }
+
+
+  int fem_mesh=FEM_Mesh_default_write(); // Tell framework we are writing to the mesh
+
+  CkPrintf("Passing node coords to framework\n");
+
+
+  FEM_Mesh_data(fem_mesh,        // Add nodes to the current mesh
+                FEM_NODE,        // We are registering nodes
+                FEM_DATA+0,      // Register the point locations which are normally 
+                                 // the first data elements for an FEM_NODE
+                (double *)pts,   // The array of point locations
+                0,               // 0 based indexing
+                nPts,            // The number of points
+                FEM_DOUBLE,      // Coordinates are doubles
+                2);              // Points have dimension 2 (x,y)
+  CkPrintf("Passing node bounds to framework\n");
+
+
+  FEM_Mesh_data(fem_mesh,        // Add nodes to the current mesh
+                FEM_NODE,        // We are registering nodes
+                FEM_DATA+2,      // Register the point bound info 
+                                 // the first data elements for an FEM_NODE
+                (int *)bounds,  // The array of point bound info
+                0,               // 0 based indexing
+                nPts,            // The number of points
+                FEM_INT,        // bounds are ints
+                1);              // Points have dimension 1
+
+  CkPrintf("Passing elements to framework\n");
+
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_ELEM+0,      // We are registering elements with type 0
+                                 // The next type of element could be registered with FEM_ELEM+1
+                FEM_CONN,        // Register the connectivity table for this
+                                 // data elements for this type of FEM entity
+                (int *)ele,      // The array of point locations
+                0,               // 0 based indexing
+                nEle,            // The number of elements
+                FEM_INDEX_0,     // We use zero based node numbering
+                3);              // Elements have degree 3, since triangles are defined 
+                                 // by three nodes
+  delete[] ele;
+  delete[] pts;
+
+
+
+
+  // Register values to the elements so we can keep track of them after partitioning
+  int *values;
+  values=new int[nEle];
+  for(int i=0;i<nEle;i++)values[i]=i;
+
+  // triangles
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_ELEM,      // We are registering elements with type 1
+                FEM_DATA,   
+                (int *)values,   // The array of point locations
+                0,               // 0 based indexing
+                nEle,            // The number of elements
+                FEM_INT,         // We use zero based node numbering
+                1);
+  
+  delete [] values;
+  values=new int[nPts];
+  for (int i=0; i<nPts; i++) values[i]=i;
+  
+  
+
+  // triangles
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_NODE,      // We are registering elements with type 1
+                FEM_DATA+1,   
+                (int *)values,   // The array of point locations
+                0,               // 0 based indexing
+                nPts,            // The number of elements
+                FEM_INT,         // We use zero based node numbering
+                1);
+
+  delete [] values; 
+
+  //boundary conditions
+  FEM_Mesh_data(fem_mesh,      // Add nodes to the current mesh
+                FEM_NODE,      // We are registering elements with type 1
+                FEM_DATA+2,   
+                (int *)bounds,   // The array of point locations
+                0,               // 0 based indexing
+                nPts,            // The number of elements
+                FEM_INT,         // We use zero based node numbering
+                1);
+
+  delete [] bounds;
+
+  // add ghost layers
+
+       const int triangleFaces[6] = {0,1,2};
+       CkPrintf("Adding Ghost layers\n");
+    FEM_Add_ghost_layer(1,1);
+    FEM_Add_ghost_elem(0,3,triangleFaces);
+
+       CkPrintf("Finished with init (Reading took %.f s)\n",CmiWallTimer()-startTime);
+
+}
+
+
+// A driver() function 
+// driver() is required in all FEM programs
+extern "C" void
+driver(void)
+{
+  int *neighbors, *adjnodes, adjSz, *adjelems;
+  int nnodes,nelems,nelems2,ignored;
+  int i,t=0, myId=FEM_My_partition();
+  myGlobals g;
+  FEM_Register(&g,(FEM_PupFn)pup_myGlobals);
+  int mesh=FEM_Mesh_default_read(); // Tell framework we are reading data from the mesh
+  FEM_Mesh *meshP = FEM_Mesh_lookup(mesh, "driver");
+  _registerFEMMeshModify();
+
+  printf("partition %d is in driver\n", myId);
+
+   
+  // Get node data
+  nnodes=FEM_Mesh_get_length(mesh,FEM_NODE); // Get number of nodes
+  g.nnodes=nnodes;
+  g.coord=new vector2d[nnodes];
+  // Get node positions
+  FEM_Mesh_data(mesh, FEM_NODE, FEM_DATA+0, (double*)g.coord, 0, nnodes, FEM_DOUBLE, 2);  
+
+
+  // Get element data
+  nelems=FEM_Mesh_get_length(mesh,FEM_ELEM+0); // Get number of elements
+  g.nelems=nelems;
+  g.conn=new connRec[nelems];
+  // Get connectivity for elements
+  FEM_Mesh_data(mesh, FEM_ELEM+0, FEM_CONN, (int *)g.conn, 0, nelems, FEM_INDEX_0, 3);  
+
+
+  {
+       int j, t=0;
+       const int triangleFaces[6] = {0,1,1,2,2,0};
+       FEM_Add_elem2face_tuples(mesh, 0, 2, 3, triangleFaces);
+       FEM_Mesh_create_elem_elem_adjacency(mesh);
+       FEM_Mesh_allocate_valid_attr(mesh, FEM_ELEM+0);
+       FEM_Mesh_allocate_valid_attr(mesh, FEM_NODE);
+       FEM_Mesh_create_node_elem_adjacency(mesh);
+       FEM_Mesh_create_node_node_adjacency(mesh);
+
+       
+       FEM_Print_Mesh_Summary(mesh);
+       
+       int tuplesPerElem = 3;
+       int elementNum = 0;
+       
+
+       int *values, *nvalues;
+       double *valuesDouble, *nvaluesDouble;
+       values = new int[g.nelems];
+       nvalues = new int[g.nnodes];
+       valuesDouble = new double[g.nelems];
+       nvaluesDouble = new double[g.nnodes];
+
+       FEM_Mesh_data(mesh, FEM_ELEM+elementNum, FEM_DATA, values, 0, g.nelems, FEM_INT, 1);
+       FEM_Mesh_data(mesh, FEM_NODE, FEM_DATA+1, nvalues, 0, g.nnodes, FEM_INT, 1);
+
+       for (int i=0; i<g.nelems; i++) valuesDouble[i]=values[i];
+       for (int i=0; i<g.nnodes; i++) nvaluesDouble[i]=nvalues[i];
+
+       // ghost data
+       int ng=FEM_Mesh_get_length(mesh,FEM_GHOST+FEM_ELEM+elementNum); 
+       int *valuesg, *nvaluesg;
+       valuesg=new int[ng];
+       int ngn = FEM_Mesh_get_length(mesh,FEM_GHOST+FEM_NODE);
+       nvaluesg = new int[ngn];
+
+       FEM_Mesh_data(mesh, FEM_GHOST+FEM_ELEM+elementNum, FEM_DATA, valuesg, 0, ng, FEM_INT, 1);
+       FEM_Mesh_data(mesh, FEM_GHOST+FEM_NODE, FEM_DATA+1, nvaluesg, 0, ngn, FEM_INT, 1);
+
+       FEM_Print_Mesh_Summary(mesh);
+
+       int rank = 0;
+       MPI_Comm comm = MPI_COMM_WORLD;
+       MPI_Comm_rank(comm,&rank);
+       
+       MPI_Barrier(comm);
+
+       FEM_REF_INIT(mesh);
+
+
+
+/*// Remaps the nodes to correspond the original node numberings
+  vector2d *coords;
+  connRec *conns;
+  conns=new connRec[g.nelems];
+  coords=new vector2d[g.nnodes];
+  for (int i=0; i<g.nnodes; i++) {
+    CkPrintf("oldCoords[%d]: (%f, %f)\n", i, g.coord[i].x, g.coord[i].y);
+    coords[nvalues[i]]=g.coord[i];  
+    CkPrintf("node %d has val %d\n", i, nvalues[i]);
+  }
+  for (int i=0; i<g.nelems;i++) {
+    for (int j=0; j<3; j++) {
+      conns[i][j]=nvalues[g.conn[i][j]];
+    }    
+  }
+
+
+*/
+       // Test out adjacencies here
+       // Print them pretty like
+/*
+       CkPrintf("\n  *** TESTING E2E ADJACENCIES *** \n\n");
+       neighbors=new int[3];
+       for (int i=0; i<g.nelems; i++) {
+         meshP->e2e_getAll(i, neighbors);
+         CkPrintf(" %d:  e2e : ", myId);
+         if (values[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", values[i]);
+         for (j=0; j<3; j++) {
+           if (neighbors[j]<-1) 
+           {
+             if (valuesg[FEM_From_ghost_index(neighbors[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",valuesg[FEM_From_ghost_index(neighbors[j])]);
+           }
+           else if (neighbors[j]>-1) {
+             if (values[neighbors[j]]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", values[neighbors[j]]);
+           }
+           else {
+             CkPrintf("(%d) ", neighbors[j]);
+           }
+           if (j<2) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }
+
+       delete [] neighbors;    
+
+       CkPrintf("\n  *** TESTING E2N ADJACENCIES *** \n\n");
+       neighbors=new int[3];
+       for (int i=0; i<g.nelems; i++) {
+         meshP->e2n_getAll(i, neighbors);
+         CkPrintf(" %d:  e2n : ", myId);
+         if (values[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", values[i]);
+         for (j=0; j<3; j++) {
+           if (neighbors[j]<-1) 
+           {
+             if (nvaluesg[FEM_From_ghost_index(neighbors[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",nvaluesg[FEM_From_ghost_index(neighbors[j])]);
+           }
+           else if (neighbors[j]>-1) {
+             if (nvalues[neighbors[j]]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", nvalues[neighbors[j]]);//coords[i].x, g.coord[i].y
+           }
+           else {
+             CkPrintf("(%d) ", neighbors[j]);
+           }
+           if (j<2) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }
+
+      
+       CkPrintf("\n  *** TESTING N2N ADJACENCIES *** \n\n");
+       for (int i=0; i<g.nnodes; i++) {
+         meshP->n2n_getAll(i, &adjnodes, &adjSz);
+         CkPrintf(" %d:  n2n : ", myId);
+         if (nvalues[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", nvalues[i]);
+         for (int j=0; j<adjSz; j++){
+           if (adjnodes[j]<-1) 
+           {
+             if (nvaluesg[FEM_From_ghost_index(adjnodes[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",nvaluesg[FEM_From_ghost_index(adjnodes[j])]);
+           }
+           else if (adjnodes[j]>-1) {
+             if (nvalues[adjnodes[j]]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", nvalues[adjnodes[j]]);
+           }
+           else {
+             CkPrintf("(%d) ", adjnodes[j]);
+           }
+           if (j<adjSz-1) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }       
+      
+       delete [] adjnodes;
+
+       CkPrintf("\n  *** TESTING N2E ADJACENCIES *** \n\n");
+       for (int i=0; i<g.nnodes; i++) {
+         meshP->n2e_getAll(i, &adjelems, &adjSz);
+         CkPrintf(" %d:  n2e : ", myId);
+         if (nvalues[i]<10) CkPrintf(" ");
+         CkPrintf("[%d] => { ", nvalues[i]);
+         for (int j=0; j<adjSz; j++){
+           if (adjelems[j]<-1) 
+           {
+             if (valuesg[FEM_From_ghost_index(adjelems[j])]<10) CkPrintf(" ");
+             CkPrintf("(%d)*",valuesg[FEM_From_ghost_index(adjelems[j])]);
+           }
+           else if (adjnodes[j]>-1) {
+             if (values[adjelems[j]]<10) CkPrintf(" ");
+             CkPrintf("(%d) ", values[adjelems[j]]);
+           }
+           else {
+             CkPrintf("(%d) ", adjelems[j]);
+           }
+           if (j<adjSz-1) CkPrintf(", ");
+         }
+         CkPrintf(" }\n");
+       }       
+*/
+//      doNetFEM(t, mesh, g);
+
+
+//********************* Test mesh modification here **************************//
+      FEM_Adapt *adaptor= meshP->getfmMM()->getfmAdapt();
+      doNetFEM(t, mesh, g);
+
+/*   // EDGE FLIP TESTING
+      int flip[2];
+      CkPrintf("Begin edge flip testifications. \n");
+      
+      if (myId==0) 
+      {
+       flip[0]=1;
+       flip[1]=2;
+      }        
+      else if (myId==1) 
+      {
+       flip[0]=11;
+       flip[1]=12;
+      }        
+      else if (myId==2) 
+      {
+       flip[0]=12;
+       flip[1]=3;
+      }        
+      else //if (myId==3) 
+      {
+       flip[0]=1;
+       flip[1]=2;
+      }        
+
+      CkPrintf("%d:Running edge_flip (%d, %d)\n",myId, flip[0],flip[1]);
+      adaptor->edge_flip(flip[0],flip[1]);
+      doNetFEM(t, mesh, g);
+*/
+
+      int bisect[2];
+
+      CkPrintf("Begin edge bisect. \n");
+      if (myId==0) 
+      {
+       bisect[0]=2;
+       bisect[1]=3;
+      }        
+      else if (myId==1) 
+      {
+       bisect[0]=1;
+       bisect[1]=4;
+      }        
+      else if (myId==2) 
+      {
+       bisect[0]=15;
+       bisect[1]=17;
+      }        
+      else //if (myId==3) 
+      {
+       bisect[0]=1;
+       bisect[1]=2;
+      }        
+      int newNode=0;
+      //CkPrintf("%d:Running edge_bisect (%d, %d)\n",myId, bisect[0],bisect[1]);
+      //if (rank==0) newNode=adaptor->edge_bisect(bisect[0],bisect[1]);
+      adaptor->edge_bisect(4,22);
+      adaptor->edge_bisect(13,24);
+      adaptor->edge_bisect(50,47);
+      adaptor->edge_bisect(37,39);
+      adaptor->edge_bisect(27,28);
+      adaptor->edge_bisect(6,32);
+      adaptor->edge_bisect(44,52);
+
+      doNetFEM(t, mesh, g);
+
+      FEM_mesh_smooth(mesh, g);
+
+      doNetFEM(t, mesh, g);
+
+      FEM_mesh_smooth(mesh, g);
+
+
+/*
+      int vRemove[2];
+  
+      CkPrintf("Begin vertex remove. \n");
+      if (myId==0) 
+      {
+       vRemove[0]=newNode;
+       vRemove[1]=13;
+      }        
+      else if (myId==1) 
+      {
+       vRemove[0]=newNode;
+       vRemove[1]=1;
+      }        
+      else if (myId==2) 
+      {
+       vRemove[0]=newNode;
+       vRemove[1]=15;
+      }        
+      else //if (myId==3) 
+      {
+       vRemove[0]=newNode;
+       vRemove[1]=2;
+      }        
+
+      CkPrintf("%d:Running vertex_remove (%d, %d)\n",myId, vRemove[0],vRemove[1]);
+      if (rank==0) adaptor->vertex_remove(vRemove[0],vRemove[1]);*/
+      doNetFEM(t, mesh, g);
+
+  
+      CkPrintf("Chunk %d Waiting for Synchronization\n",rank);
+      MPI_Barrier(comm);
+      CkPrintf("Synchronized\n");
+      doNetFEM(t, mesh, g);
+      FEM_Print_Mesh_Summary(mesh);
+      CkExit();
+  }
+  CkPrintf("Driver finished.\n");
+}
+
+
+// A PUP function to allow for migration and load balancing of mesh partitions.
+// The PUP function is not needed if no migration or load balancing is desired.
+void pup_myGlobals(pup_er p,myGlobals *g) 
+{
+  FEM_Print("-------- called pup routine -------");
+  pup_int(p,&g->nnodes);
+  pup_int(p,&g->nelems);
+  int nnodes=g->nnodes, nelems=g->nelems;
+  if (pup_isUnpacking(p)) {
+    g->coord=new vector2d[nnodes];
+    g->conn=new connRec[nelems];
+    g->R_net=new vector2d[nnodes]; //Net force
+    g->d=new vector2d[nnodes];//Node displacement
+    g->v=new vector2d[nnodes];//Node velocity
+    g->a=new vector2d[nnodes];
+       g->S11=new double[nelems];
+       g->S22=new double[nelems];
+       g->S12=new double[nelems];
+  }
+  pup_doubles(p,(double *)g->coord,2*nnodes);
+  pup_ints(p,(int *)g->conn,3*nelems);
+  pup_doubles(p,(double *)g->R_net,2*nnodes);
+  pup_doubles(p,(double *)g->d,2*nnodes);
+  pup_doubles(p,(double *)g->v,2*nnodes);
+  pup_doubles(p,(double *)g->a,2*nnodes);
+  pup_doubles(p,(double *)g->S11,nelems);
+  pup_doubles(p,(double *)g->S22,nelems);
+  pup_doubles(p,(double *)g->S12,nelems);
+  if (pup_isDeleting(p)) {
+    delete[] g->coord;
+    delete[] g->conn;
+    delete[] g->R_net;
+    delete[] g->d;
+    delete[] g->v;
+    delete[] g->a;
+       delete[] g->S11;
+       delete[] g->S22;
+       delete[] g->S12;
+  }
+}
+
+void doNetFEM(int& t, int mesh, myGlobals &g) {
+  MPI_Comm comm = MPI_COMM_WORLD;
+  MPI_Barrier(comm);
+  CkPrintf("Sending to netFem step %d.\n",t);
+  rebuildArrays(mesh, g);
+  NetFEM n=NetFEM_Begin(FEM_My_partition(),t,2,NetFEM_WRITE);
+  NetFEM_Nodes(n,g.nVnodes,(double *)g.vCoord,"Position (m)");
+  NetFEM_Elements(n,g.nVelems,3,(int *)g.vConn,"Triangles");
+  NetFEM_End(n);
+  t++;
+}
+
+void rebuildArrays (int mesh, myGlobals &g) {
+  CkPrintf("Rebuilding arrays. \n");
+  delete [] g.conn;
+  delete [] g.coord;
+  if (!g.vCoord) delete [] g.vCoord;
+  if (!g.vConn) delete [] g.vConn;
+  g.nelems=FEM_Mesh_get_length(mesh, FEM_ELEM);
+  g.nnodes=FEM_Mesh_get_length(mesh, FEM_NODE);
+  g.nVnodes = FEM_count_valid(mesh, FEM_NODE);
+  g.nVelems = FEM_count_valid(mesh, FEM_ELEM);
+  g.coord=new vector2d[g.nnodes];
+  g.conn=new connRec[g.nelems];
+  g.vConn = new connRec[g.nVelems];
+  g.vCoord = new vector2d[g.nVnodes];
+
+  FEM_Mesh_data(mesh, FEM_NODE, FEM_DATA, (double *)g.coord, 0, g.nnodes, FEM_DOUBLE, 2);
+  FEM_Mesh_data(mesh, FEM_ELEM, FEM_CONN, (int *)g.conn, 0, g.nelems, FEM_INDEX_0, 3);
+
+  int j=0;
+  for (int i=0; i<g.nnodes;i++)
+    if (FEM_is_valid(mesh, FEM_NODE, i))
+      g.vCoord[j++]=g.coord[i];
+  
+  j=0;
+  for (int i=0; i<g.nelems;i++)
+    if (FEM_is_valid(mesh, FEM_ELEM, i)) {
+      for (int k=0; k<3; k++)
+       g.vConn[j][k]=g.conn[i][k];
+      j++;  
+    }
+}
+
+void FEM_mesh_smooth(int mesh, myGlobals &g)
+{
+  double *areas;
+  vector2d *centroids, sum;
+  int nLocEle;
+  for (int i=0; i<g.nnodes; i++)
+  {
+    sum.x=0;
+    sum.y=0;
+    if (isNodeInternal(i))
+    {
+      getData(mesh, i, areas, centroids, nLocEle, g);      
+      for (int j=0; j<nLocEle; j++) {
+       sum.x += centroids[j].x;
+       sum.y += centroids[j].y;
+      }
+      sum.x/=nLocEle;
+      sum.y/=nLocEle;
+      FEM_set_entity_coord2(mesh, FEM_NODE, i, sum.x, sum.y);
+      CkPrintf("Sum vector for node %d: (%f,%f)\n", i, sum.x, sum.y);
+    }
+  }
+}
+
+int isNodeInternal(int idx)
+{
+  int boundVal=0;
+  FEM_Mesh_data(FEM_Mesh_default_read(), FEM_NODE,FEM_DATA+2, &boundVal,idx, 1, FEM_INT, 1);
+  return (boundVal>-1);
+}
+
+
+void getData(int mesh, int idx, double *areas, vector2d*& centroids, int& nEle, myGlobals &g)
+{
+  double x1, x2, x3, y1, y2, y3;
+  if (!areas) delete [] areas;
+  if (!centroids) delete [] centroids;
+  int *adjelems;
+  FEM_Mesh *meshP = FEM_Mesh_lookup(mesh, "driver");
+  meshP->n2e_getAll(idx, &adjelems, &nEle);
+  areas = new double[nEle];
+  centroids = new vector2d[nEle];
+  for (int i=0; i<nEle; i++)
+  {
+    x1 = g.coord[g.conn[adjelems[i]][0]].x;
+    x2 = g.coord[g.conn[adjelems[i]][1]].x;
+    x3 = g.coord[g.conn[adjelems[i]][2]].x;
+
+    y1 = g.coord[g.conn[adjelems[i]][0]].y;
+    y2 = g.coord[g.conn[adjelems[i]][1]].y;
+    y3 = g.coord[g.conn[adjelems[i]][2]].y;
+
+    centroids[i].x=(x1+x2+x3)/3.0;
+    centroids[i].y=(y1+y2+y3)/3.0;
+    areas[i]= (0.5)*(x1*(y2-y3)-y1*(x2-x3)+x2*y3-x3*y2);
+  }
+}
+
diff --git a/examples/fem/adapt/test/pgm.h b/examples/fem/adapt/test/pgm.h
new file mode 100644 (file)
index 0000000..19fb396
--- /dev/null
@@ -0,0 +1,70 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+#include "charm++.h"
+#include "fem.h"
+#include "netfem.h"
+#include "vector2d.h"
+
+
+//One element's connectivity information
+typedef int connRec[3];
+typedef int connRec2[4];
+
+// A structure for handling data that may need to be migrated
+struct myGlobals {
+  int nnodes;
+  int nelems;
+  int nVnodes;
+  int nVelems;
+  vector2d *coord;
+  connRec *conn;
+  vector2d *vCoord;
+  connRec *vConn;  
+
+  int nelems2;
+  connRec2 *conn2;
+
+  vector2d *R_net, *d, *v, *a;
+  
+  double *S11, *S22, *S12;
+};
+
+void doNetFEM(int& t, int mesh, myGlobals &g); 
+
+void rebuildArrays (int mesh, myGlobals &g);
+
+void FEM_mesh_smooth(int mesh, myGlobals &g);
+
+void getData(int mesh, int idx, double *areas, vector2d*& centroids, int& nEle, myGlobals &g);
+
+int isNodeInternal(int idx);
+
+//Compute forces on constant-strain triangles:
+void CST_NL(const vector2d *coor,const connRec *lm,vector2d *R_net,
+           const vector2d *d,const double *c,
+           int numnp,int numel,
+           double *S11o,double *S22o,double *S12o);
+
+// Prototypes
+void advanceNodes(const double dt,int nnodes,const vector2d *coord,
+                  vector2d *R_net,vector2d *a,vector2d *v,vector2d *d,bool dampen);
+
+void pup_myGlobals(pup_er p,myGlobals *g);
+
+//The material constants c, as computed by fortran mat_const
+// I think the units here are Pascals (N/m^2)
+const double matConst[4]={3.692e9,  1.292e9,  3.692e9,  1.200e9 };
+
+//The timestep, in seconds
+const double dt=1.0e-9;
+
+// A convenient error function
+static void die(const char *str) {
+  CkError("Fatal error: %s\n",str);
+  CkExit();
+}
+
+
+
+#define NANCHECK 1 /*Check for NaNs at each timestep*/
diff --git a/examples/fem/adapt/test/pgm.o b/examples/fem/adapt/test/pgm.o
new file mode 100644 (file)
index 0000000..38312c7
Binary files /dev/null and b/examples/fem/adapt/test/pgm.o differ
diff --git a/examples/fem/adapt/test/vector2d.h b/examples/fem/adapt/test/vector2d.h
new file mode 100644 (file)
index 0000000..08cb1e4
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+Orion's Standard Library
+Orion Sky Lawlor, 2/22/2000
+NAME:          vector2d.h
+
+DESCRIPTION:   C++ 2-Dimentional vector library (no templates)
+
+This file provides various utility routines for easily
+manipulating 2-D vectors-- included are arithmetic,
+dot product, magnitude and normalization terms. 
+All routines are provided right in the header file (for inlining).
+
+Converted from vector3d.h.
+
+*/
+
+#ifndef __OSL_VECTOR_2D_H
+#define __OSL_VECTOR_2D_H
+
+#include <math.h>
+
+typedef double real;
+
+//vector2d is a cartesian vector in 2-space-- an x and y.
+class vector2d {
+public:
+       real x,y;
+       vector2d(void) {}//Default consructor
+       //Simple 1-value constructor
+       explicit vector2d(const real init) {x=y=init;}
+       //Simple 1-value constructor
+       explicit vector2d(int init) {x=y=init;}
+       //2-value constructor
+       vector2d(const real Nx,const real Ny) {x=Nx;y=Ny;}
+       //Copy constructor
+       vector2d(const vector2d &copy) {x=copy.x;y=copy.y;}
+       
+       //Cast-to-real * operators (treat vector as array)
+       operator real *() {return &x;}
+       operator const real *() const {return &x;}
+       
+/*Arithmetic operations: these are carefully restricted to just those
+ that make unambiguous sense (to me... now...  ;-)
+Counterexamples: vector*vector makes no sense (use .dot()) because
+real/vector is meaningless (and we'd want a*b/b==a for b!=0), 
+ditto for vector&vector (dot?), vector|vector (projection?), 
+vector^vector (cross?),real+vector, vector+=real, etc.
+*/
+       vector2d &operator=(const vector2d &b) {x=b.x;y=b.y;return *this;}
+       int operator==(const vector2d &b) const {return (x==b.x)&&(y==b.y);}
+       int operator!=(const vector2d &b) const {return (x!=b.x)||(y!=b.y);}
+       vector2d operator+(const vector2d &b) const {return vector2d(x+b.x,y+b.y);}
+       vector2d operator-(const vector2d &b) const {return vector2d(x-b.x,y-b.y);}
+       vector2d operator*(const real scale) const 
+               {return vector2d(x*scale,y*scale);}
+       friend vector2d operator*(const real scale,const vector2d &v)
+               {return vector2d(v.x*scale,v.y*scale);}
+       vector2d operator/(const real &div) const
+               {real scale=1.0/div;return vector2d(x*scale,y*scale);}
+       vector2d operator-(void) const {return vector2d(-x,-y);}
+       void operator+=(const vector2d &b) {x+=b.x;y+=b.y;}
+       void operator-=(const vector2d &b) {x-=b.x;y-=b.y;}
+       void operator*=(const real scale) {x*=scale;y*=scale;}
+       void operator/=(const real div) {real scale=1.0/div;x*=scale;y*=scale;}
+
+//Vector-specific operations
+       //Return the square of the magnitude of this vector
+       real magSqr(void) const {return x*x+y*y;}
+       //Return the magnitude (length) of this vector
+       real mag(void) const {return sqrt(magSqr());}
+       
+       //Return the square of the distance to the vector b
+       real distSqr(const vector2d &b) const 
+               {return (x-b.x)*(x-b.x)+(y-b.y)*(y-b.y);}
+       //Return the distance to the vector b
+       real dist(const vector2d &b) const {return sqrt(distSqr(b));}
+       
+       //Return the dot product of this vector and b
+       real dot(const vector2d &b) const {return x*b.x+y*b.y;}
+       //Return the cosine of the angle between this vector and b
+       real cosAng(const vector2d &b) const {return dot(b)/(mag()*b.mag());}
+       
+       //Return the "direction" (unit vector) of this vector
+       vector2d dir(void) const {return (*this)/mag();}
+
+       //Return the CCW perpendicular vector
+       vector2d perp(void) const {return vector2d(-y,x);}
+
+       //Return this vector scaled by that
+       vector2d &scale(const vector2d &b) {x*=b.x;y*=b.y;return *this;}
+       
+       //Return the largest coordinate in this vector
+       real max(void) {return (x>y)?x:y;}
+       //Make each of this vector's coordinates at least as big
+       // as the given vector's coordinates.
+       void enlarge(const vector2d &by)
+       {if (by.x>x) x=by.x; if (by.y>y) y=by.y;}
+};
+
+#endif //__OSL_VECTOR2D_H
+
+
diff --git a/examples/fem/adapt/test/xxx.1.edge b/examples/fem/adapt/test/xxx.1.edge
new file mode 100644 (file)
index 0000000..6a278e7
--- /dev/null
@@ -0,0 +1,7 @@
+5  1
+   1   3  1  1
+   2   1  4  1
+   3   4  3  0
+   4   4  2  1
+   5   2  3  1
+# Generated by /expand8/home/olawlor/bin/triangle -e xxx.1
diff --git a/examples/fem/adapt/test/xxx.1.ele b/examples/fem/adapt/test/xxx.1.ele
new file mode 100644 (file)
index 0000000..e623e84
--- /dev/null
@@ -0,0 +1,4 @@
+2  3  0
+   1       3     1     4
+   2       4     2     3
+# Generated by /expand8/home/olawlor/bin/triangle -e xxx.1
diff --git a/examples/fem/adapt/test/xxx.1.node b/examples/fem/adapt/test/xxx.1.node
new file mode 100644 (file)
index 0000000..d65e76f
--- /dev/null
@@ -0,0 +1,6 @@
+4  2  0  1
+   1    0  0    -6
+   2    0.0050000000000000001  0.0050000000000000001    1
+   3    0  0.0050000000000000001    -6
+   4    0.0050000000000000001  0    -1
+# Generated by /expand8/home/olawlor/bin/triangle -e xxx.1