Operator for linear form, usually to calculate values on right hand side.
714 {
716 if (row_type != MBTRI && row_type != MBQUAD)
718
719
720
722
727
728 if (SEpEp) {
729
731 auto &col_name, auto row_side, auto col_side,
732 auto row_type, auto col_type) {
733 return add_bmc.get<0>().find(boost::make_tuple(
734 row_name, col_name, row_type, col_type, row_side, col_side));
735 };
736
738 auto &col_name, auto row_side, auto col_side,
739 auto row_type,
auto col_type,
const auto &
m,
740 const auto &row_ind, const auto &col_ind) {
741 auto it = find_block(add_bmc, row_name, col_name, row_side, col_side,
742 row_type, col_type);
743 if (it != add_bmc.get<0>().end()) {
745 it->setInd(row_ind, col_ind);
746 it->setSetAtElement();
747 return it;
748 } else {
749 auto p_it = add_bmc.insert(
BlockMatData(row_name, col_name, row_type,
750 col_type, row_side, col_side,
751 m, row_ind, col_ind));
752 return p_it.first;
753 }
754 };
755
757 auto &col_name, auto row_side, auto col_side,
758 auto row_type,
auto col_type,
const auto &
m,
759 const auto &row_ind, const auto &col_ind) {
760 auto it = find_block(add_bmc, row_name, col_name, row_side, col_side,
761 row_type, col_type);
762 if (it != add_bmc.get<0>().end()) {
764 it->setInd(row_ind, col_ind);
765 it->setSetAtElement();
766 return it;
767 } else {
768 auto p_it = add_bmc.insert(
BlockMatData(row_name, col_name, row_type,
769 col_type, row_side, col_side,
770 m, row_ind, col_ind));
771 return p_it.first;
772 }
773 };
774
775 auto assemble_block = [&](
auto &
bit, Mat S) {
780
782 &*cind.begin(), &*
m.data().begin(), ADD_VALUES);
783
785 };
786
789 std::string field, AO ao) {
791 for (
auto &
bit : add_bmc) {
792 bit.unSetAtElement();
794 }
795
796 for (
auto &
bit : bmc) {
797 if (
bit.setAtElement &&
bit.rowField != field &&
798 bit.colField != field) {
802
803
804
805
806
807
808
809 if (ao) {
810 CHKERR AOApplicationToPetsc(ao, rind.size(), &*rind.begin());
811 CHKERR AOApplicationToPetsc(ao, cind.size(), &*cind.begin());
812 }
813 auto it =
814 set_block(add_bmc,
bit.rowField,
bit.colField,
bit.rowSide,
815 bit.colSide,
bit.rowType,
bit.colType,
m, rind, cind);
816 }
817 }
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
849 };
850
852 bool debug =
false) {
854 for (
auto &
bit : add_bmc) {
855 if (
bit.setAtElement)
857 }
859 for (
auto &
bit : add_bmc) {
860 if (
bit.setAtElement) {
861 std::cerr <<
"assemble: " <<
bit.rowField <<
" " <<
bit.colField
862 << endl;
863
864 }
865 }
866 std::cerr << std::endl;
867 }
869 };
870
873 const std::string field,
877
878 for (
auto &
bit : add_bmc) {
879 bit.unSetAtElement();
881 }
882
883 for (
auto &
bit : bmc) {
884 if (
bit.setAtElement) {
885 if (
bit.rowField != field ||
bit.colField != field)
886 auto it = set_block(add_bmc,
bit.rowField,
bit.colField,
889 }
890 }
891
893 bmc.get<1>().find(boost::make_tuple(field, field, row_type, row_type));
894 if (
bit->setAtElement &&
bit != bmc.get<1>().end()) {
895 auto it = set_block(add_bmc,
bit->rowField,
bit->colField,
896 bit->rowSide,
bit->colSide,
bit->rowType,
900 } else {
901 auto row_it = bmc.get<3>().lower_bound(field);
902 for (; row_it != bmc.get<3>().upper_bound(field); ++row_it) {
903 if (row_it->setAtElement) {
904 auto it = set_block(add_bmc, field, field, 0, 0, row_type, row_type,
905 diag_mat, row_it->rowInd, row_it->rowInd);
908 break;
909 }
910 }
911 if (row_it == bmc.get<3>().end())
913 "row field not found %s", field.c_str());
914 }
915
917 };
918
919 const bool debug =
false;
922
923 if (SEpEp) {
924 CHKERR create_block_schur_bc(mat_cont,
blockMat[
"BC"],
"EP", aoSEpEp);
925
926
927
928
929
930
931
932
933
935
936 if (STauTau) {
938 "TAU", aoSTauTau);
940 }
941 }
942
944 }
945 }
946
948}
#define MoFEMFunctionReturnHot(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define MoFEMFunctionBegin
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
@ MOFEM_OPERATION_UNSUCCESSFUL
#define MoFEMFunctionReturn(a)
Last executable line of each PETSc function used for error handling. Replaces return()
#define CHKERR
Inline error check.
#define MoFEMFunctionBeginHot
First executable line of each MoFEM function, used for error handling. Final line of MoFEM functions ...
FTensor::Index< 'm', SPACE_DIM > m
UBlasVector< int > VectorInt
MoFEMErrorCode MatSetValues(Mat M, const EntitiesFieldData::EntData &row_data, const EntitiesFieldData::EntData &col_data, const double *ptr, InsertMode iora)
Assemble PETSc matrix.
multi_index_container< BlockMatData, indexed_by< ordered_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField >, member< BlockMatData, EntityType, &BlockMatData::rowType >, member< BlockMatData, EntityType, &BlockMatData::colType >, member< BlockMatData, int, &BlockMatData::rowSide >, member< BlockMatData, int, &BlockMatData::colSide > > >, ordered_non_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField >, member< BlockMatData, EntityType, &BlockMatData::rowType >, member< BlockMatData, EntityType, &BlockMatData::colType > > >, ordered_non_unique< composite_key< BlockMatData, member< BlockMatData, std::string, &BlockMatData::rowField >, member< BlockMatData, std::string, &BlockMatData::colField > > >, ordered_non_unique< member< BlockMatData, std::string, &BlockMatData::rowField > >, ordered_non_unique< member< BlockMatData, std::string, &BlockMatData::colField > > > > BlockMatContainer