def run( self , props , globdat ):
    globdat.cycle += 1
    globdat.lam = 1.0 * globdat.cycle
    dofCount = len(globdat.dofs)

    a_0   = np.copy(globdat.state)  # minh
    a     = globdat.state
    Da    = globdat.Dstate
    fhat  = globdat.fhat

    Da[:] = zeros( dofCount )
    fint  = zeros( dofCount ) 
    fext  = globdat.lam * fhat

    print '================================='
    print ' Load step %i' % globdat.cycle
    print '================================='
    print '  NR iter : L2-norm residual'
     
    globdat.iiter = 0
    K, fint = assembleTangentStiffness( props, globdat )
    error = 1.

    while error > self.tol:
      globdat.iiter += 1
      da = globdat.dofs.solve(K, fext - fint)
      Da[:] += da[:]
      a [:] += da[:]
      K, fint = assembleTangentStiffness( props, globdat )
      # note that the code is different from the one presented in the book, which
      # is slightly shorter for the sake of clarity.
      # In the case of a prescribed displacement, the external force is zero
      # and hence its norm is zero. In that case, the norm of the residue is not
      # divided by the norm of the external force.

      # norm = globdat.dofs.norm(fext)  # minh commented
      Du_norm_tuso = np.linalg.norm(da)  # minh
      Du_norm_mauso = np.linalg.norm(a - a_0)  # minh
      error = Du_norm_tuso / Du_norm_mauso  # minh

      # minh commented this block of code
      # if norm < 1.0e-16:
      #   error = globdat.dofs.norm(fext - fint)
      # else:
      #   error = globdat.dofs.norm(fext - fint) / norm

      print '  Iter', globdat.iiter, ':', error
      if globdat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')
    # Converged
    globdat.elements.commitHistory()
    # print("------------- DU ---------------")
    # print(Da)
    Da[:]  = zeros( len(globdat.dofs) )
    globdat.fint = fint
    if globdat.cycle == self.maxCycle or globdat.lam > self.maxLam:
      globdat.active = False 
예제 #2
0
    def run(self, props, globdat):

        globdat.cycle += 1

        dofCount = len(globdat.dofs)

        a = globdat.state
        Da = globdat.Dstate

        Da[:] = zeros(dofCount)
        fint = zeros(dofCount)
        fext = zeros(dofCount)

        print('=================================')
        print(' Load step %i' % globdat.cycle)
        print('=================================')
        print('  NR iter : L2-norm residual')

        #fext = fext + Dfext

        globdat.iiter = 0

        K = assembleTangentStiffness(props, globdat)

        error = 1.

        while error > self.tol:

            globdat.iiter += 1

            da = globdat.dofs.solve(K, fext - fint)

            Da[:] += da[:]
            a[:] += da[:]

            fint = assembleInternalForce(props, globdat)
            K = assembleTangentStiffness(props, globdat)

            error = globdat.dofs.norm(fext - fint)

            print('  Iter', globdat.iiter, ':', error)

            if globdat.iiter == self.iterMax:
                raise RuntimeError(
                    'Newton-Raphson iterations did not converge!')

        # Converged

        elements.commitHistory()

        if globdat.cycle == 10:
            globdat.active = False
예제 #3
0
 def run(self, props, global_data):
     global_data.cycle += 1
     K, fint = assembleTangentStiffness(props, global_data)
     global_data.state = global_data.dofs.solve(K, global_data.fhat)
     global_data.fint = assembleInternalForce(props, global_data)
     global_data.elements.commitHistory()
     global_data.active = False
예제 #4
0
  def run( self , props , globdat ):
      
    K0,fint  = assembleTangentStiffness( props, globdat )

    globdat.state = globdat.dofs.solve( K0 , globdat.fhat )
         
    K,fint  = assembleTangentStiffness( props, globdat )

    eigenvals , eigenvecs = globdat.dofs.eigensolve( K0 , (K0-K) )

    globdat.state = eigenvecs
  
    globdat.elements.commitHistory()

    globdat.active = False 

    self.printResults( eigenvals )
예제 #5
0
  def run( self , props , globdat ):

    globdat.cycle = 1
    
    K,fint  = assembleTangentStiffness( props, globdat )
    M,Mlump = assembleMass( props , globdat )
          
    globdat.vecs , globdat.vals = globdat.dofs.eigensolve( K, M )

    globdat.active = False 
예제 #6
0
  def run( self , props , globdat ):

    globdat.cycle += 1
      
    K,fint = assembleTangentStiffness( props, globdat )
         
    globdat.state = globdat.dofs.solve( K, globdat.fhat )

    globdat.fint = assembleInternalForce( props, globdat )
    
    globdat.elements.commitHistory()

    globdat.active = False 
