Exemple #1
0
def test_shape_derivative_unconstrained():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	n = FacetNormal(mesh)

	CG1 = VectorFunctionSpace(mesh, 'CG', 1)
	defo = TestFunction(CG1)

	J1 = Constant(1)*dx
	J2 = Constant(1)*ds

	sop1 = cashocs.ShapeOptimizationProblem(e, bcs, J1, u, p, boundaries, config)
	sop1.state_problem.has_solution = True
	sop1.adjoint_problem.has_solution = True
	cashocs_sd_1 = assemble(sop1.form_handler.shape_derivative)[:]
	exact_sd_1 = assemble(div(defo)*dx)[:]

	sop2 = cashocs.ShapeOptimizationProblem(e, bcs, J2, u, p, boundaries, config)
	sop2.state_problem.has_solution = True
	sop2.adjoint_problem.has_solution = True
	cashocs_sd_2 = assemble(sop2.form_handler.shape_derivative)[:]
	exact_sd_2 = assemble(t_div(defo, n)*ds)[:]

	assert np.allclose(cashocs_sd_1, exact_sd_1)
	assert np.allclose(cashocs_sd_2, exact_sd_2)
Exemple #2
0
def test_shape_derivative_constrained():
	"""Note, that the warning raised by cashocs is also dealt with in this test.
	No need to show a warning in pytest.

	"""

	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	n = FacetNormal(mesh)

	CG1 = VectorFunctionSpace(mesh, 'CG', 1)
	defo = TestFunction(CG1)

	x = SpatialCoordinate(mesh)
	u_d_coord = pow(x[0], 2) + pow(x[1], 4) - pi
	u_d_expr = Expression('pow(x[0], 2) + pow(x[1], 4) - pi', degree=4, domain=mesh)
	u_d_func = interpolate(u_d_expr, V)

	J_coord = (u - u_d_coord)*(u - u_d_coord)*dx
	J_expr = (u - u_d_expr)*(u - u_d_expr)*dx
	J_func = (u - u_d_func)*(u - u_d_func)*dx

	exact_shape_derivative = (u - u_d_coord)*(u - u_d_coord)*div(defo)*dx - Constant(2)*(u - u_d_coord)*dot(grad(u_d_coord), defo)*dx \
							 + div(defo)*inner(grad(u), grad(p))*dx - Constant(2)*inner(eps(defo)*grad(u), grad(p))*dx - div(defo)*f*p*dx \
							 - inner(grad(f), defo)*p*dx

	sop_coord = cashocs.ShapeOptimizationProblem(e, bcs, J_coord, u, p, boundaries, config)
	sop_coord.compute_adjoint_variables()
	cashocs_sd_coord = assemble(sop_coord.form_handler.shape_derivative)[:]

	config.set('ShapeGradient', 'degree_estimation', 'True')
	sop_expr = cashocs.ShapeOptimizationProblem(e, bcs, J_expr, u, p, boundaries, config)
	sop_expr.compute_adjoint_variables()
	cashocs_sd_expr = assemble(sop_expr.form_handler.shape_derivative, form_compiler_parameters={'quadrature_degree' : 10})[:]
	config.set('ShapeGradient', 'degree_estimation', 'False')
	### degree estimation is only needed to avoid pytest warnings regarding numpy. This is only a fenics problem.

	exact_sd = assemble(exact_shape_derivative)[:]
	assert np.allclose(exact_sd, cashocs_sd_coord)
	assert np.allclose(exact_sd, cashocs_sd_expr)

	# Need 2 objects, since interpolation of u_d into CG1 space does not yield 4th order polynomial
	exact_shape_derivative_func = (u - u_d_func)*(u - u_d_func)*div(defo)*dx - Constant(2)*(u - u_d_func)*dot(grad(u_d_func), defo)*dx \
							 + div(defo)*inner(grad(u), grad(p))*dx - Constant(2)*inner(eps(defo)*grad(u), grad(p))*dx - div(defo)*f*p*dx \
							 - inner(grad(f), defo)*p*dx

	sop_func = cashocs.ShapeOptimizationProblem(e, bcs, J_func, u, p, boundaries, config)
	sop_func.compute_adjoint_variables()
	cashocs_sd_func = assemble(sop_func.form_handler.shape_derivative)[:]

	exact_sd_func = assemble(exact_shape_derivative_func)[:]
	assert np.allclose(exact_sd_func, cashocs_sd_func)
