00001 #include "selnodes.h"
00002 #include <string.h>
00003 #include <stdlib.h>
00004 #include <math.h>
00005 #include <time.h>
00006 #include "galias.h"
00007 #include "iotools.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 selnodes::selnodes(int np,int mr,long nd,long kk,long *j,meshdescription d,FILE *out,long mespr)
00025 {
00026 long i,k;
00027
00028
00029 nproc=np;
00030
00031 myrank=mr;
00032
00033 md = d;
00034
00035 nn=kk;
00036
00037
00038 nsn=0;
00039 for (i=0;i<nn;i++){
00040 if (j[i]>-1)
00041 nsn++;
00042 }
00043
00044 if (nsn==0){
00045 print_err("wrong number of selected nodes in constructor", __FILE__, __LINE__, __func__);
00046 abort();
00047 }
00048
00049
00050 lnsn=new long [nsn];
00051
00052 lsng=new long [nsn];
00053
00054 k=0;
00055 for (i=0;i<nn;i++){
00056 if (j[i]>-1){
00057 lnsn[k]=i;
00058 lsng[k]=j[i];
00059 k++;
00060 }
00061 }
00062
00063 if (mespr==0){
00064 fprintf (out,"\n\n\n list of local and global/group numbers of selected nodes (lnsn, lsng)\n");
00065 fprintf (out,"\n number of selected nodes is %ld",nsn);
00066 for (i=0;i<nsn;i++){
00067 fprintf (out,"\n local node number %6ld global/group node number %6ld",lnsn[i],lsng[i]);
00068 }
00069 }
00070
00071
00072 ndof=0;
00073
00074 maxnsn=0;
00075
00076 maxndof=0;
00077
00078 maxncn=0;
00079
00080 ncn=0;
00081
00082 ldof = NULL;
00083
00084 ldofmultip = NULL;
00085
00086
00087 ndofdom = NULL;
00088
00089 cnm = NULL;
00090
00091
00092 cnsn = NULL;
00093
00094 gnsn = NULL;
00095
00096 if (myrank==0){
00097
00098 tnsn=0;
00099
00100
00101 gnn = NULL;
00102
00103 nodmultip = NULL;
00104
00105 dofmultip = NULL;
00106
00107 cndom = NULL;
00108
00109 ljn = NULL;
00110
00111 lsn = NULL;
00112
00113 doffeti = NULL;
00114
00115 ncndom = NULL;
00116
00117
00118 icmultip = NULL;
00119
00120 nsnmas = NULL;
00121
00122 cnsnmas = NULL;
00123
00124 gnsnmas = NULL;
00125
00126 snicmultip = NULL;
00127
00128 snndofmas = NULL;
00129
00130 snndofnmas = NULL;
00131
00132 sndofmas = NULL;
00133
00134 gnbncn = NULL;
00135
00136 sid = NULL;
00137
00138 sngnbncn = NULL;
00139
00140 snsid = NULL;
00141
00142 ndofnsn = NULL;
00143
00144 codensn = NULL;
00145
00146 cnmas = NULL;
00147 }
00148
00149
00150
00151
00152
00153 ndom=nd;
00154 }
00155
00156
00157
00158
00159
00160
00161 selnodes::~selnodes()
00162 {
00163 long i, j;
00164
00165 delete [] lsng;
00166 delete [] ldof;
00167
00168 delete [] lnsn;
00169 delete [] cnsn;
00170 delete [] gnsn;
00171
00172 if (myrank==0){
00173 if (gnn)
00174 {
00175 for (i=0;i<nproc;i++)
00176 delete [] gnn[i];
00177 delete [] gnn;
00178 }
00179
00180 delete [] dofmultip;
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 if (cndom)
00192 {
00193 for(i=0; i<nproc; i++)
00194 delete [] cndom[i];
00195 delete [] cndom;
00196 }
00197
00198 for(i=0; i<tnsn; i++)
00199 {
00200 if (ljn)
00201 delete [] ljn[i];
00202 if (lsn)
00203 delete [] lsn[i];
00204 if (doffeti)
00205 {
00206 for (j=0; j<nodmultip[i]; j++)
00207 delete [] doffeti[i][j];
00208 delete [] doffeti[i];
00209 }
00210 }
00211 delete [] ljn;
00212 delete [] lsn;
00213 delete [] doffeti;
00214 delete [] nodmultip;
00215 delete [] ncndom;
00216 delete [] icmultip;
00217
00218 if (cnsnmas)
00219 {
00220 for(i=0; i<nproc; i++)
00221 delete [] cnsnmas[i];
00222 delete [] cnsnmas;
00223 }
00224
00225 if (gnsnmas)
00226 {
00227 for(i=0; i<nproc; i++)
00228 delete [] gnsnmas[i];
00229 delete [] gnsnmas;
00230 }
00231
00232 delete [] snicmultip;
00233
00234 delete [] snndofmas;
00235
00236 if (snndofnmas)
00237 {
00238 for (i=0;i<nproc;i++)
00239 delete [] snndofnmas[i];
00240 delete [] snndofnmas;
00241 }
00242
00243 if (sndofmas)
00244 {
00245 for (i=0;i<nproc;i++)
00246 {
00247 for (j=0;j<nsnmas[i];j++)
00248 delete [] sndofmas[i][j];
00249 delete [] sndofmas[i];
00250 }
00251 delete [] sndofmas;
00252 }
00253 delete [] nsnmas;
00254
00255 if (gnbncn)
00256 {
00257 for (i=0;i<tnbn;i++)
00258 delete [] gnbncn[i];
00259 delete [] gnbncn;
00260 }
00261
00262 if(sid)
00263 {
00264 for (i=0;i<tnbn;i++)
00265 delete [] sid[i];
00266 delete [] sid;
00267 }
00268
00269 if (sngnbncn)
00270 {
00271 for (i=0;i<tnsn;i++)
00272 delete [] sngnbncn[i];
00273 delete [] sngnbncn;
00274 }
00275
00276 if (snsid!=NULL)
00277 {
00278 for (i=0;i<tnsn;i++)
00279 delete [] snsid[i];
00280 delete [] snsid;
00281 }
00282
00283 delete [] ndofnsn;
00284
00285 if (codensn)
00286 {
00287 for (i=0;i<tnsn;i++)
00288 delete [] codensn[i];
00289 delete [] codensn;
00290 }
00291
00292 if (cnmas)
00293 {
00294 for (i=0;i<nproc;i++)
00295 delete [] cnmas[i];
00296 delete [] cnmas;
00297 }
00298 }
00299 }
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 void selnodes::number_of_selected_nodes (long *domproc,FILE *out)
00314 {
00315 long i,j,k;
00316 MPI_Status stat;
00317
00318 if (myrank==0){
00319
00320 if (nsnmas!=NULL)
00321 delete [] nsnmas;
00322 nsnmas = new long [nproc];
00323
00324 maxnsn=nsn;
00325
00326 j=domproc[0];
00327 nsnmas[j]=nsn;
00328
00329 for (i=1;i<nproc;i++){
00330 MPI_Recv (&k,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00331
00332
00333 j=domproc[stat.MPI_TAG];
00334 nsnmas[j]=k;
00335 if (maxnsn<k)
00336 maxnsn=k;
00337 }
00338
00339 for (i=1;i<nproc;i++){
00340 MPI_Send (&maxnsn,1,MPI_LONG,i,myrank,MPI_COMM_WORLD);
00341 }
00342 }
00343 else{
00344 MPI_Send (&nsn,1,MPI_LONG,0,myrank,MPI_COMM_WORLD);
00345 MPI_Recv (&maxnsn,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00346 }
00347 MPI_Barrier (MPI_COMM_WORLD);
00348
00349
00350
00351
00352 fprintf (out,"\n\n the maximum number of selected nodes on subdomain (maxnsn) %ld\n",maxnsn);
00353 if (myrank==0){
00354 fprintf (out,"\n\n the numbers of selected nodes on subdomains (nsnmas)\n");
00355 for (i=0;i<nproc;i++){
00356 fprintf (out,"\n subdomain %6ld %ld",i+1,nsnmas[i]);
00357 }
00358 }
00359
00360 }
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373 void selnodes::nodes_on_master (long *domproc,FILE *out)
00374 {
00375 long i,j,k,max,tnnp,buffsize;
00376 long *buff,*nl;
00377 MPI_Status stat;
00378
00379 tnnp=0;
00380 buffsize=maxnsn;
00381 buff = new long [buffsize];
00382 for (i=0;i<nsn;i++){
00383 buff[i]=lsng[i];
00384 }
00385
00386 switch (md){
00387 case all_nodes:
00388 case neg_bound_nodes:{
00389
00390 max=0;
00391 for (i=0;i<nsn;i++){
00392 if (max<lsng[i])
00393 max=lsng[i];
00394 }
00395
00396 if (myrank==0){
00397 for (i=1;i<nproc;i++){
00398 MPI_Recv (&k,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00399 if (max<k)
00400 max=k;
00401 }
00402 tnnp=max;
00403 tnnp++;
00404 }
00405 else{
00406 MPI_Send (&max,1,MPI_LONG,0,myrank,MPI_COMM_WORLD);
00407 }
00408 MPI_Barrier (MPI_COMM_WORLD);
00409
00410 if (myrank==0){
00411
00412 gnn = new long* [nproc];
00413 for (i=0;i<nproc;i++){
00414 gnn[i] = new long [nsnmas[i]];
00415 }
00416
00417 nl=new long [tnnp];
00418 for (i=0;i<tnnp;i++){
00419 nl[i]=-1;
00420 }
00421
00422
00423 k=domproc[0];
00424 for (j=0;j<nsnmas[k];j++){
00425 nl[buff[j]]++;
00426 gnn[k][j]=buff[j];
00427 }
00428
00429
00430 for (i=1;i<nproc;i++){
00431 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00432 k=domproc[stat.MPI_TAG];
00433 for (j=0;j<nsnmas[k];j++){
00434 nl[buff[j]]++;
00435 gnn[k][j]=buff[j];
00436 }
00437 }
00438
00439
00440 tnsn=0;
00441 for (i=0;i<tnnp;i++){
00442 if (nl[i]>-1){
00443 nl[i]=tnsn;
00444 tnsn++;
00445 }
00446 }
00447
00448 for (i=0;i<nproc;i++){
00449 for (j=0;j<nsnmas[i];j++){
00450 gnn[i][j]=nl[gnn[i][j]];
00451 }
00452 }
00453
00454 delete [] nl;
00455 }
00456 else{
00457 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
00458 }
00459 MPI_Barrier (MPI_COMM_WORLD);
00460
00461 break;
00462 }
00463
00464 case bound_nodes:{
00465
00466 if (myrank==0){
00467
00468 gnn = new long* [nproc];
00469 for (i=0;i<nproc;i++){
00470 gnn[i] = new long [nsnmas[i]];
00471 }
00472
00473 tnsn=0;
00474
00475 k=domproc[0];
00476 for (j=0;j<nsnmas[k];j++){
00477 gnn[k][j]=buff[j];
00478 if (tnsn<buff[j])
00479 tnsn=buff[j];
00480 }
00481
00482 for (i=1;i<nproc;i++){
00483 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00484 k=domproc[stat.MPI_TAG];
00485 for (j=0;j<nsnmas[k];j++){
00486 gnn[k][j]=buff[j];
00487 if (tnsn<buff[j])
00488 tnsn=buff[j];
00489 }
00490 }
00491 tnsn++;
00492 }
00493 else{
00494 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
00495 }
00496 MPI_Barrier (MPI_COMM_WORLD);
00497
00498 break;
00499 }
00500 default:{
00501 fprintf (stderr,"\n\n wrong type of mesh description is required in functio");
00502 fprintf (stderr,"\n node_on_master (file %s, line %d)\n",__FILE__,__LINE__);
00503 }
00504 }
00505
00506 if (myrank==0){
00507 fprintf (out,"\n\n total number of selected nodes is %ld",tnsn);
00508 fprintf (out,"\n\n group node numbers (gnn)\n");
00509 for (i=0;i<nproc;i++){
00510 fprintf (out,"\n\n subdomain %6ld",i+1);
00511 for (j=0;j<nsnmas[i];j++){
00512 fprintf (out,"\n %6ld %ld",j+1,gnn[i][j]);
00513 }
00514 }
00515 }
00516
00517 delete [] buff;
00518 }
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529 void selnodes::node_multiplicity (FILE *out)
00530 {
00531 long i,j;
00532
00533 if (myrank==0){
00534 if (nodmultip!=NULL)
00535 delete [] nodmultip;
00536 nodmultip = new long [tnsn];
00537 for (i=0;i<tnsn;i++){
00538 nodmultip[i]=0;
00539 }
00540
00541 for (i=0;i<nproc;i++){
00542 for (j=0;j<nsnmas[i];j++){
00543 nodmultip[gnn[i][j]]++;
00544 }
00545 }
00546 fprintf (out,"\n\n node multiplicity (nodmultip)\n");
00547 for (i=0;i<tnsn;i++){
00548 fprintf (out,"\n selected node %6ld %ld",i+1,nodmultip[i]);
00549 }
00550 }
00551 }
00552
00553
00554
00555 void selnodes::dof_multiplicity (FILE *out)
00556 {
00557 long i,j,k,n,nm,ndofn;
00558 MPI_Status stat;
00559 long buffsize;
00560 long *buff;
00561
00562 buffsize = maxndof+1;
00563 buff = new long [buffsize];
00564
00565 if (myrank == 0){
00566 if(dofmultip != NULL){
00567 delete []dofmultip;
00568 }
00569
00570
00571 dofmultip = new long[tndof];
00572 n = 0;
00573 for(i = 0; i < tnsn; i++){
00574 nm = nodmultip[i];
00575 for(j = 0; j < nm-1; j++){
00576 ndofn = ndofnsn[i];
00577 for(k = 0; k < ndofn; k++){
00578 if(doffeti[i][j][k] > 0){
00579 dofmultip[n] = nm;
00580 n++;
00581 }
00582 }
00583 }
00584 }
00585
00586 fprintf (out,"\n\n\n Control of array dofmultip\n\n\nMultiplicity of coarse DOF n = %ld\n\n",n);
00587 for(i = 0; i < tndof; i++){
00588 fprintf (out,"coarse DOF %ld has multiplicity %ld\n",i+1,dofmultip[i]);
00589 }
00590
00591
00592
00593
00594
00595
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613 }
00614 delete [] buff;
00615
00616
00617
00618
00619
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636 }
00637
00638
00639
00640
00641
00642
00643
00644
00645
00646
00647
00648 void selnodes::group_local_nodes (FILE *out)
00649 {
00650 long i,j,k,m,n,min;
00651
00652 if (myrank==0){
00653 ljn = new long* [tnsn];
00654 lsn = new long* [tnsn];
00655 for (i=0;i<tnsn;i++){
00656 ljn[i] = new long [nodmultip[i]];
00657 lsn[i] = new long [nodmultip[i]];
00658 nodmultip[i]=0;
00659 }
00660
00661
00662
00663 for (i=0;i<nproc;i++){
00664 for (j=0;j<nsnmas[i];j++){
00665 k=gnn[i][j];
00666 ljn[k][nodmultip[k]]=j;
00667 lsn[k][nodmultip[k]]=i;
00668 nodmultip[k]++;
00669 }
00670 }
00671
00672
00673 for (i=0;i<tnsn;i++){
00674 for (j=0;j<nodmultip[i];j++){
00675 min=nproc;
00676 for (k=j;k<nodmultip[i];k++){
00677 if (lsn[i][k]<min){
00678 min=lsn[i][k];
00679 m=k;
00680 }
00681 }
00682 n=lsn[i][j];
00683 lsn[i][j]=lsn[i][m];
00684 lsn[i][m]=n;
00685 n=ljn[i][j];
00686 ljn[i][j]=ljn[i][m];
00687 ljn[i][m]=n;
00688 }
00689 }
00690 }
00691
00692
00693 if (myrank==0){
00694 fprintf (out,"\n\n list of local node numbers of connected nodes (ljn)\n");
00695 fprintf (out,"\n\n list of numbers of subdomains which contains connected nodes (lsn)\n");
00696 for (i=0;i<tnsn;i++){
00697 fprintf (out,"\n coarse node %6ld multip %6ld ",i+1,nodmultip[i]);
00698 for (j=0;j<nodmultip[i];j++){
00699 fprintf (out," %ld %ld",ljn[i][j],lsn[i][j]);
00700 }
00701 }
00702 }
00703 }
00704
00705
00706
00707
00708
00709
00710
00711
00712
00713
00714
00715 void selnodes::dof_feti (FILE *out)
00716 {
00717 long i,j,k,l,m;
00718
00719 if (myrank==0){
00720
00721 if (ndofnsn!=NULL)
00722 delete [] ndofnsn;
00723 ndofnsn = new long [tnsn];
00724 for (i=0;i<tnsn;i++){
00725 ndofnsn[i]=0;
00726 }
00727
00728 for (i=0;i<nproc;i++){
00729 for (j=0;j<nsnmas[i];j++){
00730 k=snndofnmas[i][j];
00731 l=gnn[i][j];
00732 if (ndofnsn[l]>0){
00733 if (ndofnsn[l]!=k){
00734 fprintf (stderr,"\n\n incompatible number of DOFs at selected node number %ld (file %s, line %d)\n",l,__FILE__,__LINE__);
00735 }
00736 }
00737 else{
00738 ndofnsn[l]=k;
00739 }
00740 }
00741 }
00742
00743
00744
00745
00746
00747
00748
00749 doffeti = new long** [tnsn];
00750 for (i=0;i<tnsn;i++){
00751 doffeti[i] = new long* [nodmultip[i]];
00752 for (j=0;j<nodmultip[i];j++){
00753 doffeti[i][j] = new long [ndofnsn[i]];
00754 }
00755 }
00756
00757
00758 for (i=0;i<tnsn;i++){
00759 for (j=0;j<nodmultip[i];j++){
00760 l=ljn[i][j];
00761 m=lsn[i][j];
00762 for (k=0;k<ndofnsn[i];k++){
00763 doffeti[i][j][k]=sndofmas[m][l][k];
00764 }
00765 }
00766 }
00767
00768
00769 tndof=1;
00770 for (i=0;i<tnsn;i++){
00771 for (j=0;j<nodmultip[i]-1;j++){
00772 for (k=0;k<ndofnsn[i];k++){
00773 if (doffeti[i][j][k]>0){
00774 doffeti[i][j][k]=tndof;
00775 tndof++;
00776 }
00777 }
00778 }
00779 }
00780 tndof--;
00781 }
00782
00783 if (myrank==0){
00784 fprintf (out,"\n\n code numbers for FETI method (doffeti)\n");
00785 for (i=0;i<tnsn;i++){
00786 fprintf (out,"\n coarse node %6ld",i+1);
00787 for (j=0;j<nodmultip[i]-1;j++){
00788 fprintf (out," con.n. %6ld sub.n. %6ld ",ljn[i][j],lsn[i][j]);
00789 for (k=0;k<ndofnsn[i];k++){
00790 fprintf (out," %ld",doffeti[i][j][k]);
00791 }
00792 }
00793 }
00794 }
00795 }
00796
00797
00798
00799
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810 void selnodes::number_contrib (long *domproc,FILE *out)
00811 {
00812 long i,j,k,l,m,ii,buffsize;
00813 long *buff;
00814 MPI_Status stat;
00815
00816 buffsize=3;
00817 buff = new long [buffsize];
00818
00819 if (myrank==0){
00820
00821 if (snndofmas!=NULL)
00822 delete [] snndofmas;
00823 snndofmas = new long [nproc];
00824 for (i=0;i<nproc;i++){
00825 snndofmas[i]=0;
00826 }
00827
00828 if (ncndom!=NULL)
00829 delete [] ncndom;
00830 ncndom = new long [nproc];
00831 for (i=0;i<nproc;i++){
00832 ncndom[i]=0;
00833 }
00834
00835
00836 for (i=0;i<nproc;i++){
00837 for (j=0;j<nsnmas[i];j++){
00838 ii=gnn[i][j];
00839 for (k=0;k<nodmultip[ii];k++){
00840 if (lsn[ii][k]==i){
00841 if (k==0){
00842 for (l=0;l<nodmultip[ii]-1;l++){
00843 ncndom[i]++;
00844 for (m=0;m<ndofnsn[ii];m++){
00845 if (doffeti[ii][l][m]>0)
00846 snndofmas[i]++;
00847 }
00848 }
00849 }
00850 else{
00851 ncndom[i]++;
00852 for (m=0;m<ndofnsn[ii];m++){
00853 if (doffeti[ii][k-1][m]>0)
00854 snndofmas[i]++;
00855 }
00856 }
00857 break;
00858 }
00859 }
00860 }
00861 }
00862
00863
00864 maxndof=0;
00865
00866 maxncn=0;
00867 for (i=0;i<nproc;i++){
00868 if (maxndof<snndofmas[i])
00869 maxndof=snndofmas[i];
00870 if (maxncn<ncndom[i])
00871 maxncn=ncndom[i];
00872 }
00873
00874 buff[0]=maxndof;
00875 buff[1]=maxncn;
00876
00877 for (i=1;i<nproc;i++){
00878 j=domproc[i];
00879 buff[2]=ncndom[j];
00880 MPI_Send (buff,buffsize,MPI_LONG,i,myrank,MPI_COMM_WORLD);
00881 }
00882
00883 j=domproc[0];
00884 buff[2]=ncndom[j];
00885 }
00886 else{
00887 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00888 }
00889 MPI_Barrier (MPI_COMM_WORLD);
00890
00891 maxndof=buff[0];
00892 maxncn=buff[1];
00893 ncn=buff[2];
00894
00895 if (myrank==0){
00896 fprintf (out,"\n\n number of contributing DOFs to coarse problem (snndofmas)\n");
00897 fprintf (out,"\n maximum number of DOFs on subdomain %ld",maxndof);
00898 fprintf (out,"\n maximum number of contributing nodes on subdomain %ld",maxncn);
00899 for (i=0;i<nproc;i++){
00900 fprintf (out,"\n subdomain number %6ld %ld",i+1,snndofmas[i]);
00901 }
00902 }
00903 fprintf (out,"\n\n number of nodes which contribute to coarse FETI problem (ncn) %ld",ncn);
00904 delete [] buff;
00905 }
00906
00907
00908
00909
00910
00911
00912
00913
00914 void selnodes::contrib_dofs (gtopology *top,long *domproc,FILE *out)
00915 {
00916 long i,j,k,l,m,ii,jj,ndofn,buffsize,min;
00917 long *buff;
00918 MPI_Status stat;
00919
00920 buffsize=maxncn;
00921 buff = new long [buffsize];
00922
00923 if (myrank==0){
00924
00925
00926 for (i=1;i<nproc;i++){
00927
00928 for (j=0;j<buffsize;j++){
00929 buff[j]=0;
00930 }
00931
00932 m=0;
00933 for (j=0;j<tnsn;j++){
00934 for (k=0;k<nodmultip[j];k++){
00935 if (lsn[j][k]==domproc[i]){
00936 if (k==0){
00937 for (l=0;l<nodmultip[j]-1;l++){
00938 buff[m]=ljn[j][k];
00939 buff[m]=0-buff[m]-1;
00940 m++;
00941 }
00942 }
00943 else{
00944 buff[m]=ljn[j][k];
00945 m++;
00946 }
00947 break;
00948 }
00949 }
00950 }
00951
00952 MPI_Send (buff,buffsize,MPI_LONG,i,myrank,MPI_COMM_WORLD);
00953 }
00954
00955 i=0;
00956 for (j=0;j<buffsize;j++){
00957 buff[j]=0;
00958 }
00959
00960 m=0;
00961 for (j=0;j<tnsn;j++){
00962 for (k=0;k<nodmultip[j];k++){
00963 if (lsn[j][k]==domproc[i]){
00964 if (k==0){
00965 for (l=0;l<nodmultip[j]-1;l++){
00966 buff[m]=ljn[j][k];
00967 buff[m]=0-buff[m]-1;
00968 m++;
00969 }
00970 }
00971 else{
00972 buff[m]=ljn[j][k];
00973 m++;
00974 }
00975 break;
00976 }
00977 }
00978 }
00979 }
00980 else{
00981 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
00982 }
00983 MPI_Barrier (MPI_COMM_WORLD);
00984
00985
00986 fprintf (out,"\n\n kontrola bufferu na vsech uzlech");
00987 for (i=0;i<ncn;i++){
00988 fprintf (out,"\n %ld %ld",i+1,buff[i]);
00989 }
00990 for (i=0;i<ncn;i++){
00991 if (buff[i]<0)
00992 min=0-buff[i]-1;
00993 else
00994 min=buff[i];
00995
00996 l=i;
00997 for (j=i+1;j<ncn;j++){
00998 if (buff[j]<0)
00999 k=0-buff[j]-1;
01000 else
01001 k=buff[j];
01002 if (min>k){
01003 l=j;
01004 min=k;
01005 }
01006 }
01007 k=buff[i];
01008 buff[i]=buff[l];
01009 buff[l]=k;
01010 }
01011
01012 fprintf (out,"\n\n kontrola bufferu na vsech uzlech");
01013 for (i=0;i<ncn;i++){
01014 fprintf (out,"\n %ld %ld",i+1,buff[i]);
01015 }
01016 fprintf (out,"\n konec kontroly\n");
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028 ndof=0;
01029 for (i=0;i<ncn;i++){
01030 j=buff[i];
01031 if (j<0){
01032 j=0-j-1;
01033 }
01034 l=lnsn[j];
01035 ndofn=top->give_ndofn (l);
01036 for (k=0;k<ndofn;k++){
01037 if (top->give_dof (l,k)>0)
01038 ndof++;
01039 }
01040 }
01041
01042
01043
01044
01045
01046
01047 if (ldof!=NULL)
01048 delete [] ldof;
01049 ldof = new long [ndof];
01050
01051 m=0;
01052 for (i=0;i<ncn;i++){
01053 ii=buff[i];
01054 if (ii<0){
01055 ii=0-ii-1;
01056 jj=lnsn[ii];
01057 ndofn=top->give_ndofn (jj);
01058 for (j=0;j<ndofn;j++){
01059 l=top->give_dof (jj,j);
01060 if (l>0){
01061 ldof[m]=0-l;
01062 m++;
01063 }
01064 }
01065 }
01066 else{
01067 jj=lnsn[ii];
01068 ndofn=top->give_ndofn (jj);
01069 for (j=0;j<ndofn;j++){
01070 l=top->give_dof (jj,j);
01071 if (l>0){
01072 ldof[m]=l;
01073 m++;
01074 }
01075 }
01076 }
01077 }
01078 delete [] buff;
01079
01080 if (myrank==0){
01081 cndom = new long* [nproc];
01082 for (i=0;i<nproc;i++){
01083 cndom[i] = new long [snndofmas[i]];
01084 }
01085
01086 for (i=0;i<nproc;i++){
01087 l=0;
01088 for (j=0;j<nsnmas[i];j++){
01089 m=gnn[i][j];
01090 for (k=0;k<nodmultip[m];k++){
01091 if (lsn[m][k]==i){
01092 if (k==0){
01093 for (ii=0;ii<nodmultip[m]-1;ii++){
01094 for (jj=0;jj<ndofnsn[m];jj++){
01095 if (doffeti[m][ii][jj]>0){
01096 cndom[i][l]=doffeti[m][ii][jj];
01097 l++;
01098 }
01099 }
01100 }
01101 }
01102 else{
01103 for (jj=0;jj<ndofnsn[m];jj++){
01104 if (doffeti[m][k-1][jj]>0){
01105 cndom[i][l]=doffeti[m][k-1][jj];
01106 l++;
01107 }
01108 }
01109 }
01110 break;
01111 }
01112 }
01113 }
01114 }
01115 }
01116
01117 fprintf (out,"\n\n number of DOFs which contribute to coarse FETI problem %ld",ndof);
01118 fprintf (out,"\n array ldof");
01119 for (i=0;i<ndof;i++){
01120 fprintf (out,"\n %6ld %ld",i+1,ldof[i]);
01121 }
01122
01123 if (myrank==0){
01124 fprintf (out,"\n\n code numbers on master (cndom)\n");
01125 for (i=0;i<nproc;i++){
01126 fprintf (out,"\n subdomain number %6ld (number of DOFs %ld)",i+1,snndofmas[i]);
01127 for (j=0;j<snndofmas[i];j++){
01128 fprintf (out,"\n %6ld %ld",j+1,cndom[i][j]);
01129 }
01130 }
01131 }
01132 }
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261 selnodes::selnodes(int nd,int mr,meshdescription d,long *domproc,long *nnsd,long *jj,
01262 long itnbn,long *iicmultip,long *anodmultip,long *icnbn,long *gnbndom,
01263 long **ignbncn,long **isid,
01264 FILE *out,char *proc_name,long mespr)
01265 {
01266 long i,j,k,kk;
01267 long *buff,*buff2,buffsize;
01268 MPI_Status stat;
01269
01270
01271 nproc=nd;
01272
01273 myrank=mr;
01274
01275 md = d;
01276
01277
01278 if (myrank==0){
01279 for (i=1;i<nproc;i++){
01280 nn=nnsd[domproc[i]];
01281 MPI_Send (&nn,1,MPI_LONG,i,myrank,MPI_COMM_WORLD);
01282 }
01283 nn=nnsd[domproc[0]];
01284 }
01285 else{
01286 MPI_Recv (&nn,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01287 }
01288 MPI_Barrier (MPI_COMM_WORLD);
01289
01290
01291
01292 nsn=0;
01293 for (i=0;i<nn;i++){
01294 if (jj[i]>-1)
01295 nsn++;
01296 }
01297
01298 if (nsn==0){
01299 par_print_err(myrank,proc_name,"wrong number of selected nodes in constructor",__FILE__, __LINE__, __func__);
01300 abort();
01301 }
01302
01303
01304
01305
01306 if (myrank==0){
01307
01308 nsnmas = new long [nproc];
01309
01310
01311 maxnsn=nsn;
01312
01313
01314 j=domproc[0];
01315 nsnmas[j]=nsn;
01316
01317 for (i=1;i<nproc;i++){
01318 MPI_Recv (&k,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01319
01320
01321 j=domproc[stat.MPI_TAG];
01322 nsnmas[j]=k;
01323 if (maxnsn<k)
01324 maxnsn=k;
01325 }
01326
01327 for (i=1;i<nproc;i++){
01328 MPI_Send (&maxnsn,1,MPI_LONG,i,myrank,MPI_COMM_WORLD);
01329 }
01330 }
01331 else{
01332 MPI_Send (&nsn,1,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01333 MPI_Recv (&maxnsn,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01334 }
01335 MPI_Barrier (MPI_COMM_WORLD);
01336
01337
01338
01339
01340
01341
01342
01343
01344 fprintf (out,"\n\n the maximum number of selected nodes on subdomain (maxnsn) %ld\n",maxnsn);
01345 if (myrank==0){
01346 fprintf (out,"\n\n the numbers of selected nodes on subdomains (nsnmas)\n");
01347 for (i=0;i<nproc;i++){
01348 fprintf (out,"\n subdomain %6ld %ld",i,nsnmas[i]);
01349 }
01350 }
01351
01352
01353
01354
01355
01356 buffsize=maxnsn;
01357 buff = new long [buffsize];
01358
01359
01360 lnsn = new long [nsn];
01361
01362 cnsn = new long [nsn];
01363
01364
01365 k=0;
01366
01367 kk=0;
01368
01369 for (i=0;i<nn;i++){
01370 if (anodmultip[i]>1){
01371
01372 if (jj[i]>-1){
01373
01374
01375 lnsn[k]=i;
01376
01377 cnsn[k]=icnbn[kk];
01378 buff[k]=cnsn[k];
01379 k++;
01380 }
01381 kk++;
01382 }
01383 else{
01384
01385 if (jj[i]>-1){
01386
01387 par_print_err(myrank,proc_name,"internal node has been selected",__FILE__, __LINE__, __func__);
01388 }
01389 }
01390 }
01391
01392
01393 if (myrank==0){
01394
01395 cnsnmas = new long* [nproc];
01396 for (i=0;i<nproc;i++){
01397 cnsnmas[i]=new long [nsnmas[i]];
01398 }
01399
01400
01401 k=domproc[0];
01402
01403 for (j=0;j<nsnmas[k];j++){
01404 cnsnmas[k][j]=buff[j];
01405 }
01406
01407 for (i=1;i<nproc;i++){
01408 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01409
01410
01411 k=domproc[stat.MPI_TAG];
01412
01413 for (j=0;j<nsnmas[k];j++){
01414 cnsnmas[k][j]=buff[j];
01415 }
01416 }
01417 }
01418 else{
01419 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01420 }
01421 MPI_Barrier (MPI_COMM_WORLD);
01422
01423
01424
01425
01426
01427
01428
01429 if (md==all_nodes){
01430
01431 gnsn = new long [nsn];
01432
01433 k=0;
01434
01435 kk=0;
01436
01437 for (i=0;i<nn;i++){
01438 if (anodmultip[i]>1){
01439
01440 if (jj[i]>-1){
01441
01442
01443 gnsn[k]=gnbndom[kk];
01444 buff[k]=gnsn[k];
01445 k++;
01446 }
01447 kk++;
01448 }
01449 else{
01450
01451 if (jj[i]>-1){
01452
01453 par_print_err(myrank,proc_name,"internal node has been selected",__FILE__, __LINE__, __func__);
01454 }
01455 }
01456 }
01457 if (myrank==0){
01458
01459 gnsnmas = new long* [nproc];
01460 for (i=0;i<nproc;i++){
01461 gnsnmas[i]=new long [nsnmas[i]];
01462 }
01463
01464 k=domproc[0];
01465
01466 for (j=0;j<nsnmas[k];j++){
01467 gnsnmas[k][j]=buff[j];
01468 }
01469 for (i=1;i<nproc;i++){
01470 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01471
01472
01473 k=domproc[stat.MPI_TAG];
01474
01475 for (j=0;j<nsnmas[k];j++){
01476 gnsnmas[k][j]=buff[j];
01477 }
01478 }
01479 }
01480 else{
01481 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01482 }
01483 MPI_Barrier (MPI_COMM_WORLD);
01484 }
01485 if (myrank==0){
01486
01487 tnbn=itnbn;
01488
01489 icmultip = new long [tnbn];
01490 for (i=0;i<tnbn;i++){
01491 icmultip[i]=iicmultip[i];
01492 }
01493 }
01494
01495 if (md==all_nodes){
01496 if (myrank==0){
01497
01498 gnbncn = new long* [tnbn];
01499 for (i=0;i<tnbn;i++){
01500 gnbncn[i]=new long [icmultip[i]];
01501 }
01502
01503 sid = new long* [tnbn];
01504 for (i=0;i<tnbn;i++){
01505 sid[i] = new long [icmultip[i]];
01506 }
01507 for (i=0;i<tnbn;i++){
01508 for (j=0;j<icmultip[i];j++){
01509 gnbncn[i][j]=ignbncn[i][j];
01510 sid[i][j]=isid[i][j];
01511 }
01512 }
01513 }
01514 }
01515 MPI_Barrier (MPI_COMM_WORLD);
01516
01517 delete [] buff;
01518
01519 tnsn=0;
01520
01521 snndof=0;
01522
01523 maxsnndof=0;
01524
01525 tndofsn=0;
01526
01527 lsng = NULL;
01528 ldof = NULL;
01529
01530 ldofmultip = NULL;
01531
01532 ndofdom = NULL;
01533
01534 cnm = NULL;
01535
01536 if (myrank==0){
01537
01538 gnn = NULL;
01539
01540 nodmultip = NULL;
01541
01542 dofmultip = NULL;
01543
01544 cndom = NULL;
01545
01546 ljn = NULL;
01547
01548 lsn = NULL;
01549
01550 doffeti = NULL;
01551
01552 ncndom = NULL;
01553
01554
01555 snicmultip = NULL;
01556
01557 snndofmas = NULL;
01558
01559 snndofnmas = NULL;
01560
01561 sndofmas = NULL;
01562
01563 sngnbncn = NULL;
01564
01565 snsid = NULL;
01566
01567 ndofnsn = NULL;
01568
01569 codensn = NULL;
01570
01571 cnmas = NULL;
01572 }
01573 }
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588 void selnodes::node_coarse_numbers (FILE *out)
01589 {
01590 long i,j,k;
01591 long *av;
01592
01593 if (myrank==0){
01594
01595 av = new long [tnbn];
01596 for (i=0;i<tnbn;i++){
01597 av[i]=0;
01598 }
01599
01600
01601 for (i=0;i<nproc;i++){
01602
01603 for (j=0;j<nsnmas[i];j++){
01604 av[cnsnmas[i][j]]++;
01605 }
01606 }
01607
01608
01609 tnsn=0;
01610 for (i=0;i<tnbn;i++){
01611 if (av[i]>0)
01612 tnsn++;
01613 }
01614
01615
01616 if (snicmultip!=NULL){
01617 delete [] snicmultip;
01618 }
01619 snicmultip = new long [tnsn];
01620
01621 k=0;
01622 for (i=0;i<tnbn;i++){
01623 if (av[i]>0){
01624 snicmultip[k]=icmultip[i];
01625 k++;
01626 }
01627 }
01628 }
01629
01630 if (myrank==0){
01631 if (md==all_nodes){
01632
01633
01634 if (sngnbncn!=NULL){
01635 for (i=0;i<tnsn;i++){
01636 delete [] sngnbncn[i];
01637 }
01638 delete [] sngnbncn;
01639 }
01640 sngnbncn = new long* [tnsn];
01641 for (i=0;i<tnsn;i++){
01642 sngnbncn[i]=new long [snicmultip[i]];
01643 }
01644
01645
01646 if (snsid!=NULL){
01647 for (i=0;i<tnsn;i++){
01648 delete [] snsid[i];
01649 }
01650 delete [] snsid;
01651 }
01652 snsid = new long* [tnsn];
01653 for (i=0;i<tnsn;i++){
01654 snsid[i] = new long [snicmultip[i]];
01655 }
01656
01657
01658 k=0;
01659 for (i=0;i<tnbn;i++){
01660 if (av[i]>0){
01661 for (j=0;j<snicmultip[k];j++){
01662 sngnbncn[k][j]=gnbncn[i][j];
01663 snsid[k][j]=sid[i][j];
01664 }
01665 k++;
01666 }
01667 }
01668
01669 for (i=0;i<tnbn;i++){
01670 delete [] gnbncn[i];
01671 }
01672 delete [] gnbncn;
01673 gnbncn = NULL;
01674
01675 for (i=0;i<tnbn;i++){
01676 delete [] sid[i];
01677 }
01678 delete [] sid;
01679 sid = NULL;
01680
01681 }
01682 delete [] icmultip;
01683 icmultip = NULL;
01684 delete [] av;
01685 }
01686 fprintf (out,"\n\n the total number of selected nodes (tnsn) %ld",tnsn);
01687 }
01688
01689
01690
01691
01692
01693
01694
01695
01696
01697
01698
01699
01700
01701
01702
01703
01704 void selnodes::number_all_dofs (gtopology *top,long *domproc,FILE *out)
01705 {
01706 long i,j,k;
01707 MPI_Status stat;
01708
01709
01710 snndof=0;
01711
01712 for (i=0;i<nsn;i++){
01713 j=lnsn[i];
01714 snndof+=top->give_ndofn (j);
01715 }
01716
01717 if (myrank==0){
01718
01719 if (snndofmas!=NULL)
01720 delete [] snndofmas;
01721 snndofmas=new long [nproc];
01722
01723
01724 maxsnndof=snndof;
01725
01726
01727 j=domproc[0];
01728 snndofmas[j]=snndof;
01729
01730 for (i=1;i<nproc;i++){
01731 MPI_Recv (&k,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01732
01733
01734 j=domproc[stat.MPI_TAG];
01735 snndofmas[j]=k;
01736 if (maxsnndof<k)
01737 maxsnndof=k;
01738 }
01739
01740 for (i=1;i<nproc;i++){
01741 MPI_Send (&maxsnndof,1,MPI_LONG,i,myrank,MPI_COMM_WORLD);
01742 }
01743
01744
01745 }
01746 else{
01747 MPI_Send (&snndof,1,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01748 MPI_Recv (&maxsnndof,1,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01749 }
01750 MPI_Barrier (MPI_COMM_WORLD);
01751
01752
01753
01754
01755
01756 if (myrank==0){
01757 fprintf (out,"\n the maximum number of selected DOFs on subdomains (maxsnndof) %ld\n",maxsnndof);
01758 fprintf (out,"\n\n numbers of DOFs on subdomains (snndofmas)\n");
01759 for (i=0;i<nproc;i++){
01760 fprintf (out,"\n subdomain number %6ld %ld",i,snndofmas[i]);
01761 }
01762 }
01763 }
01764
01765
01766
01767
01768
01769
01770
01771
01772
01773
01774
01775
01776
01777
01778
01779
01780
01781 void selnodes::ndofn_on_master (gtopology *top,long *domproc,FILE *out)
01782 {
01783 long i,j,k,buffsize;
01784 long *buff;
01785 MPI_Status stat;
01786
01787 buffsize=maxsnndof;
01788 buff = new long [buffsize];
01789
01790 for (i=0;i<nsn;i++){
01791
01792 j=lnsn[i];
01793 buff[i]=top->give_ndofn (j);
01794 }
01795
01796 if (myrank==0){
01797
01798 snndofnmas = new long* [nproc];
01799 for (i=0;i<nproc;i++){
01800 snndofnmas[i] = new long [nsnmas[i]];
01801 }
01802
01803
01804 k=domproc[0];
01805 for (j=0;j<nsnmas[k];j++){
01806 snndofnmas[k][j]=buff[j];
01807 }
01808
01809
01810 for (i=1;i<nproc;i++){
01811 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01812 k=domproc[stat.MPI_TAG];
01813 for (j=0;j<nsnmas[k];j++){
01814 snndofnmas[k][j]=buff[j];
01815 }
01816 }
01817
01818 }
01819 else{
01820 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01821 }
01822 MPI_Barrier (MPI_COMM_WORLD);
01823 delete [] buff;
01824
01825
01826
01827
01828 if (myrank==0){
01829 fprintf (out,"\n\n numbers of DOFs on selected nodes (snndofnmas)\n");
01830 for (i=0;i<nproc;i++){
01831 fprintf (out,"\n subdomain number %6ld",i);
01832 for (j=0;j<nsnmas[i];j++){
01833 fprintf (out,"\n selected node %6ld %ld",j,snndofnmas[i][j]);
01834 }
01835 }
01836 }
01837 }
01838
01839
01840
01841
01842
01843
01844
01845
01846
01847
01848
01849
01850
01851
01852 void selnodes::dof_indicators (gtopology *top,long *domproc,FILE *out)
01853 {
01854 long i,j,k,l,m,ndofn,buffsize;
01855 long *buff;
01856 MPI_Status stat;
01857
01858 buffsize=maxsnndof;
01859 buff = new long [buffsize];
01860
01861
01862 l=0;
01863
01864 for (i=0;i<nsn;i++){
01865
01866 j=lnsn[i];
01867
01868 ndofn=top->give_ndofn (j);
01869
01870 for (k=0;k<ndofn;k++){
01871 buff[l]=top->give_dof (j,k);
01872 l++;
01873 }
01874 }
01875
01876 if (myrank==0){
01877
01878 if (sndofmas!=NULL){
01879 for (i=0;i<nproc;i++){
01880 for (j=0;j<nsnmas[i];j++){
01881 delete [] sndofmas[i][j];
01882 }
01883 delete [] sndofmas[i];
01884 }
01885 delete [] sndofmas;
01886 }
01887
01888 sndofmas = new long** [nproc];
01889 for (i=0;i<nproc;i++){
01890 sndofmas[i] = new long* [nsnmas[i]];
01891 for (j=0;j<nsnmas[i];j++){
01892 sndofmas[i][j] = new long [snndofnmas[i][j]];
01893 }
01894 }
01895
01896
01897 k=domproc[0];
01898 m=0;
01899 for (j=0;j<nsnmas[k];j++){
01900 for (l=0;l<snndofnmas[k][j];l++){
01901 sndofmas[k][j][l]=buff[m];
01902 m++;
01903 }
01904 }
01905
01906
01907 for (i=1;i<nproc;i++){
01908 MPI_Recv (buff,buffsize,MPI_LONG,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&stat);
01909 k=domproc[stat.MPI_TAG];
01910 m=0;
01911 for (j=0;j<nsnmas[k];j++){
01912 for (l=0;l<snndofnmas[k][j];l++){
01913 sndofmas[k][j][l]=buff[m];
01914 m++;
01915 }
01916 }
01917 }
01918 }
01919 else{
01920 MPI_Send (buff,buffsize,MPI_LONG,0,myrank,MPI_COMM_WORLD);
01921 }
01922 MPI_Barrier (MPI_COMM_WORLD);
01923
01924 delete [] buff;
01925
01926 printf ("\n selnodes %d %p ",myrank,out);
01927
01928
01929
01930 if (myrank==0){
01931 fprintf (out,"\n\n DOFs indicators on master (sndofmas)\n");
01932 for (i=0;i<nproc;i++){
01933 fprintf (out,"\n subdomain number %6ld",i);
01934 for (j=0;j<nsnmas[i];j++){
01935 fprintf (out,"\n selected node %6ld ",j);
01936 for (k=0;k<snndofnmas[i][j];k++){
01937 fprintf (out," %ld",sndofmas[i][j][k]);
01938 }
01939 }
01940 }
01941 }
01942 }
01943
01944
01945
01946
01947
01948
01949
01950
01951
01952
01953
01954
01955
01956
01957
01958
01959
01960 void selnodes::schur_ordering (gtopology *top,long **dofind,FILE *out)
01961 {
01962 long i,j,k,l,m,g,ndofn;
01963 long *av,*aux;
01964
01965 if (myrank==0){
01966
01967
01968 if (codensn!=NULL){
01969 for (i=0;i<tnsn;i++){
01970 delete [] codensn[i];
01971 }
01972 delete [] codensn;
01973 }
01974 codensn = new long* [tnsn];
01975 for (i=0;i<tnsn;i++){
01976 codensn[i] = NULL;
01977 }
01978
01979
01980 if (ndofnsn!=NULL){
01981 delete [] ndofnsn;
01982 }
01983 ndofnsn = new long [tnsn];
01984
01985
01986 for (i=0;i<nproc;i++){
01987
01988 for (j=0;j<nsnmas[i];j++){
01989
01990 g=gnsnmas[i][j];
01991
01992 l=cnsnmas[i][j];
01993
01994 ndofn=snndofnmas[i][j];
01995 if (codensn[l]==NULL){
01996 codensn[l] = new long [ndofn];
01997 ndofnsn[l]=ndofn;
01998 }
01999
02000 for (k=0;k<ndofn;k++){
02001 if (dofind[g][k]==1){
02002
02003 codensn[l][k]=sndofmas[i][j][k];
02004 }
02005 else{
02006
02007 codensn[l][k]=0;
02008 }
02009 }
02010 }
02011 }
02012
02013
02014
02015
02016
02017 tndofsn=0;
02018
02019 for (i=0;i<tnsn;i++){
02020
02021 for (j=0;j<ndofnsn[i];j++){
02022 if (tndofsn<codensn[i][j])
02023 tndofsn=codensn[i][j];
02024 }
02025 }
02026 tndofsn--;
02027 if (tndofsn<0) tndofsn=0;
02028 aux = new long [tndofsn];
02029 for (i=0;i<tndofsn;i++){
02030 aux[i]=-1;
02031 }
02032
02033 tndofsn=1;
02034
02035 for (i=0;i<tnsn;i++){
02036
02037 for (j=0;j<ndofnsn[i];j++){
02038 k=codensn[i][j];
02039 if (k==1){
02040 codensn[i][j]=tndofsn;
02041 tndofsn++;
02042 }
02043 if (k>1){
02044 if (aux[k-2]==-1){
02045 codensn[i][j]=tndofsn;
02046 aux[k-2]=tndofsn;
02047 tndofsn++;
02048 }
02049 else{
02050 codensn[i][j]=aux[k-2];
02051 }
02052 }
02053 }
02054 }
02055 tndofsn--;
02056 delete [] aux;
02057
02058
02059
02060 aux = new long [tndofsn];
02061
02062
02063 for (i=0;i<nproc;i++){
02064 snndofmas[i]=0;
02065 }
02066
02067 for (i=0;i<nproc;i++){
02068 for (j=0;j<tndofsn;j++){
02069 aux[j]=0;
02070 }
02071
02072 for (j=0;j<nsnmas[i];j++){
02073
02074 l=cnsnmas[i][j];
02075
02076 ndofn=snndofnmas[i][j];
02077
02078 for (k=0;k<ndofn;k++){
02079 if (codensn[l][k]>0){
02080 if (aux[codensn[l][k]-1]==0){
02081 snndofmas[i]++;
02082 aux[codensn[l][k]-1]=1;
02083 }
02084 }
02085 }
02086 }
02087 }
02088
02089 if (cnmas!=NULL){
02090 for (i=0;i<nproc;i++){
02091 delete [] cnmas[i];
02092 }
02093 delete [] cnmas;
02094 }
02095 cnmas = new long* [nproc];
02096 for (i=0;i<nproc;i++){
02097 cnmas[i] = new long [snndofmas[i]];
02098 }
02099
02100 av = new long [nproc];
02101 for (i=0;i<nproc;i++){
02102 av[i]=0;
02103 }
02104
02105 for (i=0;i<nproc;i++){
02106 for (j=0;j<tndofsn;j++){
02107 aux[j]=0;
02108 }
02109
02110 for (j=0;j<nsnmas[i];j++){
02111
02112 l=cnsnmas[i][j];
02113
02114 ndofn=snndofnmas[i][j];
02115
02116 for (k=0;k<ndofn;k++){
02117 m=codensn[l][k];
02118 if (m>0){
02119 if (aux[m-1]==0){
02120 cnmas[i][av[i]]=m;
02121 av[i]++;
02122 aux[m-1]=1;
02123 }
02124 }
02125 }
02126 }
02127 }
02128 delete [] av;
02129 delete [] aux;
02130 }
02131
02132
02133
02134 if (myrank==0){
02135 fprintf (out,"\n\n\n tndofsn - total number of DOFs in selected nodes %ld",tndofsn);
02136
02137 fprintf (out,"\n\n code numbers of Schur ordering (cnmas)\n");
02138 for (i=0;i<nproc;i++){
02139 fprintf (out,"\n subdomain number %6ld",i);
02140 for (j=0;j<snndofmas[i];j++){
02141 fprintf (out,"\n dof %6ld %ld",j,cnmas[i][j]);
02142 }
02143 }
02144 }
02145 }
02146
02147
02148
02149
02150
02151
02152
02153
02154
02155
02156
02157
02158
02159
02160
02161
02162
02163 void selnodes::schur_ordering (gtopology *top,FILE *out)
02164 {
02165 long i,j,k,l,m,ndofn;
02166
02167 if (myrank==0){
02168
02169 if (ndofnsn!=NULL)
02170 delete [] ndofnsn;
02171 ndofnsn = new long [tnsn];
02172 for (i=0;i<tnsn;i++){
02173 ndofnsn[i]=0;
02174 }
02175
02176 for (i=0;i<nproc;i++){
02177 for (j=0;j<nsnmas[i];j++){
02178 k=snndofnmas[i][j];
02179 l=cnsnmas[i][j];
02180 if (ndofnsn[l]>0){
02181 if (ndofnsn[l]!=k){
02182 fprintf (stderr,"\n\n incompatible number of DOFs at selected node number %ld (file %s, line %d)\n",l,__FILE__,__LINE__);
02183 }
02184 }
02185 else{
02186 ndofnsn[l]=k;
02187 }
02188 }
02189 }
02190
02191
02192 codensn = new long* [tnsn];
02193 for (i=0;i<tnsn;i++){
02194 codensn[i] = new long [ndofnsn[i]];
02195 }
02196
02197 for (i=0;i<nproc;i++){
02198 for (j=0;j<nsnmas[i];j++){
02199 l=cnsnmas[i][j];
02200 for (k=0;k<ndofnsn[l];k++){
02201 codensn[l][k]=sndofmas[i][j][k];
02202 }
02203 }
02204 }
02205
02206
02207
02208 tndofsn=1;
02209 for (i=0;i<tnsn;i++){
02210 for (j=0;j<ndofnsn[i];j++){
02211 if (codensn[i][j]>0){
02212 codensn[i][j]=tndofsn;
02213 tndofsn++;
02214 }
02215 }
02216 }
02217 tndofsn--;
02218
02219
02220
02221
02222 for (i=0;i<nproc;i++){
02223 snndofmas[i]=0;
02224 for (j=0;j<nsnmas[i];j++){
02225 l=cnsnmas[i][j];
02226 for (k=0;k<ndofnsn[l];k++){
02227 if (codensn[l][k]>0)
02228 snndofmas[i]++;
02229 }
02230 }
02231 }
02232
02233 cnmas = new long *[nproc];
02234 for (i=0;i<nproc;i++){
02235 cnmas[i] = new long [snndofmas[i]];
02236 }
02237
02238 for (i=0;i<nproc;i++){
02239 m=0;
02240 for (j=0;j<nsnmas[i];j++){
02241 l=cnsnmas[i][j];
02242 for (k=0;k<ndofnsn[l];k++){
02243 if (codensn[l][k]>0){
02244 cnmas[i][m]=codensn[l][k];
02245 m++;
02246 }
02247 }
02248 }
02249 }
02250 }
02251
02252
02253 if (myrank==0){
02254 fprintf (out,"\n\n\n tndofsn %ld \n",tndofsn);
02255 fprintf (out,"\n\n\n array cnmas \n\n");
02256 for (i=0;i<nproc;i++){
02257 fprintf (out,"\n");
02258 fprintf (out,"\n snndofmas %6ld",snndofmas[i]);
02259 for (j=0;j<snndofmas[i];j++){
02260 fprintf (out,"\n cnmas %6ld %6ld",j,cnmas[i][j]);
02261 }
02262 }
02263 }
02264
02265
02266
02267
02268
02269
02270
02271
02272
02273
02274
02275
02276
02277
02278
02279
02280
02281
02282
02283
02284
02285
02286
02287
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297
02298
02299
02300
02301 }