예제 #7
0
    def run(self, props, globdat):

        K, fint = assembleTangentStiffness(props, globdat)

        M, mlump = assembleMassMatrix(props, globdat)

        eigenvals, eigenvecs = globdat.dofs.eigensolve(K, M, self.eigenCount)

        globdat.state = eigenvecs

        globdat.elements.commitHistory()

        globdat.active = False

        self.printResults(eigenvals)
예제 #8
0
    def run(self, props, globdat):

        globdat.cycle += 1

        K, fint = assembleTangentStiffness(props, globdat)

        state0 = globdat.state

        globdat.state = globdat.dofs.solve(K, globdat.fhat)

        globdat.Dstate = globdat.state - state0

        globdat.fint = assembleInternalForce(props, globdat)

        commit(props, globdat)

        globdat.elements.commitHistory()

        globdat.active = False
예제 #9
0
    def run(self, props, globdat):

        globdat.solverStatus.increaseStep()

        K, fint = assembleTangentStiffness(props, globdat)
        fext = assembleExternalForce(props, globdat)

        state0 = globdat.state

        globdat.state = globdat.dofs.solve(K, fext)

        globdat.Dstate = globdat.state - state0

        globdat.fint = assembleInternalForce(props, globdat)

        commit(props, globdat)

        globdat.elements.commitHistory()

        globdat.active = False
예제 #10
0
  def run( self , props , globdat ):

    globdat.cycle += 1

    globdat.lam = 1.0 * globdat.cycle
    
    dofCount = len(globdat.dofs)

    a     = globdat.state
    Da    = globdat.Dstate
    fhat  = globdat.fhat

    Da[:] = zeros( dofCount )
    fint  = zeros( dofCount ) 
    fext  = globdat.lam*fhat

    print '================================='
    print ' Load step %i' % globdat.cycle
    print '================================='
    print '  NR iter : L2-norm residual'
     
    globdat.iiter = 0 

    K,fint = assembleTangentStiffness( props, globdat )
    
    error = 1.
    
    while error > self.tol:

      globdat.iiter += 1
	      
      da = globdat.dofs.solve( K, fext-fint )

      Da[:] += da[:]
      a [:] += da[:]

      K,fint = assembleTangentStiffness( props, globdat )
  
      # note that the code is different from the one presented in the book, which
      # is slightly shorter for the sake of clarity.
      # In the case of a prescribed displacement, the external force is zero
      # and hence its norm is zero. In that case, the norm of the residue is not
      # divided by the norm of the external force.
  
      norm = globdat.dofs.norm( fext )
  
      if norm < 1.0e-16:
        error = globdat.dofs.norm( fext-fint )
      else:
        error = globdat.dofs.norm( fext-fint ) / norm

      print '  Iter', globdat.iiter, ':', error

      if globdat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # Converged
    
    globdat.elements.commitHistory()

    Da[:]  = zeros( len(globdat.dofs) )

    globdat.fint = fint
    
    if globdat.cycle == self.maxCycle or globdat.lam > self.maxLam:
      globdat.active = False 
예제 #11
0
    def run(self, props, globdat):

        globdat.cycle += 1

        a = globdat.state
        Da = globdat.Dstate
        fhat = globdat.fhat

        self.printHeader(globdat.cycle)

        error = 1.
        globdat.iiter = 0
        lam0 = globdat.lam

        K, fint = assembleTangentStiffness(props, globdat)

        while error > self.tol:

            if self.method == 'force-controlled':
                da = globdat.dofs.solve(K, globdat.lam * fhat - fint)

            elif self.method == 'nrg-controlled':
                h = 0.5 * lam0 * fhat
                w = -0.5 * dot((a - Da), fhat)
                g = 0.5 * dot((lam0 * Da - self.Dlam *
                               (a[:] - Da[:])), fhat) - globdat.dtau

                d1 = globdat.dofs.solve(K, globdat.lam * fhat - fint)
                d2 = globdat.dofs.solve(K, -1.0 * fhat)

                denom = dot(h, d2) - w

                da = d1 - (d2 * (dot(h, d1) + g)) / denom
                dlam = -g - (dot(-1.0 * h, d1) - g * (1.0 + denom)) / denom

                self.Dlam += dlam
                globdat.lam += dlam

            else:
                raise RuntimeError('Method not known')

            # Update displacements

            Da[:] += da[:]
            a[:] += da[:]

            # Solve for new displacement vector, load factor

            K, fint = assembleTangentStiffness(props, globdat)

            # Check convergence

            error = globdat.dofs.norm(globdat.lam * fhat -
                                      fint) / globdat.dofs.norm(
                                          globdat.lam * fhat)

            # Increment the Newton-Raphson iteration counter
            # and print error

            globdat.iiter += 1

            self.printIteration(globdat.iiter, error)

        # If converged, calculate the amount of energy that has been dissipated in the \
        # previous step.

        dissnrg = 0.5 * dot(
            (lam0 * Da - (globdat.lam - lam0) * (a - Da)), fhat)

        self.printConverged(globdat.iiter, dissnrg)

        Da[:] = zeros(len(globdat.dofs))

        if self.method == 'force-controlled':
            if dissnrg > self.switchEnergy:
                print '   Switch to nrg diss. arc-length'
                self.method = 'nrg-controlled'
                globdat.dtau = 0.25 * self.switchEnergy
            else:
                globdat.lam += self.Dlam
        else:
            self.Dlam = 0.
            globdat.dtau *= pow(0.5, 0.25 * (globdat.iiter - self.optiter))
            if globdat.dtau > self.maxdTau:
                globdat.dtau = self.maxdTau

        globdat.elements.commitHistory()

        globdat.fint = fint

        if globdat.lam > self.maxLam or globdat.cycle > self.maxCycle:
            globdat.active = False