Exemple #3
0
def test_shape_barycenter_regularization():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	config.set('Regularization', 'factor_volume', '1e2')
	config.set('Regularization', 'use_initial_volume', 'True')
	config.set('Regularization', 'factor_barycenter', '1.0')
	pos_x = np.random.uniform(0.2, 0.4)
	pos_y = np.random.uniform(-0.4, -0.2)
	config.set('Regularization', 'target_barycenter', str([pos_x, pos_y]))
	config.set('MeshQuality', 'volume_change', '10')
	initial_volume = assemble(1*dx)
	J_vol = Constant(0)*dx
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J_vol, u, p, boundaries, config)
	
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	
	sop.solve('lbfgs', rtol=1e-5, max_iter=50)
	
	x = SpatialCoordinate(mesh)
	volume = assemble(1*dx)
	bc_x = assemble(x[0]*dx) / volume
	bc_y = assemble(x[1]*dx) / volume
	
	assert abs(volume - initial_volume) < 1e-2
	assert abs(bc_x - pos_x) < 1e-4
	assert abs(bc_y - pos_y) < 1e-4
	
	config.set('Regularization', 'factor_barycenter', '0.0')
	config.set('MeshQuality', 'volume_change', 'inf')
	config.set('Regularization', 'factor_volume', '0.0')
	config.set('Regularization', 'use_initial_volume', 'False')
Exemple #4
0
def test_shape_cg_hz():
	config.set('AlgoCG', 'cg_method', 'HZ')
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	sop.solve('cg', rtol=1e-2, atol=0.0, max_iter=22)
	assert sop.solver.relative_norm < sop.solver.rtol
Exemple #5
0
def test_shape_gradient():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
Exemple #6
0
def test_scaling_shape_regularization():

	no_iterations = 5
	test_weights = np.random.rand(no_iterations, 4)
	config.set('Regularization', 'use_relative_scaling', 'True')
	config.set('Regularization', 'target_barycenter', '[1.0, 1.0, 0.0]')
	
	for iteration in range(no_iterations):
	
		mesh.coordinates()[:, :] = initial_coordinates
		mesh.bounding_box_tree().build(mesh)
		
		J = Constant(0)*dx
		
		config.set('Regularization', 'factor_volume', str(test_weights[iteration, 0]))
		config.set('Regularization', 'factor_surface', str(test_weights[iteration, 1]))
		config.set('Regularization', 'factor_curvature', str(test_weights[iteration, 2]))
		config.set('Regularization', 'factor_barycenter', str(test_weights[iteration, 3]))
		
		test_sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
		
		summ = np.sum(test_weights[iteration, :])
		val = test_sop.reduced_cost_functional.evaluate()
		
		assert abs(val - summ) < 1e-15
	
	config.set('Regularization', 'factor_volume', '0.0')
	config.set('Regularization', 'factor_surface', '0.0')
	config.set('Regularization', 'factor_curvature', '0.0')
	config.set('Regularization', 'factor_barycenter', '0.0')
	config.set('Regularization', 'use_relative_scaling', 'False')
	config.set('Regularization', 'target_barycenter', '[0.0, 0.0, 0.0]')
