Skip to content
Snippets Groups Projects
state.cc 2.15 KiB
Newer Older
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "state.hh"
#include "state/ageinglawstateupdater.cc"
#include "state/sliplawstateupdater.cc"

podlesny's avatar
.  
podlesny committed
template <class ScalarVector, class Vector, class ContactCoupling, class FrictionCouplingPair>
podlesny's avatar
.  
podlesny committed
auto initStateUpdater(
        Config::stateModel model,
        const std::vector<ScalarVector>& alpha_initial,
podlesny's avatar
.  
podlesny committed
        const std::vector<std::shared_ptr<ContactCoupling>>& contactCouplings, // contains nonmortarBoundary
        const std::vector<std::shared_ptr<FrictionCouplingPair>>& couplings) // contains frictionInfo
podlesny's avatar
.  
podlesny committed
-> std::shared_ptr<StateUpdater<ScalarVector, Vector>> {

podlesny's avatar
.  
podlesny committed
  assert(contactCouplings.size() == couplings.size());

  std::vector<size_t> leafVertexCounts(alpha_initial.size(), 0);
  for (size_t i=0; i<leafVertexCounts.size(); i++) {
    leafVertexCounts[i] = alpha_initial[i].size();
  }

  auto stateUpdater = std::make_shared<StateUpdater<ScalarVector, Vector>>(leafVertexCounts);
podlesny's avatar
.  
podlesny committed

  switch (model) {
    case Config::AgeingLaw:
podlesny's avatar
.  
podlesny committed
      for (size_t i=0; i<couplings.size(); i++) {
        const auto& coupling = couplings[i];
        const auto nonmortarIdx = coupling->gridIdx_[0];

        auto localUpdater =  std::make_shared<AgeingLawStateUpdater<ScalarVector, Vector>>(
                    alpha_initial[nonmortarIdx], *contactCouplings[i]->nonmortarBoundary().getVertices(), coupling->frictionData().L(), coupling->frictionData().V0());
podlesny's avatar
.  
podlesny committed
        localUpdater->setBodyIndex(nonmortarIdx);
podlesny's avatar
.  
podlesny committed

        stateUpdater->addLocalUpdater(localUpdater);
      }
podlesny's avatar
.  
podlesny committed
      break;
    case Config::SlipLaw:
podlesny's avatar
.  
podlesny committed
      for (size_t i=0; i<couplings.size(); i++) {
        const auto& coupling = couplings[i];
        const auto nonmortarIdx = coupling->gridIdx_[0];

        auto localUpdater =  std::make_shared<SlipLawStateUpdater<ScalarVector, Vector>>(
                  alpha_initial[nonmortarIdx], *contactCouplings[i]->nonmortarBoundary().getVertices(), coupling->frictionData().L(), coupling->frictionData().V0());
podlesny's avatar
.  
podlesny committed
        localUpdater->setBodyIndex(nonmortarIdx);
podlesny's avatar
.  
podlesny committed

        stateUpdater->addLocalUpdater(localUpdater);
      }
podlesny's avatar
.  
podlesny committed
      break;
    default:
      assert(false);
podlesny's avatar
.  
podlesny committed
      break;
    }
podlesny's avatar
.  
podlesny committed

    return stateUpdater;
}

#include "state_tmpl.cc"