예제 #12
0
    # Step 2:                                   #
    # Compute the new external force vector     #
    #############################################

    fext = fext + Dfext

    #Initialize Newton-Raphson iteration parameters
    error = 1.
    iiter = 0

    #############################################
    # Step 3:                                   #
    # Compute the tangent stiffness matrix      #
    #############################################

    K, fint = assembleTangentStiffness(props, globdat)

    while error > tol:

        ###############################################
        # Step 4+5:                                   #
        # Solve for da (while satisfying constraints) #
        ###############################################

        da = dofs.solve(K, fext - fint)

        ###############################################
        # Step 6:                                     #
        # Update Delta a                              #
        ###############################################
예제 #13
0
    def run(self, props, globdat):

        stat = globdat.solverStatus

        stat.increaseStep()

        a = globdat.state
        Da = globdat.Dstate
        fhat = globdat.fhat

        self.printHeader(stat.cycle)

        # Initialize Newton-Raphson iteration parameters

        error = 1.

        # Predictor

        if stat.cycle == 1:
            K, fint = assembleTangentStiffness(props, globdat)
            Da1 = globdat.dofs.solve(K, globdat.lam * fhat)
            Dlam1 = globdat.lam
        else:
            #      Da1    = self.factor * self.Daprev
            #      Dlam1  = self.factor * self.Dlamprev

            Da1 = globdat.factor * globdat.Daprev
            Dlam1 = globdat.factor * globdat.Dlamprev
            globdat.lam += Dlam1

        a[:] += Da1[:]
        Da[:] = Da1[:]

        Dlam = Dlam1

        K, fint = assembleTangentStiffness(props, globdat)

        res = globdat.lam * fhat - fint

        while error > self.tol:

            stat.iiter += 1

            d1 = globdat.dofs.solve(K, fhat)
            d2 = globdat.dofs.solve(K, res)

            ddlam = -dot(Da1, d2) / dot(Da1, d1)
            dda = ddlam * d1 + d2

            Dlam += ddlam
            globdat.lam += ddlam

            Da[:] += dda[:]
            a[:] += dda[:]

            K, fint = assembleTangentStiffness(props, globdat)

            res = globdat.lam * fhat - fint

            error = globdat.dofs.norm(res) / globdat.dofs.norm(
                globdat.lam * fhat)

            self.printIteration(stat.iiter, error)

            if stat.iiter == self.iterMax:
                raise RuntimeError(
                    'Newton-Raphson iterations did not converge!')

        # Converged

        self.printConverged(stat.iiter)

        globdat.elements.commitHistory()

        globdat.fint = fint

        if not self.fixedStep:
            globdat.factor = pow(0.5, 0.25 * (stat.iiter - self.optiter))
            globdat.totalFactor *= globdat.factor

        if globdat.totalFactor > self.maxFactor:
            globdat.factor = 1.0

        globdat.Daprev[:] = Da[:]
        globdat.Dlamprev = Dlam

        if globdat.lam > self.maxLam or stat.cycle > 1000 or a[
                globdat.dofs.getForType(4, 'v')] > 5:
            globdat.active = False