Exemple #7
0
def test_custom_supply_shape():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	user_sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	vfield = user_sop.get_vector_field()
	I = Identity(2)
	
	adjoint_form = inner(grad(p), grad(TestFunction(V)))*dx - TestFunction(V)*dx
	dJ = u*div(vfield)*dx - inner((div(vfield)*I - 2*sym(grad(vfield)))*grad(u), grad(p))*dx + div(f*vfield)*p*dx
	
	user_sop.supply_custom_forms(dJ, adjoint_form, bcs)
	
	assert cashocs.verification.shape_gradient_test(user_sop) > 1.9
	assert cashocs.verification.shape_gradient_test(user_sop) > 1.9
	assert cashocs.verification.shape_gradient_test(user_sop) > 1.9
Exemple #8
0
def test_curvature_computation():

	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	
	config.set('Regularization', 'factor_curvature', '1.0')
	
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	
	sop.form_handler.regularization.compute_curvature()
	
	kappa = sop.form_handler.regularization.kappa_curvature
	mean_curvature = assemble(sqrt(inner(kappa, kappa))*ds) / assemble(1*ds)
	
	config.set('Regularization', 'factor_curvature', '0.0')
	
	assert abs(mean_curvature - 1) < 1e-3
Exemple #9
0
def test_custom_shape_scalar_product():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	
	config.set('ShapeGradient', 'damping_factor', '0.0')
	
	space = VectorFunctionSpace(mesh, 'CG', 1)
	shape_scalar_product = Constant(1)*inner((grad(TrialFunction(space))), (grad(TestFunction(space))))*dx + inner(TrialFunction(space), TestFunction(space))*dx
	
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config, shape_scalar_product=shape_scalar_product)
	sop.solve('lbfgs', rtol=1e-2, atol=0.0, max_iter=8)
	
	config.set('ShapeGradient', 'damping_factor', '0.2')
	
	assert sop.solver.relative_norm < sop.solver.rtol
	
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
Exemple #10
0
def test_move_mesh():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	V = VectorFunctionSpace(mesh, 'CG', 1)
	offset = np.random.rand(2)
	trafo = interpolate(Constant(offset), V)
	sop.mesh_handler.move_mesh(trafo)

	deformed_coordinates = np.zeros(initial_coordinates.shape)
	deformed_coordinates[:, 0] = initial_coordinates[:, 0] + offset[0]
	deformed_coordinates[:, 1] = initial_coordinates[:, 1] + offset[1]
	assert np.alltrue(abs(mesh.coordinates()[:, :] -  deformed_coordinates ) < 1e-15)

	sop.mesh_handler.revert_transformation()
	assert np.alltrue(abs(mesh.coordinates()[:, :] - initial_coordinates) < 1e-15)

	trafo.vector()[:] = np.random.uniform(-1e3, 1e3, V.dim())
	sop.mesh_handler.move_mesh(trafo)
	assert np.alltrue(abs(mesh.coordinates()[:, :] - initial_coordinates) < 1e-15)
Exemple #11
0
def test_scaling_shape():
	
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	
	J1 = u*dx
	J2 = u*u*dx
	J_list = [J1, J2]
	
	desired_weights = np.random.rand(2).tolist()
	diff = desired_weights[1] - desired_weights[0]
	
	test_sop = cashocs.ShapeOptimizationProblem(e, bcs, J_list, u, p, boundaries, config, desired_weights=desired_weights)
	val = test_sop.reduced_cost_functional.evaluate()
	
	assert abs(val - diff) < 1e-14
	
	assert cashocs.verification.shape_gradient_test(test_sop) > 1.9
	assert cashocs.verification.shape_gradient_test(test_sop) > 1.9
	assert cashocs.verification.shape_gradient_test(test_sop) > 1.9
