408typename AdaptiveMeshRefinement<SC,LO,GO,NO>::DomainPtr_Type
AdaptiveMeshRefinement<SC,LO,GO,NO>::globalAlgorithm(DomainPtr_Type domainP1, DomainPtr_Type domainP12, BlockMultiVectorConstPtr_Type solution,ProblemPtr_Type problem, RhsFunc_Type rhsFunc ){
409 TEUCHOS_TEST_FOR_EXCEPTION( !hasProblemType_ , std::runtime_error,
"No consideration of Problem Type. Please specify or only use: refineArea or refineUniform.");
411 solution_ = solution;
413 currentIter_ = domainsP1_.size() ;
419 comm_ = domainP1 ->getComm();
421 if(this->comm_->getRank() == 0 && currentIter_ < maxIter_){
422 std::cout <<
" -- Adaptive Mesh Refinement --" << std::endl;
423 std::cout <<
" " << std::endl;
426 maxRank_ = std::get<1>(domainP1->getMesh()->rankRange_);
429 domainsP1_.push_back(domainP1);
430 domainsP12_.push_back(domainP12);
432 domainP1_ = domainP1;
433 domainP12_ = domainP12;
437 inputMeshP1_ = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainP1->getMesh() ,
true);
438 inputMeshP1_->FEType_ = domainP1->getFEType();
444 MeshUnstrPtr_Type outputMesh(
new MeshUnstr_Type(domainP1->getComm(), inputMeshP1_->volumeID_));
447 domainRefined->initWithDomain(domainP1);
449 inputMeshP12_ = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainP12->getMesh() ,
true);
450 inputMeshP12_->FEType_ = domainP12->getFEType();
461 SurfaceElementsPtr_Type surfaceTriangleElements = inputMeshP12_->getSurfaceTriangleElements();
462 if(surfaceTriangleElements.is_null()){
464 refinementFactory.
buildSurfaceTriangleElements( inputMeshP12_->getElementsC(),inputMeshP12_->getEdgeElements(),surfaceTriangleElements, inputMeshP12_->getEdgeMap(),inputMeshP12_->getElementMap() );
465 inputMeshP12_->surfaceTriangleElements_ = surfaceTriangleElements;
466 inputMeshP1_->surfaceTriangleElements_ = surfaceTriangleElements;
468 else if(surfaceTriangleElements->numberElements() ==0){
469 refinementFactory.
buildSurfaceTriangleElements( inputMeshP12_->getElementsC(),inputMeshP12_->getEdgeElements(),inputMeshP12_->getSurfaceTriangleElements() , inputMeshP12_->getEdgeMap(),inputMeshP12_->getElementMap() );
470 inputMeshP12_->surfaceTriangleElements_ = surfaceTriangleElements;
471 inputMeshP1_->surfaceTriangleElements_ = surfaceTriangleElements;
475 if(currentIter_ == 0 && dim_ == 2){
476 inputMeshP1_->assignEdgeFlags();
477 inputMeshP12_->assignEdgeFlags();
480 bool coarsening=
false;
481 if(coarseningCycle_ > 0 && currentIter_>0){
482 if(currentIter_ % coarseningCycle_ == 0)
485 errorElementsMv_ =Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getElementMap(), 1 ) );
486 errorElementsMv_->putScalar(0.);
487 if( coarsening==
true && currentIter_ < maxIter_ ){
490 errorElementsMv_ = errorEstimator.
estimateError(inputMeshP12_, inputMeshP1_, solution, rhsFunc_, domainP12->getFEType());
492 errorEstimationMv_.push_back(errorElementsMv_);
496 int k = currentIter_;
498 MeshUnstrPtrArray_Type meshUnstructuredP1(currentIter_+n);
500 for(
int i=0; i<currentIter_+1-m; i++)
501 meshUnstructuredP1[i] = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainsP1_[i]->getMesh() ,
true);
505 MultiVectorPtr_Type errorElements;
506 MeshUnstrPtr_Type meshUnstructuredRefined_k ;
507 MeshUnstrPtr_Type meshUnstructuredRefined_k_1;
508 MeshUnstrPtr_Type meshUnstructuredRefined_k_m_1;
509 for(
int i=0; i<m-1 ; i++){
510 meshUnstructuredRefined_k = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainsP1_[currentIter_-i]->getMesh() ,
true);
511 meshUnstructuredRefined_k_1 = Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainsP1_[currentIter_-1-i]->getMesh() ,
true);
513 errorElements = errorEstimator.
determineCoarseningError(meshUnstructuredRefined_k,meshUnstructuredRefined_k_1,errorEstimationMv_[currentIter_-i],
"backwards",markingStrategy_,theta_);
515 errorEstimationMv_[currentIter_-1-i]= errorElements;
521 meshUnstructuredRefined_k_m_1 = meshUnstructuredRefined_k_1;
523 meshUnstructuredRefined_k_m_1 =Teuchos::rcp_dynamic_cast<MeshUnstr_Type>( domainsP1_[currentIter_]->getMesh() ,
true);
526 for(
int i=0; i< n; i++){
529 errorElements = errorEstimator.
determineCoarseningError(meshUnstructuredRefined_k_m_1,meshUnstructuredP1[iterC],errorEstimationMv_[iterC+1],
"backwards",markingStrategy_,theta_);
532 errorElements = errorEstimator.
determineCoarseningError(meshUnstructuredP1[iterC-1],meshUnstructuredP1[iterC],errorEstimationMv_[iterC-1],
"forwards",markingStrategy_,theta_);
534 if(iterC > errorEstimationMv_.size())
535 errorEstimationMv_.push_back(errorElements);
537 errorEstimationMv_[iterC]=errorElements;
540 errorEstimator.
markElements(errorElements,theta_,markingStrategy_, meshUnstructuredP1[iterC]);
542 refinementFactory.
refineMesh(meshUnstructuredP1[iterC],iterC, outputMesh, refinementMode_);
544 meshUnstructuredP1[iterC+1] = outputMesh;
545 outputMesh.reset(
new MeshUnstr_Type(domainP1->getComm(), inputMeshP1_->volumeID_));
548 outputMesh = meshUnstructuredP1[iterC+1];
551 else if( currentIter_ < maxIter_ ){
553 errorElementsMv_ = errorEstimator.
estimateError(inputMeshP12_, inputMeshP1_, solution, rhsFunc_, domainP12->getFEType());
555 errorEstimationMv_.push_back(errorElementsMv_);
557 errorEstimator.
markElements(errorElementsMv_,theta_,markingStrategy_, inputMeshP1_);
559 refinementFactory.
refineMesh(inputMeshP1_,currentIter_, outputMesh, refinementMode_);
564 MultiVectorPtr_Type procNumTmp = Teuchos::rcp(
new MultiVector_Type(domainP12->getElementMap() , 1 ) );
566 procNumTmp->putScalar(comm_->getRank());
567 MultiVectorConstPtr_Type vecDecompositionConst = procNumTmp;
572 MultiVectorConstPtr_Type exactSolutionP;
573 MultiVectorConstPtr_Type exportSolutionPMv;
575 if( calculatePressure_ ){
576 exportSolutionPMv = problem->getSolution()->getBlock(1);
582 calcErrorNorms(exactSolution,solution->getBlock(0), exactSolutionP);
584 if(this->exportWithParaview_ && initExporter_==
false){
587 this->
exportSolution( inputMeshP12_, problem->getSolution()->getBlock(0), errorNodesMv_, exactSolution, exportSolutionPMv, exactSolutionP);
588 if( currentIter_< maxIter_)
589 this->
exportError( inputMeshP12_, errorElementsMv_, errorH1ElementsMv_ , difH1EtaElementsMv_ , vecDecompositionConst );
593 maxErrorEl.push_back(errorElementsMv_->getMax());
594 maxErrorKn.push_back(errorNodesMv_->getMax());
595 numElements.push_back(domainP12_->getElementMap()->getMaxAllGlobalIndex()+1);
596 numElementsProc.push_back(domainP12_->getElementsC()->numberElements());
598 numNodes.push_back(domainP12_->getMapUnique()->getMaxAllGlobalIndex()+1);
600 if(currentIter_ == maxIter_){
602 exporterSol_->closeExporter();
603 exporterError_->closeExporter();
606 std::cout <<
" -- done -- " << std::endl;
608 domainRefined->setMesh(outputMesh);
610 return domainRefined;
677 MultiVectorPtr_Type errorValues = Teuchos::rcp(
new MultiVector_Type( solution_->getBlock(0)->getMap() ) );
679 errorValues->update( 1., exactSolution, -1. ,solutionP12, 0.);
682 MultiVectorConstPtr_Type errorValuesAbs = Teuchos::rcp(
new MultiVector_Type( solution_->getBlock(0)->getMap()) );
683 errorValuesAbs = errorValues;
684 errorValues->abs(errorValuesAbs);
687 errorNodesMv_ = errorValues;
691 errorH1.push_back(std::sqrt(problem_->calculateH1Norm(errorValues)));
695 MultiVectorConstPtr_Type exactSolutionTmp = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getMapUnique() ) );
696 Teuchos::ArrayRCP<double > exactSolutionTmpA = exactSolutionTmp->getDataNonConst(0);
698 MultiVectorConstPtr_Type solutionTmp = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getMapUnique() ) );
699 Teuchos::ArrayRCP<double > solutionTmpA = solutionTmp->getDataNonConst(0);
701 Teuchos::ArrayRCP<double > exactSolutionA = exactSolution->getDataNonConst(0);
703 Teuchos::ArrayRCP<double > solutionP12A = solutionP12->getDataNonConst(0);
706 for(
int i=0; i< dofs_ ; i++){
708 MultiVectorPtr_Type errorValues = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getMapUnique() ) );
709 for(
int j=0; j< solutionTmpA.size(); j++){
710 solutionTmpA[j] = solutionP12A[j*dofs_+i];
711 exactSolutionTmpA[j] = exactSolutionA[j*dofs_+i];
715 errorValues->update( 1., exactSolutionTmp, -1. ,solutionTmp, 0.);
717 MultiVectorConstPtr_Type errorValuesAbs = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getMapUnique()) );
718 errorValuesAbs = errorValues;
720 errorValues->abs(errorValuesAbs);
722 errorL2Tmp += problem_->calculateL2Norm(errorValues);
726 errorL2.push_back(std::sqrt(errorL2Tmp));
730 if(exactSolInput_ ==
true){
731 relError.push_back(std::sqrt(problem_->calculateH1Norm(errorValues)) / std::sqrt(problem_->calculateH1Norm(exactSolution)));
734 if(exactSolInput_ ==
true){
736 Teuchos::ArrayRCP<const double > errorElement = errorElementsMv_->getData(0);
737 for(
int i=0; i < errorElement.size() ; i++){
739 if(eta < errorElement[i])
742 reduceAll<int, double> (*comm_, REDUCE_MAX, eta, outArg (eta));
746 eRelError.push_back(std::sqrt(eta)/ std::sqrt(problem_->calculateH1Norm(solutionP12)));
753 errorH1ElementsMv_ = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getElementMap(), 1 ) );
754 errorH1ElementsMv_->putScalar(0.);
755 Teuchos::ArrayRCP<SC> errorH1ElementsA = errorH1ElementsMv_->getDataNonConst(0);
757 difH1EtaElementsMv_ = Teuchos::rcp(
new MultiVector_Type( domainP12_ ->getElementMap(), 1 ) );
758 difH1EtaElementsMv_->putScalar(0.);
760 if(domainP12_->getElementMap()->getMaxAllGlobalIndex()< 1500){
761 ElementsPtr_Type elements = domainP12_->getElementsC();
762 MapConstPtr_Type elementMap = domainP12_->getElementMap();
763 MapConstPtr_Type mapUnique = domainP12_->getMapUnique();
764 MapConstPtr_Type mapRep = domainP12_->getMapRepeated();
766 vec_GO_Type repIDsVec(0);
767 for(
int i=0; i<mapRep->getMaxLocalIndex()+1; i++){
768 GO gID = mapRep->getGlobalElement(i);
769 for(
int d=0; d < dofs_ ; d++)
770 repIDsVec.push_back(gID*dofs_+d);
772 Teuchos::ArrayView<GO> repIDsVecArray = Teuchos::arrayViewFromVector(repIDsVec);
774 MapPtr_Type mapRepSystem =
775 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), repIDsVecArray , 0, domainP12_->getComm()) );
777 MultiVectorPtr_Type mvValuesError = Teuchos::rcp(
new MultiVector_Type( mapRepSystem, 1 ) );
778 Teuchos::ArrayRCP< SC > mvValuesErrorA = mvValuesError->getDataNonConst(0);
780 MultiVectorPtr_Type mvValuesErrorUnique = Teuchos::rcp(
new MultiVector_Type( solution_->getBlock(0)->getMap(), 1 ) );
784 MultiVectorPtr_Type errorNodesRep = Teuchos::rcp(
new MultiVector_Type( mapRepSystem, 1 ) );
785 Teuchos::ArrayRCP< SC > errorNodesRepA = errorNodesRep->getDataNonConst(0);
786 errorNodesRep->importFromVector(errorNodesMv_,
false,
"Insert");
789 for(
int k=0; k< elementMap->getMaxAllGlobalIndex()+1; k++){
790 mvValuesError->putScalar(0.);
791 vec_GO_Type notOnMyProc(0);
792 vec_dbl_Type notOnMyProcValue(0);
793 if(elementMap->getLocalElement(k) != -1){
794 vec_int_Type nodeList = elements->getElement(elementMap->getLocalElement(k)).getVectorNodeList();
795 for(
int j=0; j< nodeList.size(); j++){
796 for(
int d=0; d < dofs_ ; d++){
797 if(mapUnique->getLocalElement(mapRep->getGlobalElement(nodeList[j])) == -1){
798 GO gID = mapRep->getGlobalElement(nodeList[j]);
799 notOnMyProc.push_back(gID*dofs_+d);
800 notOnMyProcValue.push_back(errorNodesRepA[dofs_*nodeList[j]+d]);
803 mvValuesErrorA[dofs_*nodeList[j]+d] = errorNodesRepA[dofs_*nodeList[j]+d];
807 Teuchos::ArrayView<GO> globalNodeArray = Teuchos::arrayViewFromVector( notOnMyProc);
810 MapPtr_Type mapNodeExport =
811 Teuchos::rcp(
new Map_Type(Teuchos::OrdinalTraits<GO>::invalid(), globalNodeArray, 0, domainP12_->getComm()) );
813 MultiVectorPtr_Type notMV = Teuchos::rcp(
new MultiVector_Type( mapNodeExport, 1 ) );
814 Teuchos::ArrayRCP<SC> notMVA = notMV->getDataNonConst(0);
815 for(
int i=0; i< notMVA.size(); i++)
816 notMVA[i] = notOnMyProcValue[i];
818 mvValuesErrorUnique->importFromVector(mvValuesError,
false,
"Insert");
819 mvValuesErrorUnique->importFromVector(notMV,
false,
"Insert");
821 double valueH1 = problem_->calculateH1Norm(mvValuesErrorUnique);
823 if(elementMap->getLocalElement(k) != -1){
824 errorH1ElementsA[elementMap->getLocalElement(k)]= std::sqrt(valueH1 + valueL2);
829 MultiVectorConstPtr_Type errorH1 = errorH1ElementsMv_;
831 MultiVectorConstPtr_Type errorElements = errorElementsMv_;
833 difH1EtaElementsMv_->update( 1., errorElements , -1. , errorH1, 0.);
835 if( calculatePressure_==
true && exactSolPInput_ ==
true ){
837 MultiVectorPtr_Type errorValuesP = Teuchos::rcp(
new MultiVector_Type( domainP1_->getMapUnique() ) );
840 errorValuesP->update( 1., exactSolutionP, -1. ,solution_->getBlock(1), 0.);
843 MultiVectorConstPtr_Type errorValuesPAbs = Teuchos::rcp(
new MultiVector_Type( domainP1_->getMapUnique() ) );
844 errorValuesPAbs = errorValuesP;
845 errorValuesP->abs(errorValuesPAbs);
847 errorNodesPMv_ = errorValuesP;
849 double errorL2Tmp = problem_->calculateL2Norm(errorValuesP,1);
851 errorL2P.push_back(errorL2Tmp);
895void AdaptiveMeshRefinement<SC,LO,GO,NO>::exportSolution(MeshUnstrPtr_Type mesh, MultiVectorConstPtr_Type exportSolutionMv, MultiVectorConstPtr_Type errorValues, MultiVectorConstPtr_Type exactSolutionMv,MultiVectorConstPtr_Type exportSolutionPMv,MultiVectorConstPtr_Type exactSolutionPMv){
897 std::string exporterType =
"Scalar";
899 exporterType =
"Vector";
903 exporterSol_->addVariable( exportSolutionMv,
"u_h", exporterType, dofs_, domainP12_->getMapUnique() );
904 exporterSol_->addVariable( exactSolutionMv,
"u", exporterType, dofs_, domainP12_->getMapUnique() );
905 exporterSol_->addVariable( errorValues,
"|u-u_h|", exporterType, dofs_, domainP12_->getMapUnique() );
908 if( calculatePressure_ ){
909 exporterSolP_->addVariable( exportSolutionPMv,
"p_h",
"Scalar", dofsP_, domainP1_->getMapUnique() );
911 exporterSolP_->addVariable( exactSolutionPMv,
"p",
"Scalar", dofsP_, domainP1_->getMapUnique() );
912 exporterSolP_->addVariable( errorNodesPMv_,
"|p-p_h|",
"Scalar", dofsP_, domainP1_->getMapUnique() );
914 exporterSolP_->save( (
double) currentIter_);
919 exporterSol_->reSetup(mesh);
920 exporterSol_->updateVariables(exportSolutionMv,
"u_h");
921 exporterSol_->updateVariables( exactSolutionMv,
"u" );
922 exporterSol_->updateVariables(errorValues,
"|u-u_h|");
924 if( calculatePressure_ ){
925 exporterSolP_->reSetup(domainP1_->getMesh());
926 exporterSolP_->updateVariables( exportSolutionPMv,
"p_h");
927 if(exactSolPInput_ ){
928 exporterSolP_->updateVariables( exactSolutionPMv,
"p");
929 exporterSolP_->updateVariables( errorNodesPMv_,
"|p-p_h|");
932 exporterSolP_->save( (
double) currentIter_);
936 exporterSol_->save( (
double) currentIter_);
982 vec_GO_Type globalProcs(0);
983 for (
int i=0; i<= maxRank_; i++)
984 globalProcs.push_back(i);
986 Teuchos::ArrayView<GO> globalProcArray = Teuchos::arrayViewFromVector( globalProcs);
988 vec_GO_Type localProc(0);
989 localProc.push_back(comm_->getRank());
990 Teuchos::ArrayView<GO> localProcArray = Teuchos::arrayViewFromVector( localProc);
992 MapPtr_Type mapGlobalProc =
993 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), globalProcArray, 0, comm_) );
996 MapPtr_Type mapProc =
997 Teuchos::rcp(
new Map_Type( Teuchos::OrdinalTraits<GO>::invalid(), localProcArray, 0, comm_) );
999 MultiVectorPtr_Type exportLocalEntry = Teuchos::rcp(
new MultiVector_Type( mapProc, 1 ) );
1001 exportLocalEntry->putScalar( (LO) numElementsProc[currentIter_] );
1003 MultiVectorPtr_Type elementList= Teuchos::rcp(
new MultiVector_Type( mapGlobalProc, 1 ) );
1004 elementList->putScalar( 0 );
1005 elementList->importFromVector( exportLocalEntry,
true,
"Insert");
1007 Teuchos::ArrayRCP<const double > elementProcList = elementList->getData(0);
1009 double maxNumElementsOnProcs = numElementsProc[currentIter_];
1010 reduceAll<int, double> (*comm_, REDUCE_MAX, maxNumElementsOnProcs, outArg (maxNumElementsOnProcs));
1012 double minNumElementsOnProcs = numElementsProc[currentIter_];
1013 reduceAll<int, double> (*comm_, REDUCE_MIN, minNumElementsOnProcs, outArg (minNumElementsOnProcs));
1016 if(comm_->getRank() == 0 && writeRefinementInfo_ ==
true){
1017 cout <<
"__________________________________________________________________________________________________________ " << endl;
1018 cout <<
" " << endl;
1019 cout <<
" Summary of Mesh Refinement" << endl;
1020 cout <<
"__________________________________________________________________________________________________________ " << endl;
1021 cout <<
" " << endl;
1022 cout <<
" Marking Strategy:\t" << markingStrategy_ << endl;
1023 cout <<
" Theta:\t\t\t" << theta_ << endl;
1024 cout <<
"__________________________________________________________________________________________________________ " << endl;
1025 cout <<
" " << endl;
1026 cout <<
" Tolerance:\t\t\t" << tol_ << endl;
1027 cout <<
" Max number of Iterations:\t" << maxIter_ << endl;
1028 cout <<
" Number of Processors:\t\t\t" << maxRank_ +1 << endl;
1029 cout <<
" Number of Refinements:\t\t" << currentIter_ << endl;
1030 cout <<
"__________________________________________________________________________________________________________ " << endl;
1031 cout <<
" " << endl;
1032 cout <<
" Refinementlevel|| Elements\t|| Nodes\t|| Max. estimated error " << endl;
1033 cout <<
"__________________________________________________________________________________________________________ " << endl;
1034 for(
int i=0; i<= currentIter_; i++)
1035 cout <<
" "<< i <<
"\t\t|| " << numElements[i] <<
"\t\t|| " << numNodes[i]<<
"\t\t|| " << maxErrorEl[i]<< endl;
1036 cout <<
"__________________________________________________________________________________________________________ " << endl;
1037 cout <<
" " << endl;
1038 if(exactSolInput_ ==
true){
1039 cout <<
" Maximal error in nodes after Refinement. " << endl;
1040 for (
int i=1; i<=currentIter_ ; i++)
1041 cout <<
" "<< i <<
":\t" << maxErrorKn[i] << endl;
1042 cout <<
"__________________________________________________________________________________________________________ " << endl;
1043 cout <<
" || u-u_h ||_H1\t||\t|| u-u_h ||_L2 ||" ;
1044 if( calculatePressure_==
true && exactSolPInput_ ==
true ){
1045 cout <<
" \t|| p-p_h||_L2 " << endl;
1049 cout <<
"__________________________________________________________________________________________________________ " << endl;
1050 for (
int i=1; i<=currentIter_ ; i++){
1051 std::cout <<
" "<< i <<
":\t"<< std::setprecision(5) << std::fixed << errorH1[i]<<
"\t\t||\t" << errorL2[i] ;
1052 if( calculatePressure_==
true && exactSolPInput_ ==
true ){
1053 std::cout <<
" \t \t||\t" << std::setprecision(5) << std::fixed << errorL2P[i] << std::endl;
1059 cout <<
"__________________________________________________________________________________________________________ " << endl;
1061 cout <<
" ||u-u_h||_H1 / ||u ||_H1 \t|| eta / ||u_h ||_H1\t" << endl;
1062 cout <<
"__________________________________________________________________________________________________________ " << endl;
1063 for (
int i=1; i<=currentIter_ ; i++){
1064 cout <<
" "<< i <<
":\t" << relError[i] <<
" \t\t||\t" << eRelError[i] << endl;
1066 cout <<
"__________________________________________________________________________________________________________ " << endl;
1067 cout <<
" " << endl;
1068 cout <<
"Distribution of elements on .. " << endl;
1070 cout <<
" Max Number of Elements on Processors " << std::setprecision(0) << std::fixed << maxNumElementsOnProcs << endl;
1071 cout <<
" Min Number of Elements on Processors " << minNumElementsOnProcs << endl;
1072 cout <<
"__________________________________________________________________________________________________________ " << endl;
1073 cout <<
"__________________________________________________________________________________________________________ " << endl;
1074 cout <<
" " << endl;
1075 cout <<
"__________________________________________________________________________________________________________ " << endl;
1076 cout <<
"__________________________________________________________________________________________________________ " << endl;
1077 cout <<
" " << endl;