예제 #14
0
  def run( self , props , globdat ):

    globdat.cycle += 1
   
    a    = globdat.state
    Da   = globdat.Dstate
    fhat = globdat.fhat
 
    self.printHeader( globdat.cycle )
      
    # Initialize Newton-Raphson iteration parameters  

    error = 1.
    globdat.iiter = 0

    # Predictor

    if globdat.cycle == 1:    
      K,fint = assembleTangentStiffness( props, globdat )      
      Da1    = globdat.dofs.solve( K , globdat.lam*fhat )
      Dlam1  = globdat.lam
    else:
      Da1    = self.factor * self.Daprev
      Dlam1  = self.factor * self.Dlamprev
      globdat.lam += Dlam1
  
    a [:] += Da1[:]
    Da[:] =  Da1[:]

    Dlam = Dlam1

    K,fint = assembleTangentStiffness( props, globdat )  

    res = globdat.lam*fhat-fint  

    while error > self.tol:

      globdat.iiter += 1

      d1 = globdat.dofs.solve( K , fhat )
      d2 = globdat.dofs.solve( K , res )
 
      ddlam = -dot(Da1,d2)/dot(Da1,d1)
      dda   = ddlam*d1 + d2
       
      Dlam        += ddlam
      globdat.lam += ddlam

      Da[:] += dda[:]
      a [:] += dda[:]

      K,fint = assembleTangentStiffness( props, globdat )

      res = globdat.lam*fhat-fint
 
      error  = globdat.dofs.norm( res ) / globdat.dofs.norm( globdat.lam*fhat )

      self.printIteration( globdat.iiter,error)

      if globdat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # Converged

    self.printConverged( globdat.iiter )
    
    globdat.elements.commitHistory()

    globdat.fint = fint

    if not self.fixedStep:
      self.factor = pow(0.5,0.25*(globdat.iiter-self.optiter))
      self.totalFactor *= self.factor

    if self.totalFactor > self.maxFactor:
      self.factor = 1.0

    self.Daprev[:] = Da[:]
    self.Dlamprev  = Dlam

    if globdat.lam > self.maxLam or globdat.cycle > 1000 or a[globdat.dofs.getForType(4,'v')] > 5:
      globdat.active=False
예제 #15
0
  # Step 2:                                   #
  # Compute the new external force vector     #
  #############################################

  fext = fext + Dfext
  
  #Initialize Newton-Raphson iteration parameters  
  error = 1.
  iiter = 0

  #############################################
  # Step 3:                                   #
  # Compute the tangent stiffness matrix      #
  #############################################

  K,fint = assembleTangentStiffness( props, globdat )

  while error > tol:
    
    ###############################################  
    # Step 4+5:                                   #  
    # Solve for da (while satisfying constraints) #
    ###############################################

    da = dofs.solve( K, fext-fint )
    
    ###############################################
    # Step 6:                                     #
    # Update Delta a                              #
    ###############################################
예제 #16
0
  def run( self , props , globdat ):

    globdat.cycle += 1
   
    a    = globdat.state
    Da   = globdat.Dstate
    fhat = globdat.fhat
 
    self.printHeader( globdat.cycle )
      
    error         = 1.
    globdat.iiter = 0
    lam0          = globdat.lam

    K,fint = assembleTangentStiffness( props, globdat )  

    while error > self.tol:

      if self.method == 'force-controlled':
        da = globdat.dofs.solve( K, globdat.lam*fhat-fint )

      elif self.method == 'nrg-controlled':
        h  =  0.5 * lam0 * fhat
        w  = -0.5 * dot ( (a-Da) , fhat )
        g  =  0.5 * dot ( ( lam0 * Da - self.Dlam * ( a[:] - Da[:] ) ) , fhat ) - globdat.dtau
  
        d1 = globdat.dofs.solve( K , globdat.lam*fhat - fint )
        d2 = globdat.dofs.solve( K , -1.0*fhat )

        denom  = dot ( h , d2 ) - w

        da     = d1 - ( d2 * ( dot( h , d1 ) + g ) ) / denom
        dlam   = -g - ( dot( -1.0*h , d1 ) - g * ( 1.0 + denom ) ) / denom;
 
        self.Dlam   += dlam
        globdat.lam += dlam
     
      else:
        raise RuntimeError('Method not known')
   
      # Update displacements

      Da[:] += da[:]
      a [:] += da[:]

      # Solve for new displacement vector, load factor      
  
      K,fint = assembleTangentStiffness( props, globdat )
    
      # Check convergence

      error  = globdat.dofs.norm( globdat.lam*fhat-fint ) / globdat.dofs.norm( globdat.lam*fhat )

      # Increment the Newton-Raphson iteration counter
      # and print error

      globdat.iiter += 1

      self.printIteration( globdat.iiter , error )

    # If converged, calculate the amount of energy that has been dissipated in the \
    # previous step.

    dissnrg = 0.5 * dot( ( lam0 * Da - (globdat.lam-lam0) * ( a - Da ) ),fhat )

    self.printConverged( globdat.iiter , dissnrg )

    Da[:]  = zeros( len(globdat.dofs) )
  
    if self.method == 'force-controlled':
      if dissnrg > self.switchEnergy:
        print '   Switch to nrg diss. arc-length'
        self.method       = 'nrg-controlled'
        globdat.dtau = 0.25*self.switchEnergy
      else:
        globdat.lam += self.Dlam
    else:
      self.Dlam = 0.
      globdat.dtau *= pow(0.5,0.25*(globdat.iiter-self.optiter))
      if globdat.dtau > self.maxdTau:
        globdat.dtau = self.maxdTau
    
    globdat.elements.commitHistory()

    globdat.fint = fint

    if globdat.lam > self.maxLam or globdat.cycle > self.maxCycle:
      globdat.active=False