Exemple #12
0
def test_shape_surface_regularization():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	config.set('Regularization', 'factor_surface', '1.0')
	radius = np.random.uniform(0.33, 0.66)
	config.set('Regularization', 'target_surface', str(2*np.pi*radius))
	config.set('MeshQuality', 'volume_change', '10')
	J_vol = Constant(0)*dx
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J_vol, u, p, boundaries, config)
	
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	assert cashocs.verification.shape_gradient_test(sop) > 1.9
	
	sop.solve('lbfgs', rtol=1e-6, max_iter=50)
	max_coordinate = np.max(mesh.coordinates())
	min_coordinate = -np.min(mesh.coordinates())
	assert abs(max_coordinate - radius) < 5e-3
	assert abs(min_coordinate - radius) < 5e-3
	assert 0.5*pow(assemble(1*ds) - 2*np.pi*radius, 2) < 1e-10
	config.set('Regularization', 'factor_surface', '0.0')
	config.set('MeshQuality', 'volume_change', 'inf')
Exemple #13
0
def test_shape_lbfgs():
	mesh.coordinates()[:, :] = initial_coordinates
	mesh.bounding_box_tree().build(mesh)
	sop = cashocs.ShapeOptimizationProblem(e, bcs, J, u, p, boundaries, config)
	sop.solve('lbfgs', rtol=1e-2, atol=0.0, max_iter=8)
	assert sop.solver.relative_norm < sop.solver.rtol
Exemple #14
0
up = Function(V)
u, p = split(up)
vq = Function(V)
v, q = split(vq)

e = inner(grad(u), grad(v))*dx - p*div(v)*dx - q*div(u)*dx

u_in = Expression(('-1.0/4.0*(x[1] - 2.0)*(x[1] + 2.0)', '0.0'), degree=2)
bc_in = DirichletBC(V.sub(0), u_in, boundaries, 1)
bc_no_slip = cashocs.create_bcs_list(V.sub(0), Constant((0,0)), boundaries, [2,4])
bcs = [bc_in] + bc_no_slip

J = inner(grad(u), grad(u))*dx

sop = cashocs.ShapeOptimizationProblem(e, bcs, J, up, vq, boundaries, config)
sop.solve()



### Post Processing

import matplotlib.pyplot as plt
plt.figure(figsize=(15,3))

ax_mesh = plt.subplot(1, 3, 1)
fig_mesh = plot(mesh)
plt.title('Discretization of the optimized geometry')

ax_u = plt.subplot(1, 3, 2)
ax_u.set_xlim(ax_mesh.get_xlim())
Exemple #15
0
x = SpatialCoordinate(mesh)
f = 2.5 * pow(x[0] + 0.4 - pow(x[1], 2), 2) + pow(x[0], 2) + pow(x[1], 2) - 1

e = inner(grad(u), grad(p)) * dx - f * p * dx
bcs = DirichletBC(V, Constant(0), boundaries, 1)

J_1 = u * dx
J_2 = Constant(1) * dx
J_list = [J_1, J_2]

desired_weights = [1, 2]

sop = cashocs.ShapeOptimizationProblem(e,
                                       bcs,
                                       J_list,
                                       u,
                                       p,
                                       boundaries,
                                       config,
                                       desired_weights=desired_weights)
sop.solve()

### Post Processing

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))

ax_mesh = plt.subplot(1, 2, 1)
fig_mesh = plot(mesh)
plt.title('Discretization of the optimized geometry')

ax_u = plt.subplot(1, 2, 2)
e = inner(grad(u), grad(p)) * dx - f * p * dx
bcs = DirichletBC(V, Constant(0), boundaries, 1)

J = u * dx

VCG = VectorFunctionSpace(mesh, 'CG', 1)
shape_scalar_product = inner((grad(TrialFunction(VCG))),
                             (grad(TestFunction(VCG)))) * dx + inner(
                                 TrialFunction(VCG), TestFunction(VCG)) * dx

sop = cashocs.ShapeOptimizationProblem(
    e,
    bcs,
    J,
    u,
    p,
    boundaries,
    config,
    shape_scalar_product=shape_scalar_product)
sop.solve()

### Post Processing

import matplotlib.pyplot as plt
plt.figure(figsize=(10, 5))

ax_mesh = plt.subplot(1, 2, 1)
fig_mesh = plot(mesh)
plt.title('Discretization of the optimized geometry')