diff --git a/Contrib/GeorgiaTech/LengthsAndDotProducts.pg b/Contrib/GeorgiaTech/LengthsAndDotProducts.pg
new file mode 100644
index 0000000000..45d8df8bc3
--- /dev/null
+++ b/Contrib/GeorgiaTech/LengthsAndDotProducts.pg
@@ -0,0 +1,148 @@
+##DESCRIPTION
+## Orthogonal sets, matrices, and projections
+##ENDDESCRIPTION
+
+
+## DBsubject(Linear algebra)
+## DBchapter(Vector geometry)
+## DBsection(Dot product, length, and unit vectors)
+## Date(11/25/2024)
+## Institution(Georgia Institute of Technology)
+## Author(Seth Brunner)
+## Level(2)
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "PGgraders.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "matrixExtensions.pl",
+ "unionLists.pl",
+ "unionTables.pl",
+ "Alfredmacros.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+
+TEXT(beginproblem());
+
+Context("Numeric");
+
+$dropdown_a = PopUp(["?", "A", "B", "C", "D","More than one of the given sets","None of the given sets"], "B");
+$dropdown_b = PopUp(["?", "A", "B", "C", "D","More than one of the given sets","None of the given sets"], "D");
+$dropdown_c = PopUp(["?", "A", "B", "C", "D","More than one of the given sets","None of the given sets"], "C");
+$dropdown_d = PopUp(["?", "A", "B", "C", "D","More than one of the given sets","None of the given sets"], "A");
+
+$normu=random(1,5,1);
+$udotu=Compute("$normu**2");
+$normv=random(1,6,1);
+$vdotv=Compute("$normv**2");
+$ssl=Compute("$normu**2+$normv**2");
+while($normu==$normv)
+{
+ $normv=random(1,6,1);
+}
+$dotP=0;
+
+Context()->texStrings;
+
+$mc1 = new_checkbox_multiple_choice();
+$mc1 -> qa (
+"Which of the following sets contain only unit vectors? $BITALIC Select all that apply$EITALIC.",
+
+"\(\left\lbrace\frac1{$normu}\vec u,\frac1{$normv}\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac{$normv}{$udotu\sqrt{$ssl}}\vec u+\frac{$normu}{$vdotv\sqrt{$ssl}}\vec v,\frac{$normu}{$udotu\sqrt{$ssl}}\vec u+\frac{$normv}{$vdotv\sqrt{$ssl}}\vec v\right\rbrace\)",
+ );
+$mc1 -> extra(
+"\(\left\lbrace\vec u+\vec v,\vec u-\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac1{$normu}\vec u+\frac1{$normv}\vec v,\frac1{$normu}\vec u-\frac1{$normv}\vec v\right\rbrace\)",
+);
+$mc1 -> makeLast("None of the above");
+
+$mc2 = new_checkbox_multiple_choice();
+$mc2 -> qa (
+"Which of the following sets are orthogonal? $BITALIC Select all that apply$EITALIC.",
+
+"\(\left\lbrace\frac1{$normu}\vec u,\frac1{$normv}\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac1{$normu}\vec u+\frac1{$normv}\vec v,\frac1{$normu}\vec u-\frac1{$normv}\vec v\right\rbrace\)",
+ );
+$mc2 -> extra(
+"\(\left\lbrace\vec u+\vec v,\vec u-\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac{$normv}{$udotu\sqrt{$ssl}}\vec u+\frac{$normu}{$vdotv\sqrt{$ssl}}\vec v,\frac{$normu}{$udotu\sqrt{$ssl}}\vec u+\frac{$normv}{$vdotv\sqrt{$ssl}}\vec v\right\rbrace\)",
+ );
+$mc2 -> makeLast("None of the above");
+
+
+$mc3 = new_checkbox_multiple_choice();
+$mc3 -> qa (
+"Based on the previous two questions, which of the following sets are orthonormal? $BITALIC Select all that apply$EITALIC.",
+
+"\(\left\lbrace\frac1{$normu}\vec u,\frac1{$normv}\vec v\right\rbrace\)",
+ );
+$mc3 -> extra(
+"\(\left\lbrace\vec u+\vec v,\vec u-\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac{$normv}{$udotu\sqrt{$ssl}}\vec u+\frac{$normu}{$vdotv\sqrt{$ssl}}\vec v,\frac{$normu}{$udotu\sqrt{$ssl}}\vec u+\frac{$normv}{$vdotv\sqrt{$ssl}}\vec v\right\rbrace\)",
+
+"\(\left\lbrace\frac1{$normu}\vec u+\frac1{$normv}\vec v,\frac1{$normu}\vec u-\frac1{$normv}\vec v\right\rbrace\)",
+ );
+$mc3 -> makeLast("None of the above");
+
+BEGIN_TEXT
+
+Suppose \(\vec u\) and \(\vec v\) are vectors with \(\left\|\vec u\right\|=$normu\), \(\left\|\vec v\right\|=$normv\), and \(\vec u\cdot\vec v=$dotP\).
+
+
+$BR
+
+\{ $mc1 -> print_q() \}
+
+$BR
+
+\{ $mc1 -> print_a() \}
+
+$BR
+$BR
+
+\{ $mc2 -> print_q() \}
+
+$BR
+
+\{ $mc2 -> print_a() \}
+
+$BR
+$BR
+
+\{ $mc3 -> print_q() \}
+
+$BR
+
+\{ $mc3 -> print_a() \}
+
+
+
+END_TEXT
+Context()->normalStrings;
+
+##################################################
+# Answers
+
+$showPartialCorrectAnswers = 0;
+
+install_problem_grader(~~&std_problem_grader);
+
+$showPartialCorrectAnswers = 0;
+
+ANS(checkbox_cmp($mc1->correct_ans()));
+ANS(checkbox_cmp($mc2->correct_ans()));
+ANS(checkbox_cmp($mc3->correct_ans()));
+
+
+
+ENDDOCUMENT();
diff --git a/Contrib/GeorgiaTech/Module1TrueorFalse.pg b/Contrib/GeorgiaTech/Module1TrueorFalse.pg
new file mode 100644
index 0000000000..500e6735a0
--- /dev/null
+++ b/Contrib/GeorgiaTech/Module1TrueorFalse.pg
@@ -0,0 +1,150 @@
+## DBsubject(Calculus - multivariable)
+
+## DBchapter(Calculus of vector valued functions)
+
+## DBsection(Parameterized curves)
+
+## Institution(Georgia Institute of Technology)
+
+## Author(Gregory Mayer, Hunter Lehman)
+
+## Level(2)
+
+## MO(1)
+
+## Language(en)
+
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "unionLists.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+TEXT(beginproblem(), $BR,$BBOLD, "True or False Exercise", $EBOLD, $BR,$BR);
+$showPartialCorrectAnswers = 0;
+
+@questions = (
+ "The speed of a particle with a position function \(r(t)\) is \(\frac{r'(t)}{|r'(t)|}\).",
+ "If \(u\) and \(v\) are two vectors in \(\mathbb{R}^3\), then \(u \cdot v\) is a vector orthogonal to both \(u\) and \(v\).",
+ "The point (2, -1, 3) lies on the graph of the sphere \((x - 2)^2 + (y + 1)^2 + (z - 3)^2 = 25\).",
+ "\(\frac{d}{dt}[u(t) \times u(t)] = 2u'(t) \times u(t)\). ",
+ "Parallel planes have parallel normal vectors. ",
+ "The vector \(\frac{1}{\sqrt{3}} \hat i - \frac{1}{\sqrt{3}} \hat j + \frac{2}{\sqrt{3}} \hat k\) is a unit vector. ",
+ "The only way that \(v \cdot w\) = 0 is if \(v\) = 0 or \(w\) = 0.",
+);
+
+@corans = ('False', 'False', 'False', 'False', 'True', 'True', 'False');
+
+# Choose Seven of the question and answer pairs at random.
+@which = NchooseK(7, 7);
+
+@squestions = @questions[@which];
+@scorans = @corans[@which];
+
+foreach my $i (0..6) {
+ $popup[$i] = PopUp(['Choose','True', 'False'],$scorans[$i]);
+}
+
+BEGIN_TEXT
+Indicate whether the following statements are true or false.
+$PAR
+\{ BeginList('OL',type=>'a') \}
+
+$ITEM
+$squestions[0]
+$BR
+\{ $popup[0]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[1]
+$BR
+\{ $popup[1]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[2]
+$BR
+\{ $popup[2]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[3]
+$BR
+\{ $popup[3]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[4]
+$BR
+\{ $popup[4]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[5]
+$BR
+\{ $popup[5]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[6]
+$BR
+\{ $popup[6]->menu \}
+$ITEMSEP
+
+\{ EndList('OL') \}
+
+END_TEXT
+
+install_problem_grader(~~&std_problem_grader);
+
+# Enter the correct answers to be checked against the answers to the students.
+
+foreach my $i (0..6) {
+ ANS($popup[$i]->cmp);
+}
+
+Context()->texStrings;
+
+@solutions = (
+ "$BBOLD False $EBOLD
+ $BR
+ The speed of a particle is defined as the magnitude of its velocity vector, not the normalized velocity. The correct formula for speed is \(|r'(t)|\), where \(r'(t)\) is the velocity vector. The given expression \(\frac{r'(t)}{|r'(t)|}\) would always have a magnitude of 1, representing only the direction of motion, not the speed. ",
+ "$BBOLD False $EBOLD
+ $BR
+ \(u \cdot v\) is a scalar (dot product), not a vector. The cross product \(u × v\) would give a vector orthogonal to both u and v, but not the dot product.",
+ "$BBOLD False $EBOLD
+ $BR
+The sphere equation represents points whose distance from the center (2, -1, 3) equals the radius \(\sqrt{25} = 5\). Substituting (2, -1, 3) into the equation results in all squared terms becoming zero. Since any distance squared is non-negative, the equation reduces to \(0 = 25\), which is never true. This mathematical contradiction confirms (2, -1, 3) is not on the sphere. ",
+ "$BBOLD False $EBOLD
+ $BR
+ The correct differentiation of \(u(t) \times u(t)\) (cross product of a vector with itself) with respect to \(t\) is \(u'(t) \times u(t) + u(t) \times u'(t) \). Note also that the cross product of a vector with itself happens to be zero. But either way the statement is false because it does not use the correct differentiation formula.",
+ "$BBOLD True $EBOLD
+ $BR
+ Parallel planes have identical normal vectors or normal vectors that are scalar multiples of each other. ",
+ "$BBOLD True $EBOLD
+ $BR
+ Magnitude = \(\sqrt{\left(\frac{1}{\sqrt{3}}\right)^2 + \left(\frac{1}{\sqrt{3}}\right)^2 + \left(\frac{2}{\sqrt{3}}\right)^2} = 1\). A vector with magnitude 1 is a unit vector. ",
+ "$BBOLD False $EBOLD
+ $BR
+ Two non-zero orthogonal vectors can have a dot product of zero.",
+);
+
+$solutions = "";
+foreach (@which) {
+ $solutions .= "$ITEM $solutions[$_]";
+}
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+\{ BeginList('OL',type=>'a') \}
+$solutions
+\{ EndList('OL') \}
+END_SOLUTION
+Context()->normalStrings;
+
+ENDDOCUMENT(); # This should be the last executable line in the problem.
diff --git a/Contrib/GeorgiaTech/Module2TrueFalse.pg b/Contrib/GeorgiaTech/Module2TrueFalse.pg
new file mode 100644
index 0000000000..2be2dfc250
--- /dev/null
+++ b/Contrib/GeorgiaTech/Module2TrueFalse.pg
@@ -0,0 +1,151 @@
+## DBsubject(Calculus - multivariable)
+
+## DBchapter(Differentiation of multivariable functions)
+
+## DBsection(Directional derivatives and the gradient)
+
+## Institution(Georgia Institute of Technology)
+
+## Author(Gregory Mayer, Hunter Lehman)
+
+## Level(3)
+
+## MO(1)
+
+## Language(en)
+
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "unionLists.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+TEXT(beginproblem(), $BR,$BBOLD, "True or False Exercise", $EBOLD, $BR,$BR);
+$showPartialCorrectAnswers = 0;
+
+@questions = (
+ "Suppose \(\displaystyle{\lim_{x\to(0,0)} f(x, y) = 1}\) along the \(x\)-axis, \(y\)-axis, and the line \(x=y\) and \(f(0, 0) = 1\). Then \(f\) must be continuous at \((0, 0)\).",
+ "Suppose an arbitrary function \(f: \mathbb{R}^2 \rightarrow \mathbb{R}\). Then \(f_{xy} = f_{yx}\).",
+ "Suppose the contours of a continuous function \(f(x,y)\) are all parallel lines, then the graph of the function \(f\) is a plane.",
+ "Suppose the function \(f(x,y)\) has a gradient \(\nabla f\) at \((a, b)\). Then the vector \(\) is perpendicular to the the surface \(f(x,y) = z\) at \((a,b,f(a,b))\)",
+ "Suppose \(f(x,y) = \frac{y^2}{x}\). Then the surface contains the curve \(\).",
+ "Suppose \(f(x,y) = x^2 + y^2\). Then \(0 \leq D_uf(1, 0) \leq 2\)",
+ "Suppose \(f\) is differentiable at \((a, b)\) and \(\nabla f(a, b) = (0, 0)\). Then \(f\) has a local
+maximum or minimum at \((a, b)\)",
+);
+
+@corans = ('False', 'False', 'True', 'True', 'False', 'False', 'True');
+
+# Choose Seven of the question and answer pairs at random.
+@which = NchooseK(7, 7);
+
+@squestions = @questions[@which];
+@scorans = @corans[@which];
+
+foreach my $i (0..6) {
+ $popup[$i] = PopUp(['Choose','True', 'False'],$scorans[$i]);
+}
+
+BEGIN_TEXT
+Indicate whether the following statements are true or false.
+$PAR
+\{ BeginList('OL',type=>'a') \}
+
+$ITEM
+$squestions[0]
+$BR
+\{ $popup[0]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[1]
+$BR
+\{ $popup[1]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[2]
+$BR
+\{ $popup[2]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[3]
+$BR
+\{ $popup[3]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[4]
+$BR
+\{ $popup[4]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[5]
+$BR
+\{ $popup[5]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[6]
+$BR
+\{ $popup[6]->menu \}
+$ITEMSEP
+
+\{ EndList('OL') \}
+
+END_TEXT
+
+install_problem_grader(~~&std_problem_grader);
+
+# Enter the correct answers to be checked against the answers to the students.
+
+foreach my $i (0..6) {
+ ANS($popup[$i]->cmp);
+}
+
+Context()->texStrings;
+
+@solutions = (
+ "False
+ $BR
+ To be continuous at a point a function \(f\), the value of the limit at the point must be equal for ALL paths approaching that point. Here, there are only three given paths.",
+ "False
+ $BR
+ This conclusion is only true under the special condition from Clairaut's Theorem stating that if \(f_{xy}\) and \(f_{yx}\) are both be continuous, then \(f_{xy} = f_{yx}\) is true.",
+ "True
+ $BR
+ For each contour line, we express it as \(f(x,y) = k\) for some arbitrary \(k\). Since we know the contour is always a line, we know the equation is in the form of \(ax + by + c = k\) for all contours. If we then swap out the \(k\) for \(z\), we can see that it is the equation for a plane.",
+ "True
+ $BR
+ Observe that \(\) is the normal vector to the tangent plane to the surface. By definition the normal vector is perpendicular to the tangent plane and therefore is perpendicular to the surface as well.",
+ "True
+ $BR
+ Plug the values in the curve into \(f\) and observe that the equality holds true.",
+ "False
+ $BR
+ Although the upper bound is true because \(D_u\) is maximized in the direction of the gradient (\(<2, 0>\) at point \((1,0)\)) meaning \(D_{<1, 0>}f(1, 0) = 2\), the minimum is false. Take the counter example where \(u = <-1, 0>\). Then \(D_uf(1,0) = \nabla f|_{1,0} \cdot <-1, 0> = <2, 0> \cdot <-1, 0> = -2\)",
+ "False
+ $BR
+ Although the gradient being 0 at the point lets us know it is a critical point, we do not know its classification. In addition to being a maximum and minimum, it can also be a saddle point.",
+);
+
+$solutions = "";
+foreach (@which) {
+ $solutions .= "$ITEM $solutions[$_]";
+}
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+\{ BeginList('OL',type=>'a') \}
+$solutions
+\{ EndList('OL') \}
+END_SOLUTION
+Context()->normalStrings;
+
+ENDDOCUMENT(); # This should be the last executable line in the problem.
diff --git a/Contrib/GeorgiaTech/Module3TrueFalse.pg b/Contrib/GeorgiaTech/Module3TrueFalse.pg
new file mode 100644
index 0000000000..1ad387776c
--- /dev/null
+++ b/Contrib/GeorgiaTech/Module3TrueFalse.pg
@@ -0,0 +1,161 @@
+## DBsubject(Calculus - multivariable)
+
+## DBchapter(Differentiation of multivariable functions)
+
+## DBsection(Double integrals over general regions)
+
+## Institution(Georgia Institute of Technology)
+
+## Author(Gregory Mayer, Hunter Lehman, Siddharth Kolichala)
+
+## Level(3)
+
+## MO(1)
+
+## Language(en)
+
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "unionLists.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+ "answerHints.pl",
+ "PGML.pl"
+);
+
+TEXT(beginproblem(), $BR,$BBOLD, "True or False Exercise", $EBOLD, $BR,$BR);
+$showPartialCorrectAnswers = 0;
+
+@questions = (
+ "If \(f(x, y) > 0\) for all \(x, y \in \mathbb{R}^2\), \[\int_{0}^{1}\int_{0}^{1}f(x,y)\,dy\,dx > \int_{0}^{1}\int_{x}^{1}f(x, y)\,dy\,dx.\] ",
+
+ "\[\int_{-1}^{1}\int_{0}^{1}e^{x^2 + y^2}\sin(y)\,dx\,dy = 0.\]",
+
+ "The equation \(r = 2\sin\theta\) describes a circle.",
+
+ "\[\int_{1}^{4}\int_{0}^{1}(x^2 + \sqrt{y})\sin(x^{2}y^{2})\,dx\,dy \leq 9.\]",
+
+ "Suppose \(f: \mathbb{R}^2 \rightarrow \mathbb{R}^2\) is differentiable everywhere and \(f(x, y) = f(x, 0)f(0, y)\) for all \((x, y) \in \mathbb{R}^2\). Then \[\int_{0}^{1}\int_{0}^{1}f(x,y)\,dx\,dy = \left(\int_{0}^{1}f(x,0)\,dx\right)\left(\int_{0}^{1}f(0, y)\,dy\right).\]",
+
+ "Suppose \(f(x, y)\) and \(g(x, y)\) are nonnegative and \(g(x, y) \neq 0\) throughout the region \([0, 1] \times [0, 1]\). Also suppose \(\int_{0}^{1}\int_{0}^{1}f(x, y)\,dx\,dy < \int_{0}^{1}\int_{0}^{1}g(x, y)\,dx\,dy\). Then \[\int_{0}^{1}\int_{0}^{1}\frac{f(x, y)}{g(x, y)}\,dx\,dy < 1.\]",
+
+ "The cylindrical coordinates of the point with Cartesian coordinates \((4, \pi, 0)\) are \((-4, 0, 0)\).",
+);
+
+@corans = ('True', 'True', 'True', 'True', 'True', 'False', 'True');
+
+# Choose Seven of the question and answer pairs at random.
+@which = (0, 1, 2, 3, 4, 5, 6);
+
+@squestions = @questions[@which];
+@scorans = @corans[@which];
+
+foreach my $i (0..6) {
+ $popup[$i] = PopUp(['Choose','True', 'False'],$scorans[$i]);
+}
+
+BEGIN_TEXT
+Indicate whether the following statements are true or false.
+$PAR
+\{ BeginList('OL',type=>'a') \}
+
+$ITEM
+$squestions[0]
+$BR
+\{ $popup[0]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[1]
+$BR
+\{ $popup[1]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[2]
+$BR
+\{ $popup[2]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[3]
+$BR
+\{ $popup[3]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[4]
+$BR
+\{ $popup[4]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[5]
+$BR
+\{ $popup[5]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[6]
+$BR
+\{ $popup[6]->menu \}
+$ITEMSEP
+
+\{ EndList('OL') \}
+
+END_TEXT
+
+install_problem_grader(~~&std_problem_grader);
+
+# Enter the correct answers to be checked against the answers to the students.
+
+foreach my $i (0..6) {
+ ANS($popup[$i]->cmp);
+}
+###########################################################################
+
+BEGIN_PGML_HINT
+For part (f), observe that the region of integration has area [`1`]. We can thus interpret the question as claiming the following: if the average value of [`f`] is less than the average value of [`g`], then the average value of [`\frac{f}{g}`] is less than [`1`]. Does this sound true?
+END_PGML_HINT
+
+###########################################################################
+
+# END HINT
+
+###########################################################################
+
+Context()->texStrings;
+
+@solutions = (
+ "True. Note that \[\int_{0}^{1}\int_{0}^{1}f(x,y)\,dy\,dx = \int_{0}^{1}\int_{x}^{1}f(x, y)\,dy\,dx + \int_{0}^{1}\int_{0}^{x}f(x, y)\,dy\,dx.\] The second term on the right-hand-side must be positive, and so the result follows.",
+
+ "True. Note that \[e^{x^2 + y^2}\sin(y) = - e^{x^2 + (-y)^2}\sin(-y)\] because \(\sin(-y) = -\sin(y)\), while \(e^{x^2 + (-y)^2} = e^{x^2 + y^2}\). Thus, the value of the integrand at \((x, y)\) is the negative of its value at \((x, -y)\). Since the region of integration is symmetric with respect to the \(x\)-axis, the answer is \(0\).",
+
+ "True. Notice that for \(r \neq 0\) \[r = 2\sin\theta \iff r^2 = 2r\sin\theta \iff x^2 + y^2 = 2x \text{ and } r \neq 0.\] The last equation is the equation of a circle minus the origin, and we can manually check that the origin satisfies \(r = 2\sin\theta\).",
+
+ "True. Note that in the region of integration, \[|(x^2 + \sqrt{y})\sin(x^{2}y^{2})| = |x^2 + \sqrt{y}|\cdot|\sin(x^{2}y^{2})| \leq |x^2 + \sqrt{y}| \leq |1^2 + \sqrt{4}| = 3.\] Therefore, \[\int_{1}^{4}\int_{0}^{1}(x^2 + \sqrt{y})\sin(x^{2}y^{2})\,dx\,dy \leq \int_{1}^{4}\int_{0}^{1}3\,dx\,dy = 9.\]",
+
+ "True. Note that \[\begin{split}\int_{0}^{1}\int_{0}^{1}f(x, y)\,dx\,dy &= \int_{0}^{1}\int_{0}^{1}f(x, 0)f(0, y)\,dx\,dy &= \int_{0}^{1}f(0,y)\left(\int_{0}^{1}f(x, 0)\,dx\right)\,dy &= \left(\int_{0}^{1}f(0, y)\,dy\right)\left(\int_{0}^{1}f(x, 0)\,dx\right)\end{split}.\] How is this identity related to the distributive property? (Hint: view the integrals as summations, and imagine ``distributing`` the product on the right-hand-side.)",
+
+ "False. For example, take \(g(x, y) = -xy(x - 2) + 1\) and \(f(x, y) = g(x, y)(-2x + 2)\). Note that \(g(x, y)\) is positive throughout the specified region. Then \[\int_{0}^{1}\int_{0}^{1}f(x, y)\,dx\,dy = \frac{5}{4} < \frac{4}{3} = \int_{0}^{1}\int_{0}^{1}g(x, y)\,dx\,dy.\] However, \[\int_{0}^{1}\int_{0}^{1}\frac{f(x, y)}{g(x, y)} = \int_{0}^{1}\int_{0}^{1}(-2x + 2)\,dx\,dy = 1.\]",
+
+ "True. A point with angle \(\pi\) and \(z = 0\) lies on the negative \(x\)-axis. Since \(r = 4\), the claim follows. ",
+);
+
+$solutions = "";
+foreach (@which) {
+ $solutions .= "$ITEM $solutions[$_]";
+}
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+\{ BeginList('OL',type=>'a') \}
+$solutions
+\{ EndList('OL') \}
+END_SOLUTION
+Context()->normalStrings;
+
+ENDDOCUMENT(); # This should be the last executable line in the problem.
diff --git a/Contrib/GeorgiaTech/Module4TrueFalse.pg b/Contrib/GeorgiaTech/Module4TrueFalse.pg
new file mode 100644
index 0000000000..d6860d6f85
--- /dev/null
+++ b/Contrib/GeorgiaTech/Module4TrueFalse.pg
@@ -0,0 +1,156 @@
+## DBsubject(Calculus - multivariable)
+
+## DBchapter(Vector calculus)
+
+## DBsection(Surface integrals of vector fields)
+
+## Institution(Georgia Institute of Technology)
+
+## Author(Gregory Mayer, Hunter Lehman, Seth Brunner)
+
+## Level(3)
+
+## MO(1)
+
+## Language(en)
+
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "unionLists.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+Context("Numeric");
+
+$num=random(1,2,1);
+$product="";
+$ans4='True';
+$expl="$BBOLD True.$EBOLD By definition, the curl of a vector field is a $BBOLD vector$EBOLD that measures the circulation density of the field. Its magnitude represents the field's circulation density, and it points in the direction perpendicular to the plane in which the field tends to circulate.";
+if($num==1)
+{
+ $product="\cdot";
+ $ans4='False';
+ $expl="$BBOLDFalse.$EBOLD By definition, the divergence of a vector field is a $BBOLDscalar$EBOLD that measures the flux density of the field. A positive divergence describes a vector field that tends to flow outwards, and a negative divergence describes a vector field that tends to flow inwards.";
+}
+else
+{
+ $product="\times";
+}
+
+
+TEXT(beginproblem(), $BR,$BBOLD, "True or False Exercise", $EBOLD, $BR,$BR);
+$showPartialCorrectAnswers = 0;
+
+
+
+@questions = (
+ "If \(\vec{F}(x,y)\) is a conservative vector field defined on all of \(\mathbb{R}^2\) and \(C\) is any closed curve in the plane parameterized by \(\vec{r}\), then \(\displaystyle\oint\limits_C\vec{F}\cdot\vec{dr}=0\).",
+ "If \(\vec{F}\) and \(\vec{G}\) are vector fields and \(\nabla\cdot\vec{F}=\nabla\cdot\vec{G}\), then \(\vec{F}=\vec{G}\).",
+ "The vector field \(\vec{F}\) is defined everywhere in a region \(R\) bounded by a surface \(S\). If \(\displaystyle\iint\limits_S\vec{F}\cdot\vec{dA}>0\), then \(\nabla\cdot\vec{F}>0\) somewhere in \(R\).",
+ "If \(\vec{F}\) is a vector field, then \(\nabla$product\vec{F}\) is a vector field.",
+ "If \(\vec{F}\) is a vector field defined everywhere in a region \(R\) bounded by a surface \(S\), then the Divergence Theorem implies that \(\displaystyle\vec{F}\cdot\vec{n}=\nabla\cdot\vec{F}\) over \(S\).",
+ "If \(R\) is a region in the \(xy\)-plane bounded by \(C\), and \(C\) is parameterized by \(\vec{r}\), then the area of \(R\) is equal to the integral \(\displaystyle\oint\limits_C\left\langle y^2,2xy+x\right\rangle\cdot\vec{dr}\)",
+ "If \(C\) represents the unit circle and is parameterized by \(\vec{r}\), and \(\hat{v}\) is any unit vector field, then \(\displaystyle\oint\limits_C\sin^2(x+y)\hat{v}\cdot\vec{dr}<7\).",
+);
+
+@corans = ('True', 'False', 'True', $ans4, 'False', 'True', 'True');
+
+# Choose Seven of the question and answer pairs at random.
+@which = NchooseK(7, 7);
+
+@squestions = @questions[@which];
+@scorans = @corans[@which];
+
+foreach my $i (0..6) {
+ $popup[$i] = PopUp(['Choose','True', 'False'],$scorans[$i]);
+}
+
+BEGIN_TEXT
+Indicate whether the following statements are true or false. Assume that all curves are oriented counterclockwise and all surfaces are oriented outwards.
+$PAR
+\{ BeginList('OL',type=>'a') \}
+
+$ITEM
+$squestions[0]
+$BR
+\{ $popup[0]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[1]
+$BR
+\{ $popup[1]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[2]
+$BR
+\{ $popup[2]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[3]
+$BR
+\{ $popup[3]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[4]
+$BR
+\{ $popup[4]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[5]
+$BR
+\{ $popup[5]->menu \}
+$ITEMSEP
+
+$ITEM
+$squestions[6]
+$BR
+\{ $popup[6]->menu \}
+$ITEMSEP
+
+\{ EndList('OL') \}
+
+END_TEXT
+
+install_problem_grader(~~&std_problem_grader);
+
+# Enter the correct answers to be checked against the answers to the students.
+
+foreach my $i (0..6) {
+ ANS($popup[$i]->cmp);
+}
+
+Context()->texStrings;
+
+@solutions = (
+ "$BBOLD True.$EBOLD The line integral of a conservative vector field depends only on the endpoints of the path. Since a closed curve starts and ends at the same point, the line integral around any closed curve is 0.",
+ "$BBOLD False.$EBOLD If \(\vec{F}=\vec{G}+\vec{H}\), where \(\nabla\cdot\vec{H}=0\), then \(\nabla\cdot\vec{F}\) will equal \(\nabla\cdot\vec{G}\), but the vectors themselves will not be equal. An example of a vector \(\vec{H}\) that satisfies this property would be \(\displaystyle\vec{H}=\left\langle1,1,1\right\rangle\).",
+ "$BBOLD True:$EBOLD By the divergence theorem, \(\displaystyle\iint\limits_S\vec{F}\cdot\vec{dA}=\iiint\limits_R\nabla\cdot\vec{F}dV\), so we can conclude that \(\displaystyle\iiint\limits_R\nabla\cdot\vec{F}dV>0\). Since this is a positive scalar integral, the integrand must be positive somewhere, so \(\nabla\cdot\vec{F}>0\) somewhere.",
+ $expl,
+ "$BBOLD False.$EBOLD The divergence theorem states that the $BBOLD integrals$EBOLD of these two quantities over \(S\) and \(R\) respectively are equal, but this does not mean that the integrands themselves are equal.",
+ "$BBOLD True.$EBOLD Denoting \(\vec{F}\) as \(\left\langle F_x,F_y\right\rangle\), Green's Theorem states that \(\displaystyle\oint\limits_C\vec{F}\cdot\vec{dr}=\iint\limits_R\left(\nabla\times\vec{F}\right)\cdot\hat{k}dA\). In this case, \(\left(\nabla\times\vec{F}\right)\cdot\hat{k}=1\), so we are left with the integral \(\displaystyle\iint\limits_RdA\), which represents the area of \(R\).",
+ "$BBOLD True.$EBOLD The given integrand is at most \(1\), since \(\sin^2(x+y)\) can never be greater than \(1\) and \(\hat{v}\) is a unit vector. Since the length of the curve is \(2\pi\) and the integrand is at most \(1\), the integral cannot be larger than \(2\pi\), meaning it is certainly smaller than \(7\).",
+);
+
+$solutions = "";
+foreach (@which) {
+ $solutions .= "$PAR $ITEM $solutions[$_]";
+}
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+\{ BeginList('OL',type=>'a') \}
+$solutions
+\{ EndList('OL') \}
+END_SOLUTION
+Context()->normalStrings;
+
+ENDDOCUMENT(); # This should be the last executable line in the problem.
diff --git a/Contrib/GeorgiaTech/OrthogonalTrueFalse.pg b/Contrib/GeorgiaTech/OrthogonalTrueFalse.pg
new file mode 100644
index 0000000000..545007ce87
--- /dev/null
+++ b/Contrib/GeorgiaTech/OrthogonalTrueFalse.pg
@@ -0,0 +1,180 @@
+##DESCRIPTION
+## Orthogonal sets, matrices, and projections
+##ENDDESCRIPTION
+
+
+## DBsubject(Linear algebra)
+## DBchapter(Inner products)
+## DBsection(Orthogonal and orthonormal sets)
+## Date(11/25/2024)
+## Institution(Georgia Institute of Technology)
+## Author(Seth Brunner)
+## Level(3)
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "PGgraders.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "unionLists.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+Context("Numeric");
+
+
+TEXT(beginproblem());
+
+###########################################
+# BEGIN: any randomization that pertains to the problem statements
+###########################################
+
+$q4Rand=random(1,5,1);
+$q4Num=Compute("$q4Rand/10");
+$q4Other=Compute("1-$q4Num");
+$q4Dot=Compute("$q4Num*$q4Other");
+$q4Sq1=Compute("$q4Num**2");
+$q4Sq2=Compute("(1-$q4Num)**2");
+$q4version=random(0,1,1);
+$q4="";
+$q4Ans="";
+$q4Sol="";
+
+if($q4version==0)
+{
+ $q4="orthogonal";
+ $q4Ans="True";
+ $q4Sol="We see that \(\vec x_1\cdot\vec x_2=$q4Dot-$q4Dot=0\), and so \(S\) is orthogonal. Since none of the vectors in \(S\) are zero, this implies that \(S\) is linearly independent.";
+}
+else
+{
+ $q4="orthonormal";
+ $q4Ans="False";
+ $q4Sol="While \(S\) $BITALIC is$EITALIC an orthogonal basis for \(\mathbb R^2\), it is not an orthonormal basis, since the length of \(\vec x_1\) and \(\vec x_2\) are both \(\displaystyle\sqrt{$q4Sq1+$q4Sq2}\neq1\).";
+}
+
+###########################################
+# END: any randomization that pertains to the problem statements
+###########################################
+
+
+###########################################
+# BEGIN: Question statements
+###########################################
+
+@questions = (
+ "If \(Q\) is a matrix with orthonormal columns, then \(\left(Q\vec x\right)\cdot\left(Q\vec y\right)=\vec x\cdot\vec y\).",
+ "If \(\{\vec x_1,\vec x_2\}\) is an orthogonal set of vectors in \(\mathbb R^n\), and \(y\in\mathbb{R}^n\), then \(y=\frac{\vec y\cdot\vec x_1}{\vec x_1\cdot\vec x_1}\vec x_1+\frac{\vec y\cdot\vec x_2}{\vec x_2\cdot\vec x_2}\vec x_2\).",
+ "If \(S=\{\vec x_1,\vec x_2,\ldots,\vec x_p\}\) is an orthogonal set of vectors, then \(S\) is linearly independent.",
+ "The set \(S=\left\{\begin{pmatrix}$q4Num\\$q4Other\end{pmatrix},\begin{pmatrix}-$q4Other\\$q4Num\end{pmatrix}\right\}\) is an $q4 basis for \(\mathbb{R}^2\).",
+ "If \(\vec x\) and \(\vec y\) are orthogonal, then \(\left\|\vec x-\vec y\right\|=\left\|\vec x+\vec y\right\|\)",
+ "If \(Q\) is a square matrix with orthonormal columns, then \(Q\) is invertible.",
+);
+$numQuestions=scalar(@questions);
+
+###########################################
+# END: Question statements
+###########################################
+
+
+###########################################
+# BEGIN: Written solutions.
+# Put all solutions in the same order as they are in the question statements.
+###########################################
+
+@solutions = (
+ "$BBOLD True.$EBOLD This is a property of matrices with orthonormal columns. To prove it, notice that \(\left(Q\vec x\right)\cdot\left(Q\vec y\right)=\vec x^TQ^TQ\vec y\). Since \(Q\) has orthonormal columns, \(Q^TQ=I\), and so \(\left(Q\vec x\right)\cdot\left(Q\vec y\right)=\vec x^T\vec y=\vec x\cdot\vec y\).",
+ "$BBOLD False.$EBOLD We are not told that \(S\) spans \(\mathbb R^n\). If \(\vec y\) is not in the span of \(S\), then the statement will be false, since we could never possibly write \(y\) as a linear combination of \(\vec x_1\) and \(\vec x_2\).",
+ "$BBOLD False.$EBOLD We need to add the condition that none of the vectors are zero; if one of the vectors are zero, then \(S\) will be an orthogonal set but will be linearly dependent.",
+ "$BBOLD $q4Ans.$EBOLD $q4Sol",
+ "$BBOLD True.$EBOLD We know that \(\left\|\vec x-\vec y\right\|^2=\left\|\vec x\right\|^2+\left\|\vec y\right\|^2\), and the same for \(\left\|\vec x+\vec y\right\|^2\). Thus, \(\left\|\vec x+\vec y\right\|^2=\left\|\vec x-\vec y\right\|^2\), and since both are positive, we can take the square root to obtain \(\left\|\vec x+\vec y\right\|=\left\|\vec x-\vec y\right\|\)",
+ "$BBOLD True.$EBOLD Since \(Q\) has orthonormal columns, its columns are linearly independent. The invertible matrix theorem tells us that any square matrix with linearly independent columns is invertible; thus, \(Q\) is invertible. In particular, since \(Q^TQ=I_n\), we see that \(Q^{-1}=Q^T\).",
+);
+
+###########################################
+# END: Written solutions
+###########################################
+
+
+###########################################
+# BEGIN: Correct answers
+# Put all answers in the same order as they were in the @questions array.
+###########################################
+
+@corans = ('True', 'False', 'False', $q4Ans, 'True', 'True');
+
+###########################################
+# END: Correct Answers
+###########################################
+
+
+
+#########################################
+#If you want the displayed questions to be a subset of the question bank given above, uncomment this line, and set the variable equal to the number of questions you would like to display.
+#########################################
+# $numQuestions=;
+
+
+$numQuestionsIndex = $numQuestions - 1;
+$bankSize = scalar(@questions);
+
+# Choose which questions to give the students, and shuffle the order.
+@which = NchooseK($bankSize, $numQuestions);
+
+@squestions = @questions[@which];
+@scorans = @corans[@which];
+
+foreach my $i (0..$numQuestionsIndex) {
+ $popup[$i] = PopUp(['?','True', 'False'], $scorans[$i]);
+}
+
+# Dynamically generate the question and answer text.
+$question_text = "Are the following statements true or false? $BR";
+$question_text .= $PAR;
+
+foreach my $i (0..$numQuestionsIndex) {
+ $ip1=$i+1;
+ $question_text .= $popup[$i]->menu;
+ $question_text .= " $BBOLD $ip1. $EBOLD" . $squestions[$i] . $BR . $BR ;
+}
+
+# Now use the dynamically generated text in the BEGIN_TEXT block.
+BEGIN_TEXT
+$question_text
+END_TEXT
+
+
+
+###############################################
+# Answer evaluation
+
+install_problem_grader(~~&std_problem_grader);
+
+$showPartialCorrectAnswers = 0;
+
+foreach my $i (0..$numQuestionsIndex) {
+ ANS($popup[$i]->cmp);
+}
+
+
+Context()->texStrings;
+
+$solutions = "";
+foreach (@which) {
+ $solutions .= "$PAR$ITEM $solutions[$_]";
+}
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+\{ BeginList('OL',type=>'1') \}
+$solutions
+\{ EndList('OL') \}
+END_SOLUTION
+Context()->normalStrings;
+
+ENDDOCUMENT(); # This should be the last executable line in the problem.
+
+
+
+ENDDOCUMENT();
diff --git a/Contrib/GeorgiaTech/OrthonormalVectors.pg b/Contrib/GeorgiaTech/OrthonormalVectors.pg
new file mode 100644
index 0000000000..45658dd31c
--- /dev/null
+++ b/Contrib/GeorgiaTech/OrthonormalVectors.pg
@@ -0,0 +1,187 @@
+##DESCRIPTION
+## Orthogonal sets, matrices, and projections
+##ENDDESCRIPTION
+
+
+## DBsubject(Linear algebra)
+## DBchapter(Inner products)
+## DBsection(Orthogonal and orthonormal sets)
+## Date(11/25/2024)
+## Institution(Georgia Institute of Technology)
+## Author(Seth Brunner)
+## Level(3)
+
+DOCUMENT();
+loadMacros(
+ "PGstandard.pl",
+ "PGgraders.pl",
+ "MathObjects.pl",
+ "PGchoicemacros.pl",
+ "matrixExtensions.pl",
+ "unionLists.pl",
+ "unionTables.pl",
+ "Alfredmacros.pl",
+ "parserPopUp.pl",
+ "PGcourse.pl",
+);
+
+
+TEXT(beginproblem());
+
+Context("Numeric");
+
+$v11=0;
+$v12=random(1,3,1);
+$v13=1;
+
+$v21=1;
+$v22=random(1,3,1);
+$x=Compute("-$v12*$v22");
+
+$v32=random(1,3,1);
+$z=Compute("-$v12*$v32");
+$y=Compute("-$v22*$v32-$z*$x");
+
+$s1=Compute("($v11)**2+($v12)**2+($v13)**2");
+$s2=Compute("($v21)**2+($v22)**2+($x)**2");
+$s3=Compute("($y)**2+($v32)**2+($z)**2");
+
+$c1=Compute("1/sqrt(($v11)**2+($v12)**2+($v13)**2)");
+$c2=Compute("1/sqrt(($v21)**2+($v22)**2+($x)**2)");
+$c3=Compute("1/sqrt(($y)**2+($v32)**2+($z)**2)");
+
+Context()->texStrings;
+
+BEGIN_TEXT
+
+The vectors \(\vec{v}_1\), \(\vec{v}_2\), and \(\vec{v}_3\) are given as follows, where each variable represents an unknown quantity. Determine the values for \(c_1\), \(c_2\), \(c_3\), \(x\), \(y\), and \(z\) that would make \(\left\lbrace\vec{v}_1,\vec v_2,\vec v_3\right\rbrace\) an $BBOLD orthonormal$EBOLD basis for \(\mathbb{R}^3\) ($BITALIC Hint: solve for \(x\), \(y\), and \(z\) before computing \(c_1\), \(c_2\), and \(c_3\)$EITALIC).
+
+
+$BR
+
+\[\vec v_1=c_1\begin{pmatrix}$v11\\$v12\\$v13\end{pmatrix}\quad\quad\vec v_2=c_2\begin{pmatrix}$v21\\$v22\\x\end{pmatrix}\quad\quad\vec v_3=c_3\begin{pmatrix}y\\$v32\\z\end{pmatrix}\]
+
+$BR
+$BR
+$BR
+
+
+\(c_1=\) \{ans_rule(30)\} \(\quad\quad c_2=\) \{ans_rule(30)\} \(\quad\quad c_3=\) \{ans_rule(30)\}
+
+
+$BR
+
+
+\(x=\) \{ans_rule(30)\} \(\quad\quad y=\) \{ans_rule(30)\} \(\quad\quad z=\) \{ans_rule(30)\}
+
+
+END_TEXT
+Context()->normalStrings;
+
+###############################################
+# BEGIN HINT
+###############################################
+
+BEGIN_HINT
+$PAR
+You can solve for \(x\), \(y\), and \(z\) by using the fact that each of the vectors is orthogonal to each of the other vectors. You can solve for \(c_1\), \(c_2\), and \(c_3\) by normalizing each of the vectors.
+$PAR
+Remember that two vectors are orthogonal if and only if \(\vec v_1\cdot\vec v_2=0\) (and the same for the other pairs of vectors). Also remember that, to normalize a vector, you should divide it by its length (where the length of a vector \(\vec v\) is given by \(\left\|\vec v\right\|=\sqrt{\vec v\cdot\vec v}\)).
+END_HINT
+
+###############################################
+# END HINT
+###############################################
+
+
+###############################################
+# BEGIN SOLUTION
+###############################################
+
+SOLUTION(EV3(<<'END_SOLUTION'));
+
+$BBOLD
+$PAR
+1. Computing \(x\), \(y\), and \(z\)
+$EBOLD
+
+$PAR
+We should always normalize our vectors last, since normalization introduces square roots that makes arithmetic harder. Because of this, we should start by finding values for \(x\), \(y\), and \(z\) that make the vectors orthogonal.
+
+$PAR
+Since \(\vec v_1\) must be orthogonal to \(\vec v_2\), we have that \(\vec v_1\cdot\vec v_2=0\). Computing this dot product gives us
+\[$v11($v21)+$v12($v22)+x=0\text ,\quad\text{so }x=$x\]
+
+$PAR
+Since \(\vec v_1\) must be orthogonal to \(\vec v_3\), we have that \(\vec v_1\cdot\vec v_3=0\). Computing this dot product gives us
+\[$v11(y)+$v12($v32)+z=0\text ,\quad\text{so }z=$z\]
+
+$PAR
+Since \(\vec v_2\) must be orthogonal to \(\vec v_3\), we have that \(\vec v_2\cdot\vec v_3=0\). Computing this dot product gives us
+\[$v21(y)+$v22($v32)+$x($z)=0\text ,\quad\text{so }y=$y\]
+
+
+$BBOLD
+$PAR
+2. Computing \(c_1\), \(c_2\), and \(c_3\)
+$EBOLD
+
+$PAR
+Now that we have \(x\), \(y\), and \(z\), we can normalize each of the vectors to obtain \(c_1\), \(c_2\), and \(c_3\). As a reminder, to normalize a vector, we divide it by its length.
+
+$BR
+
+$PAR
+The length of \(\vec v_1\) is \(\displaystyle\sqrt{($v11)^2+($v12)^2+($v13)^2}=\sqrt{$s1}\), and so \(\displaystyle c_1=\frac1{\sqrt{$s1}}\).
+
+$BR
+
+$PAR
+The length of \(\vec v_2\) is \(\displaystyle\sqrt{($v21)^2+($v22)^2+($x)^2}=\sqrt{$s2}\), and so \(\displaystyle c_2=\frac1{\sqrt{$s2}}\).
+
+$BR
+
+$PAR
+The length of \(\vec v_3\) is \(\displaystyle\sqrt{($y)^2+($v32)^2+($z)^2}=\sqrt{$s3}\), and so \(\displaystyle c_3=\frac1{\sqrt{$s3}}\).
+
+
+END_SOLUTION
+
+###############################################
+# END SOLUTION
+###############################################
+
+
+
+
+##################################################
+# Answers
+
+$showPartialCorrectAnswers = 0;
+
+ANS($c1->cmp());
+ANS($c2->cmp());
+ANS($c3->cmp());
+
+ANS($x->cmp());
+ANS($y->cmp());
+ANS($z->cmp());
+
+# ANS($La->cmp( checker=>~~&mycheck ));
+
+# ANS($integrand->cmp());
+# ANS($lowerlimit->cmp());
+# ANS($upperlimit->cmp());
+
+# ANS($integralvalue->cmp());
+
+
+
+
+
+
+
+
+
+
+ENDDOCUMENT();
diff --git a/Contrib/GeorgiaTech/README.md b/Contrib/GeorgiaTech/README.md
new file mode 100644
index 0000000000..88e68302fe
--- /dev/null
+++ b/Contrib/GeorgiaTech/README.md
@@ -0,0 +1,5 @@
+Georgia Tech Problem Authors:
+
+Seth Brunner; email sbrunner7@gatech.edu; GitHub: brunners23
+
+Greg Mayer; email greg.mayer@gatech.edu
diff --git a/Contrib/GeorgiaTech/thomas_15_1_33.pg b/Contrib/GeorgiaTech/thomas_15_1_33.pg
new file mode 100644
index 0000000000..2ba0033336
--- /dev/null
+++ b/Contrib/GeorgiaTech/thomas_15_1_33.pg
@@ -0,0 +1,105 @@
+##DESCRIPTION
+## Fubini's theorem on rectangles
+##ENDDESCRIPTION
+
+##KEYWORDS('Fubini', 'integration on rectangles', 'double integrals')
+
+## DBsubject(Calculus - multivariable)
+## DBchapter(Integration of multivariable functions)
+## DBsection(Double integrals over rectangles)
+## Level(3)
+## Date(7/17/2023)
+## Author(Hunter Lehmann)
+## Institution(Georgia Institute of Technology)
+## TitleText1(Thomas' Calculus: Early Transcendentals)
+## EditionText1(13)
+## AuthorText1('Hass, Heil, Weir, Bogacki')
+## Section1(15.1)
+## Problem1(33)
+## Language(en)
+
+########################################################################
+
+DOCUMENT();
+
+loadMacros(
+ "PGstandard.pl", # Standard macros for PG language
+ "MathObjects.pl",
+ "PGML.pl",
+ "PGcourse.pl", # Customization file for the course
+);
+
+# Print problem number and point value (weight) for the problem
+TEXT(beginproblem());
+
+# Show which answers are correct and which ones are incorrect
+$showPartialCorrectAnswers = 1;
+
+##############################################################
+#
+# Setup
+#
+#
+Context("Numeric");
+Context()->variables->add(y=>"Real");
+Context()->variables->add(dx=>"Real");
+Context()->flags->set(reduceConstants=>0);
+$a=random(1,5,1);
+do{
+$b=random(1,5,1);
+}while($a==$b);
+$c=non_zero_random(1,4,1);
+
+$f=Formula("x/($c+x*y)");
+
+$ab=$a*$b;
+$inner_const=$c+$ab;
+$value=($inner_const)/$b*ln($inner_const/$c)-$a;
+$ans=Compute("($inner_const)/$b*ln($inner_const/$c)-$a");
+
+##############################################################
+#
+# Text
+#
+#
+BEGIN_PGML
+Use Fubini's Theorem to evaluate the integral [``` \int_0^{[$b]} \int_0^{[$a]} [$f]\ dx\ dy. ```]
+
+First, set up an equivalent integral with the other order of integration:
+
+[``` \int_A^B \int_C^D [$f]\ dy\ dx ```]
+
+where
+
+A = [__]{Compute("0")}
+B = [__]{$a}
+C = [__]{Compute("0")}
+D = [__]{$b}.
+
+Now evaluate your new integral. _Hint: Use a substitution to evaluate the inner integral and a combination of substitution and integration by parts to evaluate the outer integral._
+
+The value of the integral is [________]{$ans}.
+END_PGML
+
+
+$f_int=Formula("ln($c+$b*x)")->reduce;
+$u_sub=Formula("$c+$b*x")->reduce;
+$frac1=Formula("($c+$a*$b)/$b")->reduce;
+$log_arg=Formula("($c+$a*$b)/$c")->reduce;
+$du=Formula("$b dx")->reduce;
+##############################################################
+#
+# Solution
+#
+#
+BEGIN_PGML_SOLUTION
+
+Applying Fubini's theorem, this integral is equivalent to [``` \int_0^{[$a]} \int_0^{[$b]} [$f]\ dy\ dx. ```]
+We make the substitution [`u=[$c]+xy, du=x dy`] to evaluate the inner integral. This gives the new integral [``` \int_0^{[$a]} [$f_int]-\ln([$c])\ dx.```]
+Now substitute [`u=[$u_sub], du=[$du]`] to evaluate the inner integral. Since [`\int \ln(u)\ du = u\ln(u)-u`], we have
+[``` \int_0^{[$b]} \int_0^{[$a]} [$f]\ dx\ dy = [$frac1]\ln([$log_arg])-[$a]```]
+
+END_PGML_SOLUTION
+
+
+ENDDOCUMENT();
diff --git a/Contrib/GeorgiaTech/thomas_15_3_avg_value.pg b/Contrib/GeorgiaTech/thomas_15_3_avg_value.pg
new file mode 100644
index 0000000000..1296c29e74
--- /dev/null
+++ b/Contrib/GeorgiaTech/thomas_15_3_avg_value.pg
@@ -0,0 +1,197 @@
+## DESCRIPTION
+## Multivariable Calculus -average value
+## ENDDESCRIPTION
+
+
+## DBsubject(Calculus - multivariable)
+## DBchapter(Integration of multivariable functions)
+## DBsection(Applications of double integrals)
+## Level(3)
+## Date('7/21/2023')
+## Author('Hunter Lehmann')
+## Institution('Georgia Institute of Technology')
+## TitleText1('Thomas' Calculus: Early Transcendentals')
+## EditionText1('13')
+## AuthorText1('Hass, Heil, Weir, Bogacki')
+## Section1('15.3')
+## Problem1('')
+## KEYWORDS('calculus','average value','iterated integral')
+
+########################################################################
+
+DOCUMENT();
+
+loadMacros(
+ 'PGstandard.pl',
+ 'PGML.pl',
+ 'parserMultiAnswer.pl',
+ 'PGcourse.pl'
+);
+
+Context()->variables->are(
+ x => 'Real',
+ dx => 'Real',
+ y => 'Real',
+ dy => 'Real'
+);
+Context()->flags->set(reduceConstants => 0);
+
+#parameter setup
+
+$a=random(2,5,1);
+$b=random(1,6,1);
+$c=random(1,15,1);
+
+#bounds
+$uby=Formula("$a-x/2");
+$ubx=Formula("2*$a-2y");
+
+# integrand and volume
+
+$f = Formula("$b x^2-y+$c");
+$area = Formula("$a^2");
+$value = Formula("2*$a^2*$b/3-$a/3+$c");
+
+# differentials and limits of integration
+# Case 0, element 0 of each array below, is if the order of integration is dx dy
+# Case 1, element 1 of each array below, is if the order of integration is dy dx
+# 'id' and 'od' stand for inner and outer differential
+
+@id = (Formula('dx'), Formula('dy')); # (case 0, case 1)
+@od = (Formula('dy'), Formula('dx')); # (case 0, case 1)
+
+# A = outer integral, lower limit
+# B = outer integral, upper limit
+# C = inner integral, lower limit
+# D = inner integral, upper limit
+
+@A = (Formula(0), Formula(0)); # (case 0, case 1)
+@B = (Formula($a), Formula("2*$a")); # (case 0, case 1)
+@C = (Formula(0), Formula(0)); # (case 0, case 1)
+@D = ($ubx, $uby); # (case 0, case 1)
+
+$multians = MultiAnswer($f, $id[0], $od[0], $A[0], $B[0], $C[0], $D[0])->with(
+ singleResult => 1,
+ checker => sub {
+ my ($correct, $student, $self) = @_;
+ my ($fstu, $idstu, $odstu, $Astu, $Bstu, $Cstu, $Dstu) =
+ @{$student};
+ if (
+ (
+ $f == $fstu
+ && $id[0] == $idstu
+ && $od[0] == $odstu
+ && $A[0] == $Astu
+ && $B[0] == $Bstu
+ && $C[0] == $Cstu
+ && $D[0] == $Dstu
+ )
+ || ($f == $fstu
+ && $id[1] == $idstu
+ && $od[1] == $odstu
+ && $A[1] == $Astu
+ && $B[1] == $Bstu
+ && $C[1] == $Cstu
+ && $D[1] == $Dstu)
+ )
+ {
+ return 1;
+ } elsif (
+ (
+ $f == $fstu
+ && $id[0] == $idstu
+ && $od[0] == $odstu
+ && ($A[0] != $Astu || $B[0] != $Bstu)
+ && $C[0] == $Cstu
+ && $D[0] == $Dstu
+ )
+ || ($f == $fstu
+ && $id[1] == $idstu
+ && $od[1] == $odstu
+ && ($A[1] != $Astu || $B[1] != $Bstu)
+ && $C[1] == $Cstu
+ && $D[1] == $Dstu)
+ || ($f == $fstu
+ && $id[0] == $idstu
+ && $od[0] == $odstu
+ && $A[0] == $Astu
+ && $B[0] == $Bstu
+ && ($C[0] != $Cstu || $D[0] != $Dstu))
+ || ($f == $fstu
+ && $id[1] == $idstu
+ && $od[1] == $odstu
+ && $A[1] == $Astu
+ && $B[1] == $Bstu
+ && ($C[1] != $Cstu || $D[1] != $Dstu))
+ )
+ {
+ $self->setMessage(1, 'Check your limits of integration.');
+ return 0.94;
+ } elsif (
+ (
+ $f == $fstu
+ && $id[0] == $idstu
+ && $od[0] == $odstu
+ && ($A[0] != $Astu || $B[0] != $Bstu)
+ && ($C[0] != $Cstu || $D[0] != $Dstu)
+ )
+ || ($f == $fstu
+ && $id[1] == $idstu
+ && $od[1] == $odstu
+ && ($A[1] != $Astu || $B[1] != $Bstu)
+ && ($C[1] != $Cstu || $D[1] != $Dstu))
+ )
+ {
+ $self->setMessage(1,
+ 'Check your limits of integration and order of integration.'
+ );
+ return 0.47;
+ } else {
+ return 0;
+ }
+ }
+);
+
+BEGIN_PGML
+Set up a double integral in rectangular coordinates for calculating the average value of the function [`f(x,y) = [$f]`] over the region bounded by the lines
+[`x=0, y=0,`] and [`y=[$a]-\dfrac{x}{2}`].
+
+_Instructions:_ Compute the area of the region and enter it in the first answer box.
+Enter the integrand in the second answer box . Depending
+on the order of integration you choose, enter _dx_ and _dy_ in either order into
+the third and fourth answer boxes with only one _dx_ or _dy_ in each box . Then,
+enter the limits of integration and evaluate the integral to find the average value.
+
+Area = [_]{$area}{10}
+
+Average value = [``\frac{1}{\text{area}}\int_A^B \int_C^D``] [_]{$multians}{10} [_]{$multians}{5} [_]{$multians}{5}, where
+
+A = [_]{$multians}{10}
+
+B = [_]{$multians}{10}
+
+C = [_]{$multians}{10}
+
+D = [_]{$multians}{10}
+
+Average value = [_]{$value}{10}
+END_PGML
+
+BEGIN_PGML_SOLUTION
+
+We give the solution with the integration order [`dx\ dy.`] The area of the triangular region of integration is [`\frac{1}{2}([$a])([@ $a*2@])=[@$a**2@]`].
+Thus the average value is
+
+>>[``\begin{aligned}
+ f_{avg} &= \frac{1}{[@$a**2@]} \int_0^{[$a]} \int_0^{[@2*$a@]-2y} [$f]\ dx\ dy \\
+ &= \frac{1}{[@$a**2@]} \int_0^{[$a]} \frac{[$b]([@2*$a@]-2y)^3}{3}-([@2*$a@]-2y)(y+[$c]) \ dy \\
+ &= \frac{1}{[@$a**2@]}\left( -\frac{[$b]([@2*$a@]-2y)^4}{24}-[$a]y^2+\frac{2}{3}y^3-[@ 2*$a*$c@]y+[$c]y^2\right) |_0^[$a] \\
+ &= [$value]\\
+ &= \frac{[@ 2*$a**2*$b-$a+3*$c @]}{3}
+ \end{aligned} ``]<<
+
+END_PGML_SOLUTION
+
+COMMENT('Allows integration in either order.');
+
+ENDDOCUMENT();
\ No newline at end of file