예제 #17
0
  def run( self , props , globdat ):

    stat = globdat.solverStatus
    
    stat.increaseStep()
    
    dofCount = len(globdat.dofs)
    
    a     = globdat.state
    Da    = globdat.Dstate

    Da[:] = zeros( dofCount )
    fint  = zeros( dofCount ) 
    
    logger.info("Nonlinear solver ............")
    logger.info("    =============================================")
    logger.info("    Load step %i"%globdat.solverStatus.cycle)
    logger.info("    =============================================")
    logger.info('    Newton-Raphson   : L2-norm residual')
    
    self.setLoadAndConstraints( globdat )
    
    K,fint = assembleTangentStiffness( props, globdat )

    error = 1.

    self.setLoadAndConstraints( globdat )
    
    fext   = assembleExternalForce   ( props, globdat )
        
    while error > self.tol:

      stat.iiter += 1
	      
      da = globdat.dofs.solve( K, fext - fint )

      Da[:] += da[:]
      a [:] += da[:]

      K,fint = assembleTangentStiffness( props, globdat )
  
      # note that the code is different from the one presented in the book, which
      # is slightly shorter for the sake of clarity.
      # In the case of a prescribed displacement, the external force is zero
      # and hence its norm is zero. In that case, the norm of the residue is not
      # divided by the norm of the external force.

      norm = globdat.dofs.norm( fext )
  
      if norm < 1.0e-16:
        error = globdat.dofs.norm( fext-fint )
      else:
        error = globdat.dofs.norm( fext-fint ) / norm

      logger.info('    Iteration %4i   : %6.4e'%(stat.iiter,error) )

      globdat.dofs.setConstrainFactor( 0.0 )

      if stat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # Converged
    
    globdat.elements.commitHistory()

    Da[:]  = zeros( len(globdat.dofs) )

    globdat.fint = fint
    
    if stat.cycle == self.maxCycle or globdat.lam > self.maxLam:
      globdat.active = False 
예제 #18
0
  def run( self , props , globdat ):

    globdat.cycle += 1
    
    dofCount = len(globdat.dofs)

    a  = globdat.state
    Da = globdat.Dstate

    Da[:] = zeros( dofCount )
    fint  = zeros( dofCount ) 
    fext  = zeros( dofCount ) 

    print '================================='
    print ' Load step %i' % globdat.cycle
    print '================================='
    print '  NR iter : L2-norm residual'
     
    #fext = fext + Dfext
  
    globdat.iiter = 0 

    K = assembleTangentStiffness( props, globdat )
    
    error = 1.
    
    while error > self.tol:

      globdat.iiter += 1
	      
      da = globdat.dofs.solve( K, fext-fint )

      Da[:] += da[:]
      a [:] += da[:]

      fint = assembleInternalForce   ( props, globdat )
      K    = assembleTangentStiffness( props, globdat )
    
      error = globdat.dofs.norm( fext-fint )               
    
      print '  Iter', globdat.iiter, ':', error

      if globdat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # Converged
    
    elements.commitHistory()

    if globdat.cycle == 10:
      globdat.active = False 







      # Solve for new displacement vector, load factor      

      if self.method == 'force-controlled':
        da = dofs.solve( K, lam*fhat-fint )
   
      elif self.method == 'nrg':
        h  =  0.5 * lam0 * fhat
        w  = -0.5 * dot ( (a-Da) , fhat )
        g  =  0.5 * dot ( ( lam0 * Da - Dlam * ( a[:] - Da[:] ) ) , fhat ) - dtau
  
        d1 = dofs.solve( K , lam*fhat - fint )
        d2 = dofs.solve( K , -1.0*fhat )

        denom  = dot ( h , d2 ) - w

        da     = d1 - ( d2 * ( dot( h , d1 ) + g ) ) / denom
        dlam   = -g - ( dot( -1.0*h , d1 ) - g * ( 1.0 + denom ) ) / denom;
 
        Dlam   += dlam
        lam    += dlam
      else:
        raise RuntimeError('Method not known')
   
      # Update displacements

      Da[:] += da[:]
      a [:] += da[:]

      # Solve for new displacement vector, load factor      
  
      K    = assembleTangentStiffness( props, globdat )
      fint = assembleInternalForce( props, globdat )
    
      # Check convergence

      error  = globdat.dofs.norm( lam*fhat-fint ) / globdat.dofs.norm( lam*fhat )

      # Increment the Newton-Raphson iteration counter
      # and print error

      globdat.iiter += 1

      print '   Iter %5i  : %4.2e ' %(iiter,error)

      if globdat.iiter == iterMax:
        plotCurve( output )  
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # If converged, calculate the amount of energy that has been dissipated in the \
    # previous step.

    print '---------------------------------'
    print '   C O N V E R G E D'
  
    if method == 'force-controlled':
      print '   Diss. nrg   : %1.3e ' %dissnrg

    Da[:]  = zeros( len(dofs) )
    lam0 = lam
  
    if method == 'force-controlled':
      if dissnrg > switchnrg:
        print '   Switch to nrg diss. arc-length'
        self.method = 'nrg'
        Dlam   = 0.;
        dtau   = 0.25*switchnrg
      else:
        lam   += Dlam
    else:
      Dlam = 0.;
      dtau *= pow(0.5,0.25*(iiter-5))
      if dtau > maxnrg:
        dtau = maxnrg

    globdat.elements.commitHistory()

    globdat.dissnrg = 0.5 * dot( ( lam0 * Da - (lam-lam0) * ( a - Da ) ) , fhat )
예제 #19
0
  def run( self , props , globdat ):

    globdat.cycle += 1
    
    dofCount = len(globdat.dofs)

    a  = globdat.state
    Da = globdat.Dstate

    Da[:] = zeros( dofCount )
    fint  = zeros( dofCount ) 
    fext  = zeros( dofCount ) 

    print '================================='
    print ' Load step %i' % globdat.cycle
    print '================================='
    print '  NR iter : L2-norm residual'
     
    #fext = fext + Dfext
  
    globdat.iiter = 0 

    K = assembleTangentStiffness( props, globdat )
    
    error = 1.
    
    while error > self.tol:

      globdat.iiter += 1
	      
      da = globdat.dofs.solve( K, fext-fint )

      Da[:] += da[:]
      a [:] += da[:]

      fint = assembleInternalForce   ( props, globdat )
      K    = assembleTangentStiffness( props, globdat )
    
      error = globdat.dofs.norm( fext-fint )               
    
      print '  Iter', globdat.iiter, ':', error

      if globdat.iiter == self.iterMax:
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # Converged
    
    elements.commitHistory()

    if globdat.cycle == 10:
      globdat.active = False 







      # Solve for new displacement vector, load factor      

      if self.method == 'force-controlled':
        da = dofs.solve( K, lam*fhat-fint )
   
      elif self.method == 'nrg':
        h  =  0.5 * lam0 * fhat
        w  = -0.5 * dot ( (a-Da) , fhat )
        g  =  0.5 * dot ( ( lam0 * Da - Dlam * ( a[:] - Da[:] ) ) , fhat ) - dtau
  
        d1 = dofs.solve( K , lam*fhat - fint )
        d2 = dofs.solve( K , -1.0*fhat )

        denom  = dot ( h , d2 ) - w

        da     = d1 - ( d2 * ( dot( h , d1 ) + g ) ) / denom
        dlam   = -g - ( dot( -1.0*h , d1 ) - g * ( 1.0 + denom ) ) / denom;
 
        Dlam   += dlam
        lam    += dlam
      else:
        raise RuntimeError('Method not known')
   
      # Update displacements

      Da[:] += da[:]
      a [:] += da[:]

      # Solve for new displacement vector, load factor      
  
      K    = assembleTangentStiffness( props, globdat )
      fint = assembleInternalForce( props, globdat )
    
      # Check convergence

      error  = globdat.dofs.norm( lam*fhat-fint ) / globdat.dofs.norm( lam*fhat )

      # Increment the Newton-Raphson iteration counter
      # and print error

      globdat.iiter += 1

      print '   Iter %5i  : %4.2e ' %(iiter,error)

      if globdat.iiter == iterMax:
        plotCurve( output )  
        raise RuntimeError('Newton-Raphson iterations did not converge!')

    # If converged, calculate the amount of energy that has been dissipated in the \
    # previous step.

    print '---------------------------------'
    print '   C O N V E R G E D'
  
    if method == 'force-controlled':
      print '   Diss. nrg   : %1.3e ' %dissnrg

    Da[:]  = zeros( len(dofs) )
    lam0 = lam
  
    if method == 'force-controlled':
      if dissnrg > switchnrg:
        print '   Switch to nrg diss. arc-length'
        self.method = 'nrg'
        Dlam   = 0.;
        dtau   = 0.25*switchnrg
      else:
        lam   += Dlam
    else:
      Dlam = 0.;
      dtau *= pow(0.5,0.25*(iiter-5))
      if dtau > maxnrg:
        dtau = maxnrg

    globdat.elements.commitHistory()

    globdat.dissnrg = 0.5 * dot( ( lam0 * Da - (lam-lam0) * ( a - Da ) ) , fhat )
예제 #20
0
    def run(self, props, globdat):

        globdat.cycle += 1

        globdat.lam = 1.0 * globdat.cycle

        dofCount = len(globdat.dofs)

        a = globdat.state
        Da = globdat.Dstate
        fhat = globdat.fhat

        Da[:] = zeros(dofCount)
        fint = zeros(dofCount)
        fext = globdat.lam * fhat

        print('=================================')
        print(' Load step %i' % globdat.cycle)
        print('=================================')
        print('  NR iter : L2-norm residual')

        globdat.iiter = 0

        K, fint = assembleTangentStiffness(props, globdat)

        error = 1.

        globdat.dofs.setConstrainFactor(1.0)

        while error > self.tol:

            globdat.iiter += 1

            da = globdat.dofs.solve(K, fext - fint)

            Da[:] += da[:]
            a[:] += da[:]

            K, fint = assembleTangentStiffness(props, globdat)

            # note that the code is different from the one presented in the book, which
            # is slightly shorter for the sake of clarity.
            # In the case of a prescribed displacement, the external force is zero
            # and hence its norm is zero. In that case, the norm of the residue is not
            # divided by the norm of the external force.

            norm = globdat.dofs.norm(fext)

            if norm < 1.0e-16:
                error = globdat.dofs.norm(fext - fint)
            else:
                error = globdat.dofs.norm(fext - fint) / norm

            print('  Iter', globdat.iiter, ':', error)

            globdat.dofs.setConstrainFactor(0.0)

            if globdat.iiter == self.iterMax:
                raise RuntimeError(
                    'Newton-Raphson iterations did not converge!')

        # Converged

        globdat.elements.commitHistory()

        Da[:] = zeros(len(globdat.dofs))

        globdat.fint = fint

        if globdat.cycle == self.maxCycle or globdat.lam > self.maxLam:
            globdat.active = False
예제 #21
0
    def run(self, props, globdat):

        stat = globdat.solverStatus

        self.stat = stat

        stat.increaseStep()

        #fext  = zeros( len(globdat.dofs) )

        logger.info("Staggered solver ............")
        logger.info("    =============================================")
        logger.info("    Load step %i" % globdat.solverStatus.cycle)
        logger.info("    =============================================")

        for solver in self.solvers:

            stat.iiter = 0
            error = 1.0

            K, fint = assembleTangentStiffness(props, globdat)
            fext = assembleExternalForce(props, globdat)

            self.setLoadAndConstraints(solver.cons)

            da = globdat.dofs.solve(K, fext - fint, solver.cons)

            globdat.state += da

            logger.info('    Solver           : %s' % solver.name)

            if solver.type == "Nonlinear":

                if solver.name == "dummy":
                    norm = 1.0
                else:
                    norm = globdat.dofs.norm(fext - fint, solver.cons)

                logger.info('    Newton-Raphson   : L2-norm residual')

                while error > self.tol:

                    stat.iiter += 1

                    K, fint = assembleTangentStiffness(props, globdat)

                    solver.cons.setConstrainFactor(0.0)

                    da = globdat.dofs.solve(K, fext - fint, solver.cons)

                    globdat.state += da

                    if solver.name == "dummy":
                        error = 1.0e-8
                    elif norm < 1.0e16:
                        error = globdat.dofs.norm(fext - fint, solver.cons)
                    else:
                        error = globdat.dofs.norm(fext - fint) / norm

                    logger.info('    Iteration %4i   : %6.4e' %
                                (stat.iiter, error))

                    if stat.iiter == self.iterMax:
                        raise RuntimeError(
                            'Newton-Raphson iterations did not converge!')

        # Combine results and calculate stresses

        globdat.fint = assembleInternalForce(props, globdat)

        commit(props, globdat)

        globdat.elements.commitHistory()

        if stat.cycle == self.maxCycle:  # or globdat.lam > self.maxLam:
            globdat.active = False
예제 #22
0
  def run( self , props , globdat ):

    stat = globdat.solverStatus
    
    stat.increaseStep()
   
    a    = globdat.state
    Da   = globdat.Dstate
    #fhat = globdat.fhat
    
    fhat = assembleExternalForce( props, globdat )  
 
    self.printHeader( stat.cycle )
      
    error         = 1.
    lam0          = globdat.lam
    
    if stat.cycle == 1: 
      stat.dtime =  max( globdat.lam * self.dtime , 0.0001 )   
      
      K,fint = assembleTangentStiffness( props, globdat )      
      Da1    = globdat.dofs.solve( K , globdat.lam*fhat )
      Dlam   = globdat.lam
    else:
      Da1    = self.factor * self.Daprev
      Dlam   = self.factor * self.Dlamprev
      globdat.lam += Dlam


    a [:] += Da1[:]
    Da[:] =  Da1[:]
    
    stat.dtime = max( Dlam * self.dtime , 0.0001 ) 
        
    K,fint    = assembleTangentStiffness( props, globdat )  
    dgda,diss = assembleDissipation( props , globdat )   

    res = globdat.lam*fhat-fint  

    while error > self.tol:
      stat.iiter += 1

      d1 = globdat.dofs.solve( K , fhat )
      d2 = globdat.dofs.solve( K , res )
            
      ddlamR = -dot(Da1,d2)/dot(Da1,d1)
      ddaR   = ddlamR*d1 + d2

      if self.method == 'nrg-controlled':
        if self.disstype == "Classic":
          h  =  0.5 * lam0 * fhat  # wordt dgda
          w  = -0.5 * dot ( (a-Da) , fhat )   # wordt 0.0
          g  =  0.5 * dot ( ( lam0 * Da - Dlam * ( a[:] - Da[:] ) ) , fhat ) - globdat.dtau  
        elif self.disstype == "Local":
          h = dgda
          w = 0.0
          g = diss - globdat.dtau
        else:
          raise RuntimeError('Not implemented!')
  
        denom  = - dot ( h , d1 ) - w

        ddaN    = d2 - ( -d1 * ( dot( h , d2 ) + g ) ) / denom
        ddlamN  = -g - ( dot( -1.0*h , d2 ) - g * ( 1.0 + denom ) ) / denom;
 
      if self.method == 'force-controlled':
        Dlam        += ddlamR
        globdat.lam += ddlamR
            
        Da[:] += ddaR[:]
        a [:] += ddaR[:]        
      elif self.method == 'nrg-controlled':
        if stat.iiter == 1 and globdat.dofs.norm(Da+ddaN)/globdat.dofs.norm(Da1) > self.beta:
          self.method = 'force-controlled'
          Dlam        += ddlamR
          globdat.lam += ddlamR
            
          Da[:] += ddaR[:]
          a [:] += ddaR[:]             
        else:
          Dlam        += ddlamN
          globdat.lam += ddlamN
            
          Da[:] += ddaN[:]
          a [:] += ddaN[:]
                              
      # Solve for new displacement vector, load factor      

      stat.dtime = max( Dlam * self.dtime , 0.0001 )    
      
      K,fint = assembleTangentStiffness( props, globdat )
      dgda,diss = assembleDissipation( props , globdat )   
    
      res = globdat.lam*fhat-fint
      # Check convergence

      error  = globdat.dofs.norm( res ) / globdat.dofs.norm( globdat.lam*fhat )

      self.printIteration( stat.iiter , error )

    # If converged, calculate the amount of energy that has been dissipated in the \
    # previous step.

    if self.disstype == "Classic":
      diss = 0.5 * dot( ( lam0 * Da - Dlam * ( a[:] - Da[:] ) ),fhat )
   

    self.printConverged( stat.iiter , diss )

    self.Daprev    = Da
    self.Dlamprev  = Dlam
  
    self.factor = pow(0.5,0.25*(stat.iiter-self.optiter))
  
    globdat.dtau = diss
        
    if self.method == 'force-controlled':
      if diss > self.switchEnergy:
        print('   Switch to nrg diss. arc-length')
        self.method       = 'nrg-controlled'
        globdat.dtau = diss
        self.factor  = 1.0     
    else:
      globdat.dtau *= self.factor
      
      if globdat.dtau > self.maxdTau:
        self.factor *= self.maxdTau / globdat.dtau
        globdat.dtau = self.maxdTau
            
    globdat.elements.commitHistory()

    globdat.fint = fint

    if globdat.lam > self.maxLam or stat.cycle > self.maxCycle:
      globdat.active=False